【PHP】Amazon SESでEメール送信

aws-sdk-phpを利用してAmazon SESからEメールを送信する方法のまとめです。

※aws-sdk-phpのセットアップは以下リンク参照
【AWS】S3へファイルアップロード(PHP)

公式の詳細はこちら
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-using-sdk-php.html

実装

名前空間の定義

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

処理

/**
 * Amazon SES Sendmail
 * @param string $subject
 * @param string $body
 * @param string $to
 * @param string $from_email
 * @param string $from_name = null
 * @return bool
 * @throw Exception
 */
public static function send(
    string $subject,
    string $body,
    string $to,
    string $from_email,
    string $from_name = null
) : bool {
    try{
        // ① 認証情報を取得
        $provider = CredentialProvider::defaultProvider();

        // ② SES Clientオブジェクト生成
        $client = new SesClient(array(
            'region'      => 'us-west-2',
            'version'     => '2010-12-01',
            'credentials' => $provider,
        ));

        // ③ 送信情報の配列
        $mail_info = array(
            'Destination' => array(
                'ToAddresses' => [$to],
            ),
            'ReplyToAddresses' => [$from_email],
            'Source' => self::get_source($from_email, $from_name),
            'Message' => array(
                'Body' => array(
                    'Text' => array(
                        'Charset' => 'UTF-8',
                        'Data' => $body,
                    ),
                ),
                'Subject' => array(
                    'Charset' => 'UTF-8',
                    'Data' => $subject,
                ),
            ),
        );

        // ④ Eメール送信実行
        $result = $client->sendEmail($mail_info);
        \Log::info("Message Id:{$result['MessageId']}")
    } catch(AwsException $e){
        \Log::error(__METHOD__.' ('.__LINE__.') - '.$e->getMessage());
        return false;
    }
    return true;
}

/**
 * From文字列生成
 * @param string $from_email
 * @param string $from_name
 * @return string
 */
private static function get_source($from_email, $from_name) : string {
    if (is_null($from_name)) {
        return $from_email;
    } else {
        return sprintf('"%s" <%s>', mb_encode_mimeheader($from_name), $from_email);
    }
}

① 認証情報を取得

CredentialProviderにより認証情報を取得する。詳しくは以下参照
【AWS】S3へファイルアップロード(PHP)

② SES Clientオブジェクト生成

生成した認証情報で、SES Clientオブジェクトを生成する。
なお、Amazon SESに東京リージョンは存在しない。

③ 送信する内容の配列生成

Destination.ToAddresses

送信先のメールアドレスを配列で指定

ReplyToAddresses

返信用のメールアドレスを配列で指定
※Amazon SESに登録されたアドレスかつ、ステータスがverifiedでないアドレスを指定した場合、エラーになる。確認方法は...
AmazonコンソールにログインSimple Email Service右上のプルダウンで該当リージョンを選択Email Address で確認できる。

Source

返信用のメールアドレスそのままでもいいが、名前がある場合は名前を設定可能
※get_source()関数を呼べばよしなに設定してくれる

Message.Body.Text.Data

メール本文を設定

Message.Subject.Data

メールタイトルを設定


④ メール送信実行

送信結果のmessageIdをログに残しておけば、CloudWatchで追跡できる。

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)