LoginSignup
27
28

More than 5 years have passed since last update.

【完全版】phpでAmazonSESを動かす  (ウェブアプリでメール送信機能などに最適)

Last updated at Posted at 2016-11-02

AmazonSESとは

  • AmazonWebService(AWS)で展開されている、メール送受信を提供するサービス
  • 重量課金制で、最低料金は0円
  • 無料利用枠は、EC2からの送信が月62,000件、受信が月1,000件
  • アプリケーションやメルマガの利用者(ユーザー)への自動メール配信などで重宝する
    • ユーザー仮登録や通知系のメール送信
    • メルマガの一斉送信          などなど

構築環境例

  • Ubutnu14.04
  • PHP5.5.9

まずはじめに

  • SESは現在EU、米国西部、米国東部の3リージョンのみで利用できる(利用するサーバーが同じリージョンにある必要はない、東京でも利用できる)
  • サービスのドメインが必要、またDNSの設定も必要なので、もしDNS担当者が別の場合は早めに設定してもらおう
  • 送信元、または受信先にするメールアドレスは有用なものである必要があるため、メールアドレスを作成し、受信出来る状態にしておいてください
  • 送信の機能だけSESに任せたい場合は受信だけできるように設定するのもありです

手順

サービスサイトのドメイン取得

  • SESを利用するには、ドメインを申請する必要がある
  • 予め利用したいサーバはドメインをDNS担当者またはお名前.comなどの設定を済ましておく

