忍者ブログ

uthorofotus iruc

プログラムを組むために考えたり憶えたりした、いろいろなことを記録していきます。タイトルの読みは「ウソロフォトス イルーク」

[27]  [26]  [25]  [24]  [23]  [22]  [21]  [20]  [19]  [18]  [17

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

askeet day twelve:Emails の解説

askeetチュートリアルの12日目『Eメール』です。symfonyを使ってユーザにメールを送ります。

12日目チュートリアルの日本語版はありません。本家英語版はこちらです。

■これまでのsymfony(Previously on symfony)
12日目のチュートリアルでは、MVC構造の利点を生かしてEメールを送ります。

■パスワードの復帰(Password recovery)
ユーザがログインパスワードを忘れたとき用の仕組みを付けます。データベースにはパスワードがそのまま入っているわけではないので、ランダムなパスワードで登録し直してメールで送ります。

▽パスワード要求フォーム(Password request form)
Userモジュールに、メールアドレスを要求するフォーム表示アクションとテンプレートを追加します。パスワードが分からなくなるのは、ログインをしたい時になるでしょう。よって、ここへはログインフォームからアクセスできるようにします。レイアウトテンプレートとログインフォームテンプレートにリンクを追加します。リンクは、送信ボタンの下にでも置いておきましょう。

  <?php echo input_hidden_tag('referer', $sf_request->getAttribute('referer')) ?>
  <?php echo submit_tag('sign in') ?>
  <?php echo link_to('Forgot your password?', '@user_require_password') ?>

</form>

ログインフォームテンプレートにはform_errorヘルパー関数が使われていますので、Validationヘルパーの読み込みも追加しておきます。忘れずにルーティングルールも設定しておきます。

▽フォームのバリデーション(Password request form)
フォーム送信後のバリデーションルールを設定します。このバリデーションではメールフォームの入力必須(required)と、メールアドレスの書式になっているかチェックしています。バリデーションを通らなかった場合は、handleErrorPasswordRequestメソッドが呼び出させれますので、もう一度メールアドレス要求フォームを表示するようにします。

▽送信されたフォームの処理(Handling the request)
6日目でやったように、フォームの処理を行います。先ほど作った空のexecutePasswordRequestメソッドを書き換えます。

まずは入力されたメールアドレスと一致するユーザがいるか調べます。いなかったらバリデーションエラー時と同じ処理にします。ユーザがいたら、メールを送信するアクションを実行します。実行の際、sfActionから継承したsendEmailという特殊なメソッドを使います。これは、forwordメソッドのように他のアクションを実行しますが、実行後に元のアクションへ処理が戻ってきます。sendEmailメソッドは生のメールデータを返しますので、何かあったら確認できるようにそれをログに書き出しています。メールの送信が完了したら、完了用のページを表示します。アクション内でreturn 'MailSent';とすると、passwordRequestMailSent.phpテンプレートをビューに使用します。[アクション名][return指定].phpという形式です。
メールアドレスの入力

■Eメールを送る(Send an email)
▽Eメール送信アクション(Email sending action)
新たにmailモジュールを作成します。mail/actions/actions.class.phpにexecuteSendPasswordメソッドを追加し、indexメソッドは不要なので消します。executeSendPasswordメソッドではまずメースのヘッダなど(送信先、送信元、件名)を設定します。(html)メール内で画像を使用しますので、その画像をメールに埋め込む設定もします。addEmbeddedImageメソッドで埋め込む際、cidというidを振っています。これはメール本文を生成する際に使用するidになります。メール本文の生成は、普通のアクションと同じようにビューを使って行います。

sfMailはPHPMailerライブラリを使用するクラスです。sfMailクラスについての詳細ドキュメントを見てください。

 ▽メールテンプレート(Mail template)
executeSendPasswordメソッドは返し値が何もなかったので、mail/templetes/sendPasswordSuccess.php がビューになります。先ほどのメソッド内でメールに埋め込んだcidがイメージタグ内で使用されています。image_tagタグだと、メール埋め込みの画像を上手く指定出来ない(<img src="/images/cid:CID1.png"/>となる)ので、imgタグをそのまま書いています。

▽代わりのメールテンプレート(Alternate mail template)
もしsendPasswordSuccess.altbody.phpテンプレートが見つかったら、メールを受け取ったクライアントがhtmlメールを受信しない設定だった場合のテキストのみメール内容として使われます。

▽設定(Configuration)
sfMailクラスは mail/config/mailer.yml の設定をみています。ここでは、メール送信にはsendmail(ubuntuはpostfixだった)を使用し、開発環境ではメールを送信しないという設定になっています。また、このモジュールはユーザから直接アクセスされては困るので、mail/config/mailer.ymlで設定を加えます。is_internalによって、すべてのアクションは内部用、つまり外部からユーザのアクセスを許可しないという設定になります。

▽Test
自分のメールアドレスが入った新しいユーザをテストデータに入れます。キャッシュをクリアして、prod環境 http://askeet/password_request からアクセスします。

User:
  myname:
    nickname:   myname
    first_name: Taro
    last_name:  Yamada
    password:   qwer1234
    email:      myname@example.com(実際に自分に届くアドレス)

もし、メールが送信できないサーバでテストしているのであれば、dev環境 http://askeet/frontend_dev.php/password_request でテストしてください。デバッグツールバーのlogs&msgでメールの内容を見ることができます。デバッグツールバー上では、改行が消えてしまうので、htmlソースから見ると良いでしょう。
デバッグツールバーでのメール内容確認

■また明日(See you Tomorrow)
12日目では複雑な内容のEメールでも、MVC構造のおかげでヘッダ無しhtmlページと同じくらいの労力で送信することができました。13日目は質問にタグ(タグクラウドのタグ)をつけられるようにします。

PR

この記事にコメントする

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字

この記事へのトラックバック

この記事にトラックバックする:

askeet day thirteen: Tags の解説 HOME askeet day eleven:syndication feed の解説

プロフィール

HN:
flyfront
性別:
非公開
自己紹介:
PHPプログラマ。東京でsymfonyな仕事してます。

HNはflyfrontですが、
仕事関係ではr_koike名義を使ってる場合もあります。

Wassr

カレンダー

05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

最新コメント

[01/02 通りすがり]
[10/18 flyfront]

バーコード

アクセス解析

忍者ブログ [PR]
Template by repe