【レンタルサーバ対応】Amazon SES と PHPでメール送信

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をクリックしたら認証完了です。

注意
今回は、送信元メールアドレスと、送信先メールアドレスの2つのメールアドレスを登録します。

権限付与とアクセスキー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
Composerが使えない場合
ちなみに、今回はComposerが使えないレンタルサーバーでの利用も想定しているので、公式サイトからZipファイルでAWS SDK for PHPをダウンロードしました。

ダウンロードしたzipファイルを展開して、ディレクトリに配置してオートローダーをインクルードすれば使えるようになります。

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ファイルにアクセスすればメールが送信されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください