前回は Swift Mailer バンドルを使ってユーザ登録時にメールを送信する機能を実装しました。ただし、このままだとローカルの WebMatrix 環境ではメールが送信されないので、今回は WebMatrix 環境でもメールを送信できるように変更します。
WebMatrix 環境下で実行された場合は、自分で指定した SMTP サーバを使用してメールを送信できるように作り変えます。といっても前回も参照した外部サイトの記事1 で、すでに紹介済みの方法をこのシリーズ向けに実装しなおしてみました。
というのも先方は Gmail の SMTP を使用していますが、我がサイトは「ロリポップ」で提供している SMTP を使います。シリーズ的にもロリポップの利用者前提になっていますので、この方法を採用したいと思います。
あと好みの問題として、bundles 以下に格納されたバンドルのパッケージセットは更新しないで実装したいと思います。
まずは、bundles.php の ‘swiftmailer’ の項目を変更します。
\'swiftmailer\' => array(\'auto\' => false),
次に config/local に mail.php を作成しました。内容は下記のとおりです。
<?php return array( \'smtp\' => \'smtp.lolipop.jp\', \'port\' => 465, \'auth\' => \'ssl\', \'username\' => \'ロリポップのSMTPログインID\', \'password\' => \'ロリポップのSMTPパスワード\', );
あとは、 routes.php と同じ階層にある、start.php の最下部に下記の内容を追加します。
Bundle::start(\'swiftmailer\'); if (Config::has(\'mail\')) { IoC::unregister(\'mailer.transport\'); IoC::register(\'mailer.transport\', function() { return Swift_SmtpTransport::newInstance(Config::get(\'mail.smtp\'),Config::get(\'mail.port\'),Config::get(\'mail.auth\')) ->setUsername(Config::get(\'mail.username\')) ->setPassword(Config::get(\'mail.password\')); }); }
ちなみに、 Swift Mailer のオートロードの設定は true のままでも動きますが、明示的に start.php でスタートさせるように変更したので false にしました。
オートロードが true の場合、 IoC::resolve(‘mailer’) をした段階で、バンドルの start.php が起動しますので、start.php や route.php でそのまま IoC::unregister(‘mailer.transport’) しても IoC::resolve(‘mailer’) のタイミングで上書き2されてしまいますので、start.php の最下部でバンドルのスタートを明示するようにしました。
本番環境下では、 SMTP を使用しなくても問題ないので、ローカル環境下にのみ存在する設定項目の有無で、現在の実行環境の判別をしました。そして、 IoC コンテナから ‘mailer.transport’ を解除し、 WebMatrix 環境上で使用したい設定で登録しなおしました。
以上で、 WebMatrix 環境下でもメールが飛ぶようになったと思います。
それでは今回はここまで。
- WinRoad徒然草:Laravelのswiftmailerでメール送信 [↩]
- 登録済みの例外なりが発生してもよさそうなものだが何故か発生しない [↩]