SESを使用するためのドメイン申請

  • AWSのコンソールからドメイン申請を行う
    SES_Management_Console.png

  • Verify a New Domainをおす
    SES_Management_Console.png
      

  • Domainには申請したいURLを(https://www.sample.com であれば sample.com)

  • General DKIM Settingsにチェックを入れてVerify This Domain
    SES_Management_Console.png
      

ドメイン承認用レコード1つ、DKIM用レコード3つをDNSに設定する

4930c25b-25fb-e39e-a4b4-c3b9b6710aa9_png__940×790_.png
画像中のTXTレコードを1つ、CNAMEを3つ設定する
CNAMEはDownload Record Set as CSVして確認すると便利  

※参考:TXT、CNAMEレコードとは
DNSレコード設定|ドメイン取得なら_お名前_com.png
  

AWSからの認証メールを待つ

  • レコードを設定するとAWSが検知するまで最大72時間がかかりますという記載があるが、私が設定した際は20分ほどですべての認証が終わった
  • 認証が完了すると以下のようなメールが届く   

Banners_and_Alerts_と_8ebbbcfb-f846-e053-f66e-1d6405e797e1_png__1648×808_.png
  

DKIMのレコード承認をアクティベーションする

SES_Management_Console.png
ドメイン設定の詳細ページに遷移し、DKIM欄をのばすと、disabledになっているはずである
これのenableをクリックし、アクティベーションする

メールアドレスの承認

  • ドメインと同様、送信元または受信先のメールアドレスが有用なものかどうかを判断するために申請する必要がある
  • メールの認証はとっても簡単(以下のとおり)

SES_Management_Console.png

  • 左タブからEmailAddressesを選択
  • Verifly a New Email Addressをクリック

SES_Management_Console.png
送信元または受信先のメールアドレスを入力して「Verify This Email Address」をクリック
入力したメールアドレスに認証URLが記載されたメールが送られる

メールアドレスをアクティベート

メールに記載された認証URLをクリックしてアクティベートする
受信(54_797件のメッセージ).png
これでドメイン、メールの設定は完了

認証の設定

これだけだと、SESを操作するための権限が放置状態のため、権限を設定をする

※ユーザーがいない場合は作成する
IAM_Management_Console.png

IAM_Management_Console.png
作成したらユーザー名をクリック

ポリシーのアタッチ

※どのサービスにアクセスできて、何ができるかなどを分けるための作業
IAM_Management_Console.png

ポリシーを選択する

IAM_Management_Console.png
これでポリシーは設定完了

.awsを作成する

アクセスキー、シークレットキーを取得する

※すでにわかってる人はここはスキップしてください
IAM_Management_Console.png
ここではアクセスキーとシークレットキーを取得することができますので、大切に保管しましょう

サーバに設定する

  • サーバにSSHログインする
  • 以下のコマンドで環境変数をセットする
$ aws configure

-以下4項目が順番に聞かれるので、以下をサンプルにして入れて下さい

AWS Access Key ID [None]: xxxxxxxxxx ←さっき取得したアクセスキー
AWS Secret Access Key [None]: xxxxxxxxxx ←さっき取得したシークレットキー
Default region name [None]: us-west-2
Default output format [None]: json
  • 以下の様な構造になっていることを確認
$ ll ~/.aws
total 16
-rw-------  1 xxxxxx  staff   48 10 25 18:47 config
-rw-------  1 xxxxxx  staff  116 10 25 18:47 credentials
$ cat ~/.aws/config
[default]
output = json
region = us-west-2

$ cat ~/.aws/credentials 
[default]
aws_access_key_id = xxxxxxxxxx
aws_secret_access_key = xxxxxxxxxx

AWS SDKの導入

ようやく実装

サンプルコード

<?php

//AWSSDK読み込み
require_once 'AWSSDKforPHP/aws.phar';

use Aws\Ses\SesClient;
use Aws\Ses\Exception\SesException;
use Aws\Common\Enum\Region;

class sendMail {

    function send() {
        $aws_access_key = YOROZU_AWS_ACCESS_KEY;    // アクセスキー
        $aws_secret_key = YOROZU_AWS_SECRET_KEY;    // シークレットキー

        $source     = mb_encode_mimeheader('送信元のメーラーでの表示名') .'fromaddress@hoge.com';    //送信元アドレス
        $to         = 'toaddress@hoge.com';    //送信元アドレス
        $charset    = 'ISO-2022-JP';   //変換先の文字コード
        $subject    = "件名";

        //本文
        $body_text = "本文";

        try {
            //アクセスキー、シークレットキー、リージョンを指定しクライアントを生成する
            $client = SesClient::factory(
                    array(
                        'key'       => $aws_access_key,
                        'secret'    => $aws_secret_key,
                        'region'    => Region::OREGON
                        )
                    );

            //添付ファイル無しのメールを送信
            $result = $client->sendEmail(array(
                        // Source(送信元)は必須
                        'Source' => $source,
                        // Destination(宛先)は必須
                        'Destination' => array(
                            'ToAddresses' => array($to), // To
                            'CcAddresses' => array("sample1@hoge.com", "sample2@hoge.com"), // CC(あれば)
                            'BccAddresses' => array(), // BCC(あれば)
                            ),
                        // Message(メッセージ部分)は必須
                        'Message' => array(
                            // Subject(件名)は必須
                            'Subject' => array(
                                // Data(件名部分データ)は必須
                                'Data'      => $subject,
                                'Charset'   => $charset,
                                ),
                            // Body(本文)は必須
                            'Body' => array(
                                'Text' => array(
                                    // Data(本文データ)は必須
                                    'Data'      => $body_text,
                                    'Charset'   => $charset,
                                    ),
                                /* HTMLメールを送る場合
                                   'Html' => array(
                        // Data(HTMLデータ)は必須
                        'Data' => 'HTMLです',
                        'Charset' => $charset,
                        ),
                                 */
                                ),
                            ),
                            )
                                );

        } catch (SesException $exc) {
            echo $exc->getMessage();
        }

    }
}
  • 当たり前ですがmailqにでキューには溜まりません
  • エラーが出る場合はユーザー権限まわりの設定が正しいか(ポリシーが設定されているか)を確認してください

最後に

  • 設定は面倒な部分が多かったが、設定さえしてしまえばコードは非常に軽量なのでオススメ
  • 私自身初めて作成したので、間違いやご指摘あればコメント欄で優しくよろしくお願い致します

参考にしたサイト

-amazonses.com経由を消す SES DKIMの設定方法(http://kiraba.jp/ses-dkim-setting/)
-AWS SESをちゃんと使うためにやるべきこと(http://qiita.com/zaru/items/4be9b55ba807670cf224)

27
28
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
27
28