2016年3月5日土曜日

Amazon SESを使ったLumen(Laravel)のメール送信

Lumen(5.1)では、Laravelのメール機能が標準では含まれていないので、追加して試してみました。

参考

https://laravel.com/docs/5.1/mail

追加するパッケージ

composer.jsonのrequireに以下のパッケージを追加してcomposer updateします。
 "illuminate/mail": "5.1.*",
 "aws/aws-sdk-php": "~3.0",

設定ファイルの追加

config/mail.phpとconfig/services.phpファイルの作成(デフォルト設定ファイルmail.phpをコピーする)
// configディレクトリが無い場合は作成する
cp vendor/laravel/lumen-framework/config/mail.php config/mail.php

// services.phpは空ファイルを作成して設定値を自分で記述した
touch config/services.php

config/mail.phpの修正

// デフォルト値をsesと書き換える。または環境変数MAIL_DRIVERを設定する
driver' => env('MAIL_DRIVER', 'ses'),

config/services.php

awsで作成した値を設定します。
<?php
return [
    'ses' => [
        'key'    => 'keyの値',
        'secret' => 'secretの値',
        'region' => 'リージョンの値',  // e.g. us-east-1
    ]
];

テンプレートの作成

// テンプレートファイルを作成
touch resource/views/emails/example.blade.php
テンプレートには、通常のviewと同様に変数を渡せます。

HTMLメールの送信

Mail::send('emails.example', ['user' => $user], function ($m) use ($user) {
    $m->from('hello@app.com', 'Your Application');
    $m->to('メールアドレス', '名前')->subject('テストメールの件名');
});

テキストメールの送信

// テンプレートの値を配列にしてキーをtext、値にテンプレートのパスを指定する
Mail::send(['text' => 'emails.example'], ['user' => $user], function ($m) use ($user) {
    $m->from('hello@app.com', 'Your Application');
    $m->to('メールアドレス', '名前')->subject('テストメールの件名');
 });

// 配列でhtmlメールを指定する場合
Mail::send(['html.view', 'text.view'], $data, $callback);

まとめ


Laravelのドキュメントを確認した限りでは、送信オプションもいろいろ網羅されているので細かい調整もできそうです。標準以上の機能が必要なケースはあまりないかもしれませんが、もっとカスタマイズが必要な場合は、コアのソースを確認して調査する必要がありそうです。
あと、Amazon SESはデフォルトで送信制限があるので、テスト用のメールアドレスはあらかじめSES側で設定とverify(メールアドレスの有効性の確認)しておく必要があります。制限解除済みであれば登録不要です。