【初心者向け】Laravel PHP: Amazon SESを使ったメール配信実装の手順

私たちはベトナムオフショア開発会社で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を向上させる手順とノウハウを紹介しました。この手順を通じて、プロジェクトのメールコミュニケーションに新たな可能性を開拓してください。

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

 

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

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

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