PHP

[PHP] AmazonSESを使ってメール送信する

Laravelを使用しないPHPのプロジェクトでAmazonSESを使ってメール送信するケースがありました。
Laravelだと割と簡単に出来るのですが、通常のPHPプロジェクトで使用する場合はAWS SDK for PHPを使用する必要があります。
また本件は開発用アカウントを使用しての説明となり、実際はロールをEC2などに付与するのが一般的となります。

0. 準備

まずは開発用のAWSカウントを作成し、アクセスキーIDとシークレットアクセスキーを取得してください。
そしてそのAWSに以下のポリシーを付与します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ses:SendEmail",
      "Resource": "*"
    }
  ]
}

また次にSESのプロフィールを記述した設定ファイルを作成します。

[default]
aws_access_key_id=[アクセスキーID]
aws_secret_access_key=[シークレットアクセスキー]

このファイルをプロジェクト内の外部からアクセス出来ないところに保存してください。

1. AWS SDK for PHPのインストール

Composerを使用してAWS SDK for PHPをインストールします。

composer require aws/aws-sdk-php

2. メール送信の実装

以下のようなコードでメール送信が可能です。

<?php
require "vendor/autoload.php";

use Aws\Credentials\CredentialProvider;
use Aws\Ses\SesClient;
use Aws\Exception\AwsException;

// iniファイルで設定した[]のテキストを設定
$profile = "default";

// ini指定
$path =  {aws_credential.iniのパス};

// iniファイルでの認証するための処理
$provider = CredentialProvider::ini($profile, $path);
$provider = CredentialProvider::memoize($provider);

// AWS SES クライアントの作成
$sesClient = new SesClient([
    "version" => "latest",
    "region" => "us-west-2",
    "credentials" => provider,
]);

// 送信元メールアドレス
$fromMailAddress = "";

// 送信先メールアドレス(複数指定可能)
$toMailAddressList = [
    "",
];

// 件名
$subject = "テストメール";

// 本文
$body = "テストメールです。";


try {
    // 送信先メールアドレス
    $result = $sesClient->sendEmail([
        "Destination" => [
            "ToAddresses" => $toMailAddressList,
        ],
        "ReplyToAddresses" => [$fromMailAddress],
        "Source" => $fromMailAddress,
        "Message" => [
            "Body" => [
                "Html" => [
                    "Charset" => "UTF-8",
                    "Data" => $body,
                ],
                "Text" => [
                    "Charset" => "UTF-8",
                    "Data" => $body,
                ],
            ],
            "Subject" => [
                "Charset" => "UTF-8",
                "Data" => $subject,
            ],
        ],
    ]);

    // メッセージIDを取得
    $messageId = $result["MessageId"];

    echo "Email sent! Message ID: $messageId" . PHP_EOL;
} catch (AwsException $e) {
    // エラー処理
    echo $e->getMessage() . PHP_EOL;
} catch (\Exception $e) {
    // エラー処理
    echo $e->getMessage() . PHP_EOL;
}

これでメール送信が可能となります。
SESは設定時はサウンドボックスになっており、指定されたメールアドレス以外で送るとエラーとなりますので注意してください。