Amazon SES でメールを送ってみた

# Amazon SES でメール送信入門
今回はNode.jsのSDKを使用してAmazon SES APIを使用してからメールを送信してみます。

## Amazon SES 概要
* [Amazon Simple Email Service(SES)](https://aws.amazon.com/jp/ses/)はAmazonのEmail送信サービスです。
* 重量課金制で、最低料金は不要。
* [無料利用枠](https://aws.amazon.com/jp/free/)は、EC2からの送信が62,000件/月、受信が1,000件/月。

## 必要なもの
・Node.js環境（Linux）
・AWSアカウント
・メールアドレス（送信用と受信用。共に自分で受信できるもの）

## 用語
* Amazon SES サンドボックス
  * 詐欺行為や不正行為防止及びISPからのSPAM認定回避のため、新規ユーザーのアカウントは、サンドボックス（検証目的の環境）に配置され、動作の一部に制限を受けます。
      * 検証済みのメールアドレス、もしくは検証済みのドメインでのみメール送受信可能。
      * 送信できるのは1日あたり200通まで、1秒あたり1メッセージまで。
  * アカウントをサンドボックスの外に移動する手続きを行うと、制限が解除された環境で動作します。
      * 手続きには 1 営業日かかるそうです。
* アイデンティティー
  * 大文字と小文字が区別された、任意の組み合わせのドメインおよび E メールアドレス。(user@example.comとUSER@example.comは別のアイデンティティー)
* Domain Key Idenified Mail(DKIM)
  * 送信者が E メールメッセージに署名することによって、それらのメッセージが本物であり、送信中に第三者によって改ざんされていないことを ISP が証明するための標準です。とのことです。

## セットアップ
まず、使用する際は送信元(From)アドレスの認証、送信先(To)アドレスの認証が必要です。
> Amazon SES を使用してメールを送信する前に、E メールの送信元となるアドレスまたはドメインを検証し、それを所有していることを証明する必要があります。

サンドボックスから移動した後は送信先の認証は不要になります。

### 主な注意点
* すべての E メールアドレスでは大文字と小文字が区別されます。
* E メールアドレスの検証ステータスは AWS のリージョンごとに別個に扱われます。

### Eメールアドレスの確認
以下の手順で送信先、送信元アドレスを検証します。
1. [Amazon SES コンソール](https://console.aws.amazon.com/ses)を開きます。
2. ナビゲーションペインの [Identities] で [Email Addresses] をクリックします。
3. [Verify a New Email Address] をクリックします。
4. [Verify a New Email Address] ダイアログボックスの指定フィールドに E メールアドレスを入力し、[Verify This Email Address] をクリックします。
5. E メールクライアントで、Amazon SES からのメッセージを開きます。
6. メッセージ内のリンクをクリックします。

## Amazon SES APIを使う準備

### SES用に環境を準備します

#### AWS SDKのインストール
```bash
mkdir ses && cd $_
npm init
npm install aws-sdk --save
```

#### AWS設定
今回は新規IAMユーザーを作成しました。
1. AWS マネジメントコンソール にサインインし、[IAM コンソール](https://console.aws.amazon.com/iam/)を開きます。
2. ナビゲーションペインで [Users] を選択し、続いて [Create New Users] を選択します。
3. 作成するユーザーのユーザー名を入力します。
4. [Create] を選択します。
5. 作成時のアクセスキーと、シークレットアクセスキーを控えておきます。
6. 作成したユーザーを選択します。
7. [Permissions]タブの[Attach Policy]を選択します。
8. [Filter]に"ses"と入力し、AmazonSESFullAccessを選択します。
9. [Attach Policy]を選択します。

##### AWSクレデンシャル設定
`~/.aws/credentials`を作成して、上記IAMユーザーのアクセスキーを記載します

```text:~/.aws/credentials
[default]
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットアクセスキー
```

すでに設定がある場合は、プロファイルを追加しましょう。
今回は`mailer`として追加しています。

```text:~/.aws/credentials
[default]
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットアクセスキー

[mailer]
aws_access_key_id = 新しいアクセスキー
aws_secret_access_key = 新しいシークレットアクセスキー

```

## メール送信の実行
長い道のりでした。

### コードの作成
メール送信のコードを書きます。
最低限必要なものにしてあります。

```js:index.js
var AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-1'});

var ses = new AWS.SES();

var params = {
  Destination: {
    ToAddresses: [ 'ichiro@example.com' ]
  },
  Message: {
    Body: {
      Text: {
        Data: 'こんにちは SES',
        Charset: 'utf-8'
      }
    },
    Subject: {
      Data: 'こんにちは',
      Charset: 'utf-8'
    }
  },
  Source: 'jiro@example.com' // From
};

ses.sendEmail(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

```

### Run!
`index.js`を実行します！

```bash
$ AWS_PROFILE=mailer node index.js
{ ResponseMetadata: { RequestId: '892ca512-b9bb-1ce5-b0de-1fe95eb2bce1' },
  MessageId: '00000152342d3439-57799589-e3i5-4h2b-8g5c-dd8c5f8fd7f1-000000' }
``` 

※クレデンシャルをdefaultで設定した場合は`AWS_PROFILE=mailer`は不要です

メールが届けば大成功です！

なお、ダメな場合はドバっとエラーが出ます。


## 参考URL
* [ Amazon SES開発者ガイド](http://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/Welcome.html)
* [AWS Javascript SDK SESリファレンス](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SES.html)


ありがとうございました。