Asial Blog

Recruit! Asialで一緒に働きませんか?

symfonyのjpMailPlugin(メール送信プラグイン)の使い方のまとめ

カテゴリ :
バックエンド(プログラミング)
タグ :
Tech
symfony
プラグイン
皆さん、こんにちは。
この季節になると鼻がムズムズする季節外れの花粉症持ちの笹亀です。

symfonyでメールを送信する場合、sfMailクラスが標準で実装されていますが、
それだけですと、日本語でのメール送信する場合は非常に苦労します。
今回は、いろいろ試行錯誤しながらたどり着いたjpMailPluginの使い方について
自分のメモの意味も含めて、まとめてみたいと思います。

まずは、プラグインのインストール方法です。(いまさら必要ないかもしれませんがw
  1. symfony plugin-install http://develop.ddo.jp/symfony/jpMailPlugin-0.0.2.tgz

プラグインのインストールは、簡単ですねw

まずは基本的な使い方で、メールを送りたいアクションに日本語メールを送るような処理を加える方法です。
  1. public function executeRegist() {
  2. ----
  3. ----その他の処理
  4. ----
  5. //メールを送信する処理
  6.   mb_internal_encoding("UTF-8"); # UTF-8の場合
  7.   $mail = new jpMail();
  8.   $mail->setFrom($from); # From:
  9.   $mail->setSender($returnpath); # Return-Path:
  10.   $mail->addReplyTo($replyto);  # Reply-to:
  11.   $mail->setSubject('メール送信タイトルをセットする');
  12.   $mail->setBody('メールの本文をここにセットします');
  13.   $mail->addAddress($to); # To
  14.   $mail->addAddress($to1); # Toは複数のアドレスをセットできます
  15.   $mail->send();
  16. ----
  17. ----その他の処理
  18. ----
  19.  
  20. }
HTMLメールもこのプラグインで送信できます。
下記の例は、HTMLメールとテキストメールを同時に送信する方法です。
  1. mb_internal_encoding("UTF-8"); # UTF-8の場合
  2.   $mail = new jpMail();
  3.   $mail->setFrom($from); # From:
  4.   $mail->setSender($returnpath); # Return-Path:
  5.   $mail->addReplyTo($replyto);  # Reply-to:
  6.   $mail->setSubject('メール送信タイトルをセットする');
  7.   $mail->setContentType('text/html');
  8.   $mail->setBody('<h3>メールの本文をここにセットします</h3>');
  9.   $mail->setContentType('text/plain');
  10.   $mail->setAltBody('メールの本文をここにセットします');
  11.   $mail->addAddress($to); # To
  12.   $mail->send();


覚えておくと便利なメソッドと便利な使い方のご紹介です。

個人的に頻繁に使ったメソッドです。
  1. $mail->addCc($cc);
メールアドレスをセットすることで、CCとして送信できます

  1. $mail->addBcc($bcc);
メールアドレスをセットすることで、BCCとして送信できます

次に、テンプレートを本文として使用する方法もあります。
テンプレートを使用してメール送信するということはメール送信をそれぞれのアクション内で定義するのではなく、ひとつのアクションにまとめることで実装後の管理をしやすくすることができます。こちらは、おやぢ組さんのページで詳しく解説されておりますので、こちらを参照ください。
上記サイトに記載されている「flash変数を使用した制御」なども大変便利な使い方です。

メールのテンプレートもsetTemplateでテンプレートを指定することで、ひとつの箇所にまとめておくと、テンプレートの修正も容易に行えます。
下記のように、会員登録後のメール送信やその他のメール送信のテンプレートをまとめることで一括管理することができます。
  1. class memberActions extends sfActions {
  2.  
  3.   executeMemberRegist() {
  4.   ----
  5.   ----その他の処理
  6.   ----
  7.     //会員のオブジェクトをFlash変数にセットして、メール送信アクションを呼び出す
  8.     $this->setFlash('member', $this->member);
  9.     $raw_email = $this->getPresentationFor('mail', 'memberRegist', 'jpMail');
  10.   ----
  11.   ----その他の処理
  12.   ----
  13.   }
  14.  
  15.   executeMemberUnsub() {
  16.   ----
  17.   ----その他の処理
  18.   ----
  19.     //会員のオブジェクトをFlash変数にセットして、メール送信アクションを呼び出す
  20.    $this->setFlash('member', $this->member);
  21.     $raw_email = $this->getPresentationFor('mail', 'memberUnsub', 'jpMail');
  22.   ----
  23.   ----その他の処理
  24.   ----
  25.   }
  26. }

  1. class mailActions extends sfActions
  2. {
  3.  //会員登録の場合のメール処理
  4.   public function executememberRegist()
  5.   {
  6.     //メンバーオブジェクトを取得する
  7.     $member = $this->getFlash('member');
  8.     $this->forward404Unless($member);
  9.  
  10.     $this->member = $member;
  11.  
  12.     mb_internal_encoding('UTF-8');
  13.  
  14.     $mail = new jpMail();
  15.     $mail->setFrom($from);
  16.     $mail->setSender($replyto);
  17.     $mail->addReplyTo($returnpath);
  18.  
  19.     $mail->addAddress($member->getEmail());
  20.     $mail->setSubject($member_title);
  21.  
  22.     $this->mail = $mail;
  23.  
  24.     $this->setFlash('member', null);
  25.     //会員登録用のテンプレートを呼び出す
  26.     $this->setTemplate(’’<プロジェクトルート>/libs/mailtemplates/memberRegistSuccess.class.php');
  27.   }
  28.  
  29.  //会員退会の場合のメール処理
  30.   public function executememberUnsub()
  31.   {
  32.     //メンバーオブジェクトを取得する
  33.     $member = $this->getFlash('member');
  34.     $this->forward404Unless($member);
  35.  
  36.     $this->member = $member;
  37.  
  38.     mb_internal_encoding('UTF-8');
  39.  
  40.     $mail = new jpMail();
  41.     $mail->setFrom($from);
  42.     $mail->setSender($replyto);
  43.     $mail->addReplyTo($returnpath);
  44.  
  45.     $mail->addAddress($member->getEmail());
  46.     $mail->setSubject($member_title);
  47.  
  48.     $this->mail = $mail;
  49.  
  50.     $this->setFlash('member', null);
  51.     //退会用のテンプレートを呼び出す
  52.     $this->setTemplate(’’<プロジェクトルート>/libs/mailtemplates/memberUnsubSuccess.class.php');
  53.   }
  54. }

このようにjpMailPluginは便利な使い方がたくさんあります。
どのようなときでもそうですが、メールを送る処理などは実装後のメンテナンスのことを考えると、このようにまとめられる所はまとめておくのがベストでしょう。どの言語でも必ず1度はハマってしまうのがメール関連の問題です。symfonyでのメール送信の情報としてお役にたてれば幸いです。

最後に「jpMailPlugin」を使用する際に注意があります。
私がご紹介したプラグインを使用しているときにですが、「$mail->setSubject()」で日本語で長いタイトルをセットしてメールを送信をすると、下記のようにタイトル内に「¥n」が付加されてしまう問題が起こりました。
「メール送信テストテスト\nテストテスト」

プラグインの中身を見てデバックをしてみましたが、mb_encode_mimeheader部分でバグが起きているみたいです。
52行目の変換で「\n」を「'」でくくっています。これが悪さをしているみたいです。
  1. return mb_encode_mimeheader($value, $this->getCharset(), 'B', '\n');

このくくりを「"」のくくりに修正するとメールのタイトルのバグは解消できます。
  1. return mb_encode_mimeheader($value, $this->getCharset(), 'B', "\n");

ご使用の際には上記についてお気をつけ下さい。

※現在の最新バージョン0.0.3では、上記のバグについてご対応いただけております。
brtriver様、誠にありがとうございました。