【初心者向け】Laravel PHP: Amazon SESを使ったSENDMAIL実装の手順

私たちはベトナムオフショア開発会社でAWS開発技術力とコスト対効果の高いシステム開発を提供しています。

はじめに

Amazon SES(Simple Email Service)は、信頼性が高くスケーラブルなメール送信サービスです。今回の記事では、Laravel PHP フレームワークを使用して、Amazon SES を利用した SENDMAIL の実装手順を初心者向けに紹介します。Amazon SES を使用することで、メールの信頼性向上やスパムメールのフィルタリングが可能となります。

手順

Amazon SESの設定

最初にAWS SESサービスを使用するためにはAWSアカウントが必要です。この記事ではアカウントの作成方法について下記のリンクをご参照ください。

https://beginaws.awsstudygroup.com/vi/1-account-setup/1-create-new-aws-account/

AWSアカウントを作成した後でAWSログインページにログインする。

 

リージョンを選択する。 注意:現在はAWS SESサービスを利用できるリージョンはN.Virginia 、Oregon、Irelandしかないです。

 

これから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イベントでメールが開く時にログへ吐き出せるようにする。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. }

Amazonから$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を向上させる手順とノウハウを紹介しました。この手順を通じて、プロジェクトのメールコミュニケーションに新たな可能性を開拓してください。

初めての方でもスムーズに実装できる手順となっていますので、ぜひお試しください。

 

無料相談・お問い合わせ
ご相談やお見積もりは全て 無料 で対応いたします。

    「個人情報保護方針」をお読みいただき同意いただける場合は「送信」ボタンを押して下さい。
    入力していただいたメールアドレス宛に自動返信メールを送信していますので、お手数ですがそちらをご確認ください。
    無料相談・お問い合わせ
    ご相談やお見積もりは全て 無料 で対応いたします。

      「個人情報保護方針」をお読みいただき同意いただける場合は「送信」ボタンを押して下さい。
      入力していただいたメールアドレス宛に自動返信メールを送信していますので、お手数ですがそちらをご確認ください。
      無料相談
      お問い合わせ