私たちはベトナムオフショア開発会社でAWS開発技術力とコスト対効果の高いシステム開発を提供しています。AWS開発実績が多いですが、今回は初心者向けAWSメール配信開発を紹介します。
はじめに
最近AWSサービスを使用して開発者が多いですが、はじめて開発者もいますので、色々分からないことがありますが、本日簡単にメール配信するのため、開発方法を共有したいと思います。まずAmazon SES(Simple Email Service)は、信頼性が高くスケーラブルなメール送信サービスです。今回の記事では、Laravel PHP フレームワークを使用して、Amazon SES サービスを利用したメール配信の実装手順を初心者向けに紹介します。Amazon SES を使用することで、メールの信頼性向上やスパムメールのフィルタリングが可能となります。
手順
Amazon SESの設定
最初にAWS SESサービスを使用するためにはAWSアカウントが必要です。この記事ではAWSアカウントの作成方法について下記のリンクをご参照ください。
https://beginaws.awsstudygroup.com/vi/1-account-setup/1-create-new-aws-account/
AWSアカウントを作成した後でAWSサービスを使用するのため、AWSページのログインページにログインする。
リージョンを選択する。 ※注意:現在はAWS SESサービスを利用できるリージョンはN.Virginia 、Oregon、Irelandしかないです。最近、東京リジョン対応があり、SESサービスを利用いただけるようになりました。
これからSMTP Credentialを作成する必要があります。 下記の順番でメニューから選択する。
AWS SES Services → Account dashboard → Create SMTP credentials
その時にIAMユーザー作成画面が表示されます。
ユーザー名を入力して作成ボタンを押下とIAMユーザーを作成します。
SMTPユーザーとパスワードが表示されますので、その情報を大切に保管してください。
下記の画面でDownload Credentialsボタンも押下するとログイン情報を保存する。
AWS SES Services → Account dashboardへ遷移する。
ログイン情報を基づいてアプリケーションからメールへ接続できます。 ただし、メール誤送信防止のため、AWS SESのデフォルトはSandBoxにありますが、外にメールを送信できない。メール配信できるように解除する必要があります。
案①(本番稼働用):AWSへ依頼する。
案②(テスト用):メールドメインを追加して認証を行う。
下記の流れで選択していただければメール追加できます。
AWS SES Services → Verified Identities → Create Identity
下記の画面が表示されます。
認証したいメールアドレスを入力してCreate Identityを押下すると、一覧画面へ戻って認証中というステータスになります。
入力したメールアドレスへログインするとAmazonから下記の確認メールが届きます。
メールを開いて、認証リンクをクリックするとメール認証が完了となります。
下記のイメージサンプルを参照してください。
メール認証が完了したら、AWSで下記の画面が表示されます。
AWS SESでのVerified Identities画面からメール認証ステータスを確認できます。下記の画像をご参照ください。
テストのため、認証されたメールアドレスへは毎日200通まで送信できます。
Sandboxでの設定が完了すると、1日につき最大で5万通まで送信できるようになります。 設定した後でテストメールを送信してみます。
テンプレートとメッセージのカスタマイズ
下記の手順でテストメールを設定します。
①Formattedを選択する。
②Scenario枠でCustomを選択する。
③Custom Recipientテキストに認証したメールを入力する。
④Subjectテキストでテスト入力する。
⑤メール内容ボックスにテスト内容を入力する。
⑥SendMailボタンを押下するとメールを送信する。
下記の画面が表示されます。メール送信確認できました。
認証したメールへテストメールが届いたかどうか確認します。設定した配信先のメールを確認する。
SENDMAILの最適化
Laravel内でSENDMAILを最適化するための手法や、Amazon SESを使って送信する際の効果的なコーディングについて具体例を挙げながら解説します。
1. MAIL_DRIVER=smtp
2. MAIL_HOST=host
3. MAIL_PORT=587
4. MAIL_USERNAME=username
5. MAIL_PASSWORD=password
6. MAIL_ENCRYPTION=tls
7. MAIL_FROM_ADDRESS=email_verify
8. MAIL_FROM_NAME=from_name
routes/web.phpでルートを追加する。
Route::get(‘/test-sendmail’, ‘SendmailController@send’);
次はcontroller とSendを作成する。
1. php artisan make:controller SendmailController
1. <?php 2. 3. namespace App\Http\Controllers\Frontend; 4. 5. use App\Http\Controllers\Controller; 6. use Illuminate\Http\Request; 7. 8. class SendmailController extends Controller 9. { 10. public function send() { 11. $subject = "Test sendmail Laravel"; 12. $email = "tronghao@gmail.com"; 13. $mailer['from'] = env('MAIL_FROM_ADDRESS'); 14. \Mail::raw('Test content', function($message) use ($email, $subject, $mailer) { 15. $message->from($mailer['from']); 16. $message->to($email)->subject($subject); 17. }); 18. 19. echo "Send mail successfull"; 20. } 21. }
次はコマンドphp artisan serveを実行してserveを起動します。ブラウザ経由で127.0.0.1:8000/test-sendmailへアクセスします。
メールボックスでLavarelで送信したメールは下記のメールが届いてます。
この方法で、Amazon SESサービスを使用してLaravelでメールを送信できるようになりました。ただし、大量のメールを送信する際には、処理待ち時間を短縮するためにメールをキューに入れる必要があります。
メールトラキング
メール配信後トラキングのため、Configuration setsを作成する必要があります。下記の画面にて作成方法をご参照ください。
AWS SES Services → Configuration sets → Create set
①configuration setを選択
②Create setボタンを押下する
作成が完了したら下記の画面が表示されます。
作成したconfiguration setをクリックすると下記の画面が表示されます。Event destinationsタブをクリックしてAdd destinationボタンを押下する。
下記の画面でOpenをチェックしてNextを選択する。
次の画面が表示されます。
①Amazon SNSを選択する。
②名前を入力する。
③Create SNS topicボタンをクリックする。
作成が完了したら⑤に選択する。
次の画面は表示されてAdd destinationを選択する。
SNS service (Simple Notification Service)へ遷移して検索ボックスで作成してTopicsを入力して検索する。
Create subscriptionをクリックする。
作成画面が表示される。
①セキュリティーのため、HTTPSを選択する。
②AmazonサービスでのEndpoint を利用します。メールを開く時にそのイベントをトリガーする。
③Create subscriptionをクリックする。
作成したsubscriptionは認証中というステータスです。
メールトラキング処理で下記のソースコードを追加してください。
1. /**
2. * Tracking mail open from response SNS
3. */
4. public function trackingMailOpen(Request $request)
5. {
6. try {
7. $data = $request->json()->all();
8. if ($request->json('Type') == 'SubscriptionConfirmation') {
9. Log::info($data);
10. }
11. }
12. catch (\Exception $e) {
13. return $this->jsonCatchException($e->getMessage());
14. }
15. }
Confirm subscriptionイベントでメールが開く時にログへ吐き出せるようにする。PHP Laravelでの配下フォルダはstorage/logsへ保存します。
Responseは下記のフォマットとなります。
1. array (
2. 'Type' => 'SubscriptionConfirmation',
3. 'MessageId' => 'xxx',
4. 'Token' => 'xxx',
5. 'TopicArn' => 'xxx',
6. 'Message' => 'xxx',
7. 'SubscribeURL' => 'xxx',
8. 'Timestamp' => '2022-11-17T16:01:23.001Z',
9. 'SignatureVersion' => '1',
10. 'Signature' => 'xxx',
11. 'SigningCertURL' => 'https://xxx',
12. )
Confirm subscriptionを選択してSubscribeURLを入力する。
入力した後でConfirm subscriptionボタンを押下する。
その時に、作成したメールトラキングは確認状態になります。
ここまでメールを開く時にAmazonは設定したEndpointへ情報を送信します。
1. /**
2. * Tracking mail open from response SNS
3. */
4. public function trackingMailOpen(Request $request)
5. {
6. try {
7. $data = $request->json()->all();
8. if ($request->json('Type') == 'SubscriptionConfirmation') {
9. Log::info($data);
10. }
11.
12. if ($request->json('Type') == 'Notification') {
13. $message = $request->json('Message');
14. $message = json_decode($message, true);
15.
16. switch (isset($message['eventType']) ? $message['eventType'] : null) {
17. case 'Open':
18. // handle tracking open mail here
19. break;
20. default:
21. // Do Nothing
22. break;
23. }
24. }
25. }
26. catch (\Exception $e) {
27. return $this->jsonCatchException($e->getMessage());
28. }
29. }
AWSから$messageを返しますのでその内容はemail, userAgent, ipAddress, timestamp,…などがあります。詳細に関してやった時に確認してください。
\Mail::raw('Test content', function($message) use ($email, $subject, $mailer) {
$message->getHeaders()->addTextHeader('X-SES-CONFIGURATION-SET', 'SendEmail');
$message->from($mailer['from']);
$message->to($email)->subject($subject);
});
まとめ
今回詳細したPHP LaravelとAmazon SESの組み合わせを活かしてSENDMAILを向上させる手順とノウハウを紹介しました。この手順を通じて、プロジェクトのメールコミュニケーションに新たな可能性を開拓してください。
初めての方でもスムーズに実装できる手順となっていますので、ぜひお試しください。