LoginSignup
3
5

More than 3 years have passed since last update.

【AWS】AWS SDK for PHPを使ってSESでメールを送信する

Posted at

はじめに

PHPでSESを使ってメールを送信したいが、ちょっとAWSの認証まわりが面倒くさかったり、
検索しても以前の情報とかがヒットしたりするので書いておきます。
認証まわりは色々やり方がありますが、AWS認証情報用のiniファイルを作成して実行する方法です。

送信用のポリシーを作成する

SES送信用のポリシーを作成してください。

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

SES認証用のユーザーを作成して、iniファイルを作成する

AWSのIAMでSES認証用のユーザーを作成してください。
ポリシーは上で作ったやつ。
作成すると、「Access key ID」、「Secret access key」が表示されるので、それを元に以下のiniファイルを作成してください。

aws_credential.ini
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXX

composer

composerでAWS SDKを取得してください。
requireに「"aws/aws-sdk-php": "3.*"」を追加して、composer updateする。

PHP

aws_ses.php
include_once dirname(__DIR__) . '/vendor/autoload.php';
use Aws\Credentials\CredentialProvider;
use Aws\Ses\SesClient;
use Aws\Exception\AwsException;

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

// ini指定
$path =  dirname(__DIR__) . '/aws_credential.ini';

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

// SES用オブジェクト生成
$client = new Aws\Ses\SesClient([
    'region' => 'us-east-1', // SESを設定しているリージョン
    'version' => '2010-12-01',
    'credentials' => $provider
]);

// 送信元メールアドレス
$from_mail = 'no-reply@test.com'; // SESで設定したメールアドレス

// 送信先メールアドレス
$to_mail = 'test@gmail.com';

//送信者名
$from_name = mb_encode_mimeheader("テスト送信者",'utf-8');

// 文字コード
$char_set = 'UTF-8';

// 件名
$subject = '件名でーす';

// 本文
$body = '本文でーす';

try {
    // メール送信
    $result = $client->sendEmail([
        'Destination' => [
            'ToAddresses' => [$to_mail],
        ],
        'ReplyToAddresses' => [$from_mail],
        'Source' => $from_name,
        'Message' => [
            'Body' => [
                'Text' => [
                    'Charset' => $char_set,
                    'Data' => $body,
                ],
            ],
            'Subject' => [
                'Charset' => $char_set,
                'Data' => $subject,
            ],
        ],
    ]);

    // 送信ID
    $messageId = $result['MessageId'];
} catch (AwsException $e) {
    $this->log("SES送信失敗。" . $e->getAwsErrorMessage());
}

以上でございます!

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5