はじめに
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());
}
以上でございます!