Amazon SESを使う場合、サーバ側にアクセスキーIDとシークレットアクセスキーを設定しておく必要があるのですが、レンタルサーバ―の場合それが難しいことがあります。
今回はレンタルサーバーでも使えるようにiniファイル認証を使ってAmazon SESをPHPを使ってメール送信するプログラムを紹介します。
ちなみに今回のプログラムは、レンタルサーバーの「エックスサーバー」でメールが送信されることを確認済です。
コーディング前の下準備
テスト用のメールアドレスを登録・認証させる
Amazon SESはテスト段階のSandBoxモードでは、事前に認証してあるメールアドレスしか利用することができません。
なので事前にメールアドレスを認証しておきます。
まずは、AWSのコンソール画面にログイン。
ログインできたら、サービス一覧から「Simple Email Service」を選択します。

Simple Email Serviceの画面が表示されたら、サイドメニューの「Email Addresses」をクリックします。

登録されているEmail一覧が表示されるので、「Verify a New Email Address」と書かれたボタンをクリックしましょう。

メールアドレス登録用モーダルが表示されるので、メールアドレスを入力して「Verify This Email Address」と書かれたボタンをクリックしましょう。

登録したメールアドレスに認証用のURLが記載されたメールが送信されるので、URLをクリックしたら認証完了です。
[box class=”red_box” title=”注意”]
今回は、送信元メールアドレスと、送信先メールアドレスの2つのメールアドレスを登録します。[/box]
権限付与とアクセスキーIDとシークレットアクセスキーを取得
Amazon SESをAPI経由で利用するには、”権限の付与”と”アクセスキーIDとシークレットアクセスキーを取得”する必要があります。
まずはサービス一覧から「IAM」をクリックします。

IAMの画面が表示されたら、サイドメニューから「ユーザー」をクリックします。

ユーザー一覧が表示されるので、「ユーザーを追加」をクリックします。

適当なユーザー名を入力し、「プログラムによるアクセス」のチェックボックスにチェックしたら「次のステップ:アクセス権限」のボタンをクリックします。

「既存のポリシーを直接アタッチ」をクリックするとポリシーの一覧が表示されるので、検索ボックスで「AmazonSESFullAccess」と入力し、表示されたポリシーをチェックします。
ポリシーのチェックができたら、「次のステップ:タグ」ボタンをクリックします。
以降は登録完了まで特に設定せずに「次のステップ」ボタンをクリックしていけばOKです。

ユーザーの登録が完了すると、アクセスキーIDとシークレットアクセスキーが表示されるので、必ず控えておきましょう。

AWS SDK for PHPを取得
Amazon SESをPHPで使うためにAWS SDK for PHPをインストールします。
Composerを利用したインストール方法が一番簡単です。
Composerがインストール済の場合は、コマンドラインで以下のコマンドを実行して少し待てばAWS SDK for PHPインストール完了です。
composer require aws/aws-sdk-php
[box class=”blue_box” title=”Composerが使えない場合”]
ちなみに、今回はComposerが使えないレンタルサーバーでの利用も想定しているので、公式サイトからZipファイルでAWS SDK for PHPをダウンロードしました。
ダウンロードしたzipファイルを展開して、ディレクトリに配置してオートローダーをインクルードすれば使えるようになります。
[/box]
iniファイル作成
今回は、レンタルサーバーでも利用できるようにiniファイルを利用してAmazon SESをPHPで実行させます。
サーバーの適当な場所にiniファイルを作成します。(今回はtest.iniとしました)
ファイルを作成したら、下記のコードを記述してください。
[default] #今回はdefaultと設定 aws_access_key_id = アクセスキーID aws_secret_access_key = シークレットアクセスキー
コーディング
コード
公式サイトの「AWS SDK for PHP を使用して E メールを送信する」で公開されているソースを参考にしてコーディングします。
send.phpを作成し、下記のコードを記述します。
// AWS SDK for PHPをインクルード
include_once 'aws/aws-autoloader.php';
use Aws\Credentials\CredentialProvider;
use Aws\Ses\SesClient;
use Aws\Exception\AwsException;
// iniファイルで設定した[]のテキストを設定
// 今回はdefault
$profile = 'default';
// iniファイルのパス
$path = 'test.ini';
// iniファイルでの認証するための処理
$provider = CredentialProvider::ini($profile, $path);
$provider = CredentialProvider::memoize($provider);
// SES用オブジェクト生成
$client = new SesClient([
'region' => 'us-west-2',
'version' => '2010-12-01',
'credentials' => $provider
]);
// 送信元メールアドレス
$from_email = 'sample_from@sample.co.jp';
//送信者名表示
$from_name = mb_encode_mimeheader("サンプル太郎",'utf-8')." <{$from_email}>";
// 送信先メールアドレス
$to_email = 'sample_to@sample.co.jp';
// メール件名
$subject = 'テストメール';
// メール本文
$plaintext_body = 'テストメール本文ですよ';
// 文字コード
$char_set = 'UTF-8';
try {
// メール送信
$result = $client->sendEmail([
'Destination' => [
'ToAddresses' => [$to_email],
],
'ReplyToAddresses' => [$from_email],
'Source' => $from_name,
'Message' => [
'Body' => [
'Text' => [
'Charset' => $char_set,
'Data' => $plaintext_body,
],
],
'Subject' => [
'Charset' => $char_set,
'Data' => $subject,
],
],
]);
$messageId = $result['MessageId'];
echo("送信成功! Message ID: $messageId" . "\n");
} catch (AwsException $e) {
// output error message if fails
echo $e->getMessage();
echo("送信に失敗しました:" . $e->getAwsErrorMessage() . "\n");
echo "\n";
}
あとは、このphpファイルにアクセスすればメールが送信されます。

コメント