【実践FuelPHP】FuelPHPでAWSのSESを使用する
アクションに対してメールを送信したい...
FuelPHPで処理に対する確認や通知をメールで送りたくなることは多々あるはず。 FuelPHPには便利なEmailパッケージが用意されているけど、サーバ側で送信するとそこそこの手間と管理が必要となる。 ので・・・せっかくなのでAmazonのSES(Amazon Simple Email Service)を使って送信することにします。
Emailパッケージをロードする
SESを使わなくても、FuelPHPにはデフォルトでEmailパッケージが用意されています。 これをロードすることで割と簡単にEmailを送信することはできます。 /fuel/app/config/config.php の下記箇所に以下のものを追加してください。
/**************************************************************************/ /* Always Load */ /**************************************************************************/ 'always_load' => array( 'packages' => array( 'email', ), ),
また、/fuel/packages/email/config/email.phpのファイルを、/fuel/app/config/にコピーしてください。 今回は、このEmailパッケージを拡張して利用します。
fuel-amazon-sesを導入する
PHPからAWS関係のサービスを使用する場合、AWS SDK for PHPを導入する方法が一般的ではありますが、せっかくFuelPHPを利用しているし、FuelPHP内に不要なソースを出来るだけ持ちたくないので、ここでは有志によるパッケージ化してくれている「fuel-amazon-ses」を使用します。
fuel-amazon-sesはこちらのサイトから入手します。GitHubなので最新版をPullしてください。
ダウンロードしたファイルを、それぞれfuelphpへとマージしていきます。 基本的には展開したファイルとfuelphpのファイルが対になっていますが、emailパッケージを拡張する関係上、ファイルの一部を修正する必要があります。
展開されたファイルを書きフォルダに合わせてコピーします。同じファイルを2箇所に設置しますが、片方はバックアップ目的です。不要ならばコピーしなくても平気です。
/classes/email/driver/ses.php → fuel/packages/email/classes/email/driver/ses.php /config/ses.php → fuel/packages/email/config/ses.php (こっちはバックアップ用) /config/ses.php → fuel/app/config/ses.php (実際にはこっちを編集します)
次に、/fuel/packages/email/bootstrap.php のファイルにadd_classesのarrayの中に下記一行を追加します。
Autoloader::add_classes( array( /** * Email classes. */ ~~略~~ 'Email\\Email_Driver_Noop' = __DIR__.'/classes/email/driver/noop.php', 'Email\\Email_Driver_Ses'= __DIR__.'/classes/email/driver/ses.php', /** * Email exceptions. */
次に、 fuel/app/config/ses.phpにコピーした設定ファイルを修正します。
return array( 'access_key' => 'EC2のアクセスキー', 'secret_key' => 'EC2のシークレットキー', 'region' => 'us-east-1', );
現在は、リージョンがus-east-1しか無いため、これをそのまま利用します。(EC2のリージョンではないので気をつけてください)
これで、SESを使用する事前準備が終了しました。
プログラムからメールを送信する
プログラムからメールを送る際は、FuelPHPからメールを送るものと全く変わらない記述ができます。
$email = \Email::forge('jis'); $email->from('送信元アドレス', '送信者名'); $email->to('送信先アドレス'); $email->subject('件名'); $body = '本文'; $email->body(mb_convert_encoding($body, 'jis')); try { $email->send(); } catch (\EmailValidationFailedException $e) { $err = '失敗'; } catch (\EmailSendingFailedException $e) { $err = '失敗'; }
最後に
メールを送る際にSNSを使うという用途は今後増えている(既に増えてるとも言えます)。 今回はさくっとメール送信を行うという単機能に触れてみました。