uthorofotus iruc
プログラムを組むために考えたり憶えたりした、いろいろなことを記録していきます。タイトルの読みは「ウソロフォトス イルーク」
[27] [26] [25] [24] [23] [22] [21] [20] [19] [18] [17]
[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
askeet day twelve:Emails の解説
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日目は質問にタグ(タグクラウドのタグ)をつけられるようにします。
この記事にコメントする
← askeet day thirteen: Tags の解説 HOME askeet day eleven:syndication feed の解説 →
プロフィール
Wassr
カレンダー
12 | 2025/01 | 02 |
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 | 31 |
最新記事
アクセス解析