Skip to content
Caution: You are browsing the legacy symfony 1.x part of this website.

Eメールを送信する方法

Symfony version
Language

概要

メールの送信は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()メソッドの代わりにPartialHelperget_partial()get_component()関数を使うことが必要になります。

tip

アプリケーションの任意の場所でヘルパーをロードするには、次のコードを使うことができます:

sfProjectConfiguration::getActive()->loadHelpers("Partial", "Url", "MyHelper");

ドキュメントを入手する

SwiftMailerの公式サイトはドキュメントチュートリアルの金脈です。

This work is licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License license.