AWS SDK for PHPを使ってAmazon SESからメール送信
Amazon SES (Amazon Simple Email Service) は、Amazon Web Services にあるメール送信サービスで、APIもしくはSMTPを使ってメール送信ができます。各種言語用のSDKも公式に提供されているのでプログラム中から使うのも比較的簡単です。
PHPではバージョン2のSDKが最新ですが、2013年2月時点ではSESをサポートしていないため、旧バージョンである「AWS SDK for PHP | アマゾン ウェブ サービス(AWS 日本語)」のほうを使う必要があります。
AWS SDK for PHPを使ってAmazon SESからメールを送信する
使い方ですが、まずは config-sample.inc.php を config.inc.php という名前でコピーして、その中に AWS のキーを設定しておきます。
なお、 config.inc.php はSDKのディレクトリの中に置かずに ~/.aws/sdk/config.inc.php に置くこともできるようです。リポジトリに入れたくない場合などは、このようにホームディレクトリに置いておくといいでしょう。
試しに AmazonSES::send_email() メソッドを使ってメールを送信してみました。
<?php require_once('sdk.class.php'); $ses = new AmazonSES(); $source = '送信元のメールアドレス'; $destination = array( 'ToAddresses' => array('送信先のメールアドレス'), ); $message = array( 'Subject' => array( 'Data' => 'ここに件名を入れます', 'Charset' => 'ISO-2022-JP', ), 'Body' => array( 'Text' => array( 'Data' => 'ここに本文を入れます', 'Charset' => 'ISO-2022-JP', ), ), ); $opt = array(); $res = $ses->send_email($source, $destination, $message, $opt);
Destination には ToAddresses の他に CcAddresses や BccAddresses も指定可能です。詳しくはAPIリファレンス及びライブラリのソースコードを読んでみましょう。
送信が成功したかどうかはレスポンスである CFResponse オブジェクトの isOK() メソッドを利用すればわかります。もしくは直接 $status プロパティを参照してもいいかも。
$source には送信元のメールアドレスを入れますが、送信元を「F.Ko-Ji <blog-master@fkoji.com>」のような形式にしたい場合もあると思います。その場合は以下のように書けば大丈夫です。
$fromName = mb_convert_encoding('名前', 'ISO-2022-JP', 'UTF-8'); $source = sprintf('%s <%s>', mb_encode_mimeheader($fromName, 'ISO-2022-JP'), 'メールアドレス');
(追記 2013-03-15) 当初Mail_mimeを使ってエンコーディングする方法を紹介していましたが、不十分だったので修正しました。
なお、送信元のアドレスもしくはドメインは、あらかじめ AWS Management Console にて所有確認をしておく必要があります。また、実際に不特定多数にメールを送信する場合には、プロダクションへのアクセスをリクエストして、制限を解除してもらう必要があります。
プロダクションへのアクセスが許可されていない状態では、メールの送信先アドレスも所有確認をしないといけません。また、1日のメール送信数の上限も少なくなっています。プロダクションへのアクセスが許可されれば、メール送信数は1日あたり10,000件、1秒あたり5件となり、送信数の上限は質の低いメールを送信しなければ徐々に上がっていくようです。
【参考】
» Amazon SES(バルクメール配信サービス Amazon Simple Email Service) | アマゾン ウェブ サービス(AWS 日本語)
» Amazon Simple Email Service (SES) ドキュメント
» フレクトのクラウドBlog: Amazon SESとメール配信の難しさについて調べたこと
» 一番いいメール配信を頼む – サーバーワークス エンジニアブログ
コメントを残す