1.はじめに

AWSの提供するAmazon SES(Simple Email Service)はメール配信サービスであり

Laravelと組み合わせることで実用的にメールを送信することができます。

調べてみたところIAMユーザのクレデンシャルを利用して連携するという記事が多く

今回はクレデンシャルを利用せず連携する方法を紹介していきます。

2.概要

  • 構成はEC2 + SES
  • SES環境構築
  • IAMポリシーを設定
  • Laravelの設定および実装

3.SES環境構築

事前準備

  • 事前にドメインを取得(本記事ではiret-ses.jpをドメインとします)
  • Route 53にホストゾーンを作成

SES設定

・IDを作成

・ID作成後の画面

・SESでテストメールを送信してみる

まずSES側でメールが送信できないとLaravel側で上手く実装できてもメール送信することができないためテストメールを送信してみましょう。

※初期設定のままだとサンドボックスという設定が有効になっており、認証されたメールアドレスにしか送信できないため申請して解除するか送信先のメールアドレスを「認証済みメールアドレス」にしましょう。こちらはぜひ調べてみてください。

  1. From-addressのローカル部に任意の文字列を入力
  2. シナリオを「カスタム」に変更
  3. カスタム受信者に受け取りたいアドレスを入力
  4. 件名、本文に任意のものを入力
  5. 上記が設定できたら「テストEメールの送信」を押下

4.IAMポリシーを設定

・EC2のIAMロールに下記のようなポリシーを作成して紐づける

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Action": [
            "ses:SendEmail",
            "ses:SendRawEmail"
         ],
         "Resource": [
            "arn:aws:ses:リージョン:アカウントID:identity/*"
         ],
         "Effect": "Allow"
      }
   ]
}

5.Laravelの設定および実装

  1. aws-sdk-php-laravelをインストール
  2. env設定
  3. メール送信を実装

aws-sdk-php-laravelをインストール

▼ コマンドまたはcomposer.jsonに記述してライブラリをインストール(バージョンは任意)

・コマンドでインストール


composer require aws/aws-sdk-php-laravel:"3.9.0"

・composer.jsonに記述し、composer installまたはcomposer updateをコマンド実行

"require": {
   "aws/aws-sdk-php-laravel": "^3.9.0"
   etc...
}

env設定

・Laravelの環境変数ファイルの.envに下記のように記述

# メッセージを送信するために使用される既定のメーラーを制御(詳しくはconfig/mail.phpを参照)
MAIL_MAILER=ses
# 送信元のアドレスを設定
# ローカル部は任意の文字列
# ドメイン部はSESで設定したドメインを使用
MAIL_FROM_ADDRESS="test@iret-ses.jp"
# 任意の送信者名
MAIL_FROM_NAME="mail-send-test"

# わかりやすいように今回は空でいれてあります
# 変数を定義しているだけでも上手く動作しないということもあるようなので適宜調整してください
AWS_ACCESS_KEY=
AWS_SECRET_ACCESS_KEY=

メール送信を実装

Logicの作成


use App\Mail\MailSendTest;
use Illuminate\Support\Facades\Mail;

class MailSendLogic
{
   public function send() 
   { 
       $mail_address = '送信先のアドレス';
       Mail::to($mail_address)->send(new MailTest()); 
   }
}

・Mailableクラスの作成


namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class MailSendTest extends Mailable
{
    use Queueable, SerializesModels;

    public function build(): self
    {
        return $this
            ->subject('Laravel + SESテストメール')
            ->view('Email.mail_send_test')
    }
}

・resources/views/Email/mail_send_test.blade.phpを作成

メール本文

これはLaravel + SESで実装したテストメールです

あとはルーティングとMailSendLogicを呼び出すコントローラ作成(送信ボタンを用意)して実際に送信してみましょう。

6.さいごに

クレデンシャルを記述せずにIAMロールを利用してSESと連携できることは、

非常にセキュリティ的にも管理的にも良いと思い、今回ブログに書かせていただきました。

これはaws-sdk-php-laravelというライブラリのほんの一部であるはずなのでもっと学習していけたらと思います。