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

#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](https://qiita-image-store.s3.amazonaws.com/0/92339/b5610ce3-bdfb-5636-d14e-9eda7a5621f3.png)


- Verify a New Domainをおす
![SES_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/92339/67a85cb4-6c4e-cb1a-e8bc-0a1404bbebee.png)
　　

- Domainには申請したいURLを(https://www.sample.com であれば sample.com)
- General DKIM Settingsにチェックを入れてVerify This Domain
![SES_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/92339/846f843e-a319-be7b-d394-8af8fa217db6.png)
　　

### ドメイン承認用レコード1つ、DKIM用レコード3つをDNSに設定する
![4930c25b-25fb-e39e-a4b4-c3b9b6710aa9_png__940×790_.png](https://qiita-image-store.s3.amazonaws.com/0/92339/207de471-81ce-f33f-a6a9-694c1ea3099a.png)
画像中のTXTレコードを1つ、CNAMEを3つ設定する
CNAMEはDownload Record Set as CSVして確認すると便利　　

※参考：TXT、CNAMEレコードとは
![DNSレコード設定｜ドメイン取得なら_お名前_com.png](https://qiita-image-store.s3.amazonaws.com/0/92339/5b9df436-4894-0c41-72e4-5fe5f3586f75.png)
　　

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

![Banners_and_Alerts_と_8ebbbcfb-f846-e053-f66e-1d6405e797e1_png__1648×808_.png](https://qiita-image-store.s3.amazonaws.com/0/92339/f47fac39-e8d8-4fdb-8339-a2cd244dd8b8.png)
　　

### DKIMのレコード承認をアクティベーションする
![SES_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/92339/f93f2101-f937-a84e-dd36-8eddea9b0743.png)
ドメイン設定の詳細ページに遷移し、DKIM欄をのばすと、disabledになっているはずである
これの*enable*をクリックし、アクティベーションする

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

![SES_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/92339/9c701d1a-2444-3164-9009-96c0de4263e7.png)

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

![SES_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/92339/b8168482-accf-29a8-9d82-82fff5b26a44.png)
送信元または受信先のメールアドレスを入力して「Verify This Email Address」をクリック
入力したメールアドレスに認証URLが記載されたメールが送られる

###メールアドレスをアクティベート
メールに記載された認証URLをクリックしてアクティベートする
<img width="822" alt="受信（54_797件のメッセージ）.png" src="https://qiita-image-store.s3.amazonaws.com/0/92339/f9805a29-de6e-b7f4-a557-dd8fe48b7fe4.png">
これでドメイン、メールの設定は完了

## 認証の設定
###これだけだと、SESを操作するための権限が放置状態のため、権限を設定をする
※ユーザーがいない場合は作成する
![IAM_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/92339/0a1a8789-fd8d-fb04-a29f-eb2851f8f505.png)

![IAM_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/92339/94400951-34a8-df2a-0869-bc73c31dfc05.png)
作成したらユーザー名をクリック

###ポリシーのアタッチ
※どのサービスにアクセスできて、何ができるかなどを分けるための作業
![IAM_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/92339/7232ae0a-9d60-e509-10bb-05f22fbe713a.png)

###ポリシーを選択する
![IAM_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/92339/d636c40b-1224-733b-8544-f3e2d9e9e368.png)
これでポリシーは設定完了

## .awsを作成する
### アクセスキー、シークレットキーを取得する
※すでにわかってる人はここはスキップしてください
![IAM_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/92339/7bafdf1e-59d9-f28a-29cd-898873bedf8d.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の導入
- さまざまな方法でインストールできるので、以下のサイトを参照してインストールを行ってください
http://shirakiya.hatenablog.com/entry/2015/08/11/195558
- 今回こちらはpearでインストールした

#ようやく実装
##サンプルコード
- 以下の情報はおのおの読み替えてください
    - YOROZU_AWS_ACCESS_KEY
    - YOROZU_AWS_SECRET_KEY
    - 件名
    - 本文
    - fromaddress@hoge.com
    - toaddress@hoge.com
    - sample1@hoge.com
    - sample2@hoge.com

```
<?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)