【実践FuelPHP】FuelPHPでAWSのSESを使用する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

アクションに対してメールを送信したい...

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してください。 WS000000

ダウンロードしたファイルを、それぞれ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を使うという用途は今後増えている(既に増えてるとも言えます)。 今回はさくっとメール送信を行うという単機能に触れてみました。