概要
メールの送信はWeb開発者の日常のタスクです。 symfony 1.2ではSwift Mailerを利用してこのタスクを簡単にできます。
Swift Mailerはメールに関するあなたのニーズを120%カバーするよく考えられたフル機能のPHP 5オブジェクトライブラリです。
タグづけされたSVNリポジトリで利用可能で、ライブラリは更新されるので、あなたのプロジェクトが壊れることはありません。 新しいバージョンに切り替えるかはあなたしだいです(訳注:Swift Mailer 4のライセンスがGPL 3に変更されたという誤解がありましたがLGPLのままです)。
symfonyプロジェクトからメールを送信する方法はとてもシンプルです。 Eメールの内容をレンダリングするパーシャルもしくはコンポーネントを作り、柔軟な方法で送信するためにSwiftを利用します。
インストール方法
既にあなたのプロジェクトがSVNを利用しているのであれば、svn:externals
プロパティを使ってインストールできます:
$ cd /path/to/symfony/project $ mkdir -p lib/vendor $ cd lib/vendor $ svn propedit svn:externals .
次の行を追加します:
swift http://swiftmailer.svn.sourceforge.net/svnroot/swiftmailer/tags/php5/3.3.3/lib/
そして実行します:
$ svn update
あなたのプロジェクトがSVNを利用していない場合、タグをチェックアウトしてSuversionの作業コピーを入手できます。
$ cd /path/to/symfony/project $ mkdir -p lib/vendor $ cd lib/vendor $ svn checkout http://swiftmailer.svn.sourceforge.net/svnroot/swiftmailer/tags/php5/3.3.3/lib/ swift
クラスのオートローディング機能のキャッシュをクリアし、インストール作業は終了です。
設定
メール固有の設定はありません。
プロジェクトを柔軟に保つためには、決め打ちされたEメールアドレスを維持するためにapp.yml
設定ファイルを使います。
この方法では、環境に対応して異なる送信者/受信者のアドレスを持つことができます。
また変更することが必要になる場合、プロジェクトのすべてのコードを掘り起こす必要はありません。
変更する場所はとても明快です。
Eメールをレンダリングする
symfony 1.1 RC2に関しては、アクションからレンダリングされたパーシャルもしくはコンポーネントを簡単に取得できます:
$mailBody = $this->getPartial('mailBody', array('name' => 'John Doe'));
もしくは
$mailBody = $this->getComponent('mail', 'mailBody', array('name' => 'John Doe'));
HTML Eメールを送信する
Swiftを利用して次のようにメールを送信します:
try { // メーラーとメッセージオブジェクトを作る $mailer = new Swift(new Swift_Connection_NativeMail()); $message = new Swift_Message('Mail\'s subject', $mailBody, 'text/html'); // 送信する $mailer->send($message, $mailTo, $mailFrom); $mailer->disconnect(); } catch (Exception $e) { $mailer->disconnect(); // ここでエラーを扱う }
マルチパート対応のEメールを送信する
Eメールクライアントの中にはHTMLメールをまったく利用できないものがあります。 その場合はHTMLとプレーンテキストの両方でメールを提供するとよいでしょう。
try { // メーラーとメッセージオブジェクトを作る $mailer = new Swift(new Swift_Connection_NativeMail()); $message = new Swift_Message('Test mail subject'); // メッセージ部分をレンダリングする $mailContext = array('name' => 'John Doe'); $message->attach(new Swift_Message_Part($this->getPartial('mail/mailHtmlBody', $mailContext), 'text/html')); $message->attach(new Swift_Message_Part($this->getPartial('mail/mailTextBody', $mailContext), 'text/plain')); // 送信する $mailer->send($message, $mailTo, $mailFrom); $mailer->disconnect(); } catch (Exception $e) { $mailer->disconnect(); // エラーを扱う }
異なる接続設定を利用する
Swiftオブジェクトを作るとき、異なるSwift_Connectionオブジェクトを利用できます。
Swift_Connection_NativeMailはPHPネイティブの
mail()
関数を利用する接続ドライバーです。Swift_Connection_SMTPはSMTPサーバーを利用してメールを送信します。コンストラクターは3つのパラメーターを受け取ります。これらのパラメーターすべてがオプションです:
public function __construct($server="localhost", $port=null, $encryption=null)
セキュアなGmailのSMTPを利用する方法をすぐ後で見ることになります。
Swift_Connection_Sendmailはメールを送信するためにsendmailバイナリを使用します。コンストラクターでパスを指定できます。
Swift_Connection_Multiは複数の接続ドライバーを結びつけるために使用できる最初の特別なドライバーです。 これはリクエスト時にSMTPサーバーが利用できないイベントに冗長性を提供します。 コンストラクターは
Swift_Connection
オブジェクトインスタンスの配列を受け取り、 他のSwift_Connection_Multi
インスタンスを埋め込むこともできます(このように行う利点が少し不明瞭な場合でも)Swift_Connection_Rotatorは最後のパラメーターで、ダウンしてるサーバーを追跡することで
Swift_Connection_Multi
よりも少し多くのことをこなし、"活動している"サーバーのローテーションを管理します。使い方の説明はcookbookレシピの範囲を超えるので、Swift Mailerのドキュメントを参照してください。
Google MailのSMTPサーバーを利用する
Gmailアカウントを使いたいのはなぜでしょうか?
- SMTPサーバーの用意と維持をする必要がない
- hotmailユーザー(もしくは類似サービス)のスパムとしてマークされません
- Gmailアカウントの
Sent Mails
のCC(Carbon Copy)を取得できるのでデバッグしやすい
制限は?
- Gmailのアカウントが必要
- SSLを通したSMTPネゴシエーションはプレーンなSMTPネゴシエーションよりも長い
- 任意のEメールアドレスからEメールを送信できません(Gmailの設定/アカウントで新しい送信者の名前を追加できます)
Swiftのオブジェクトを設定する方法は次のとおりです:
$connection = new Swift_Connection_SMTP('smtp.gmail.com', 465, Swift_Connection_SMTP::ENC_SSL); $connection->setUsername('romain@gmail.com'); $connection->setPassword('SuperSecurePassword'); $mailer = new Swift($connection);
埋め込み画像
メールに画像を埋め込むには、内容をレンダリングするために、埋め込みオブジェクトからメールに依存するURLを取得する必要があります。これを行う方法の例は次の通りです。
// メーラーとメッセージオブジェクトを作成する $mailer = new Swift(new Swift_Connection_NativeMail()); $message = new Swift_Message('Test mail subject'); // インラインの画像 $images = array(); $images['symfony'] = new Swift_Message_Image(new Swift_File(sfConfig::get('sf_web_dir').'/legacy/images/symfony.gif')); $images['swift'] = new Swift_Message_Image(new Swift_File(sfConfig::get('sf_web_dir').'/legacy/images/swift.jpg')); $imageReferences = array(); foreach ($images as $name => $image) { $imageReferences[$name] = $message->attach($image); } // メッセージ部分をレンダリングする $mailContext = array('name' => 'John Doe', 'images' => $imageReferences); $message->attach(new Swift_Message_Part($this->getPartial('mail/mailHtmlBody', $mailContext), 'text/html')); $message->attach(new Swift_Message_Part($this->getPartial('mail/mailTextBody', $mailContext), 'text/plain')); // 送信する $mailer->send($message, $mailTo, $mailFrom); $mailer->disconnect();
これで次のように、コンポーネント/パーシャルテンプレートでこれらの添付写真を簡単に表示できます:
<img src="<?php echo $images['symfony']; ?>" alt="Symfony Project" /> <img src="<?php echo $images['swift']; ?>" alt="Swift Mailer" />
簡単でしたね?
添付
あなたの期待通り、メールにドキュメントを添付するのもシンプルです:
$message->attach(new Swift_Message_Attachment(new Swift_File($file), $filename, $mime_type));
受信者のリスト
メール用に複数の受信者もしくはCCを利用したい場合がよくあります。これはSwift_RecipientList
クラスを利用して行われます。
$recipients = new Swift_RecipientList(); $recipients->addTo($to); $recipients->addCc($cc); $recipients->addBcc($bcc);
ループでEメールを送信する場合、$recipientsリストを->flush()
することをお忘れなく。
さもなければ、なぜ誰かが同じメーリングリストの500ものコピーを受け取ったのか説明しなければならないばつのわるい思いをすることになります。
タスクからEメールを送信する
やり方はアクションとまったく同じですが、1つだけ小さな違いがあります: sfAction
のメソッドを使うことはできません。
sfAction::getPartial()
メソッドとsfAction::getComponent()
メソッドの代わりにPartialHelper
のget_partial()
とget_component()
関数を使うことが必要になります。
tip
アプリケーションの任意の場所でヘルパーをロードするには、次のコードを使うことができます:
sfProjectConfiguration::getActive()->loadHelpers("Partial", "Url", "MyHelper");
ドキュメントを入手する
This work is licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License license.