フリーランスが独自ドメインのメールアドレスを扱えるようになるまで

## はじめに

　個人事業主になってから半年くらいになりますが、未だにメールアドレスをGmailにしていて
そろそろ独自ドメインのメールアドレスで事業主っぽい環境を整えようかと思い構築しました。

　※当記事ではAWSを使いエンジニアリングな環境で構築することを目的としています。
手っ取り早く設定したい場合は[SendGrid](https://sendgrid.kke.co.jp/)など各種サービスを使用することを推奨します。

## 前提条件

　今回使用するリソースは以下になります。

- お名前.com
  - ※既にドメインを取得していますので流用しています
  - ※新規でドメインから登録する場合はAWSのRoute53を推奨します

- AWS
  - アカウントがない場合は新規に作成しておきます

- Gmail
  - 既存で使用可能なフリーのメールアドレスを用意しておきます

- Node.jsライブラリ
  - https://github.com/arithmetric/aws-lambda-ses-forwarder を使います
  - ローカル環境で`npm install`等のコマンドが使用できることとします

## ドメイン取得

当記事ではお名前.comで取得したドメインで進めていきます。
ドメインの取得方法は割愛します。
https://www.onamae.com/

なお、AWSのRoute53からも取得することができます。
当記事ではRoute53にホスティングしますので、新規ユーザーの方は親和性の高いAWSから取得することも選択肢の一つとしてよいでしょう。
取得方法は以下を参考にしましょう。
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/registrar.html

## Route53の設定

お名前.comで取得したドメインをRoute53でホスティングします。

![スクリーンショット 2019-08-09 10.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/b6082f7e-7d6e-c7e0-2fe7-f9e721f7b715.png)


`ホストゾーンの作成`から自身のドメインを入力し、登録が完了すればOKです。

## ネームサーバーの設定

お名前.comを使用する場合の例です。
お名前.com Naviにログインし`ネームサーバー情報`から`変更する`で以下のネームサーバーの情報を入力し保存します。

![スクリーンショット 2019-08-09 10.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/c3a2ac5a-83fb-0ddb-7c92-38743b4f3f57.png)

保存後に設定した情報が反映されていることを確認します。

![スクリーンショット 2019-08-02 0.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/77ff0a9a-1e41-aa25-6a22-eff6ebd85469.png)

## SESの設定

Amazon Simple Email Service
メールの送受信に使用するサービスです。
2019/08時点では東京リージョンに対応していないのでバージニア北部あたりで設定を進めます。

まずはドメインを登録するために`Verify a New Domain`から自身のドメインを登録します。
`Generate DKIM Settings`はONにしておきます。

![スクリーンショット 2019-08-02 0.20.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/03901e4d-ea01-1a2b-f521-33144b49a0bf.png)

数分待ち、検証が完了すると`Verification Status`が`Verified`になっていることを確認します。

## 送受信用メールアドレスの設定

SESはデフォルトでは自身が登録したメールアドレスでのみ受信が可能です。
申請により制限が解除されれば問題ありませんが、制限解除まで時間がかかるので後述の設定のために
`Verify a New Email Address`よりフリーのメールアドレス(Gmailなど)を登録しておきます。

![スクリーンショット 2019-08-02 0.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/783aec20-3a58-577d-90f7-63b8a79f66e1.png)

## SMTP認証ユーザー設定

`SMTP Settings`より`Create My SMTP Credentials`を押下します。
IAMユーザーが作成されますので、アクセスキーとシークレットアクセスキーをメモしておきます。
この情報は後ほどGmailの送信設定からSMTPのユーザー名/パスワードとして登録します。

![スクリーンショット 2019-08-09 11.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/aa2f6122-fac1-12c5-e4df-de2eeb5e533e.png)

## 受信ルール設定

独自ドメインメールアドレスでメールを受信するために、RuleSetを作成します。
メニューの`Rule Sets`より受信ルールを設定します。
Recipientには自身で使用したいメールアドレスを記載します。

![スクリーンショット 2019-08-09 11.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/37464edc-af78-5c5e-9187-06174f6eb8ae.png)

受信先は一旦S3にしておきます。
　※後述のSMTP認証を行なうための受信先になりますので仮です

![スクリーンショット 2019-08-09 11.56.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/b1f66808-2be0-be10-5ecd-47a3f27ebfe4.png)

あとは画面の手順に従い、RuleSetの登録を完了します。
この時点では先ほどの`Verify a New Email Address`で設定したメールアドレスからのみ受信できるようになっています。

## SESの制限解除申請

SESのデフォルトでは自身が`Verify a New Email Address`より登録したメールアドレスのみ受信ができます。
外部のあらゆるメールアドレスと送受信できるようにするために、AWSサポートから制限の解除を申請します。
以下を参考にするとよいでしょう。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/request-production-access.html

私は1日50,000メッセージ、最大送信レートが毎秒14メッセージまで制限が緩和されました。

## Gmail設定

さて、先ほどSMTPの設定をしましたが実際にSMTPを通してメールを送信するところまでやってみます。
当記事ではGmailを利用した例で設定します。
Gmailの`設定`から`アカウントとインポート`を選択し、`他のメールアドレスを追加`を押下します。
以下の画面より、先ほどの受信ルール設定で登録したメールアドレスを入力します。

![スクリーンショット 2019-08-09 11.41.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/cb12d1b3-c9db-2783-ef12-58c633fa854c.png)

次のステップで、SMTPの情報を入力します。
SMTPサーバーはSESの画面から確認できます。
ユーザー名は先ほど作成したIAMユーザーのアクセスキー、パスワードはシークレットアクセスキーを入力します。

![スクリーンショット 2019-08-09 11.47.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/d0be48ea-7127-01b0-4048-1e2140ceed8b.png)

![スクリーンショット 2019-08-09 11.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/b98e3645-aab5-240c-1c75-5edc22d92e46.png)

そうするとS3に確認用のメールが届いていますので、拡張子を`eml`にして中を確認し、確認用URLへリンクもしくは確認用コードを入力して設定を完了します。

## Lambda作成

SESではメールをPOP3やIMAPなどを通して受信する手段はありません。
S3に配置するかLambdaで転送するなどの方法があります。
当記事では以下のライブラリを使用する例を挙げます。
https://github.com/arithmetric/aws-lambda-ses-forwarder

あらかじめLambdaを実行するロールに以下のポリシーを付与しておきます。
S3バケットは先ほどの手順で受信先に設置したバケットで問題はありません。

```
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
         ],
         "Resource": "arn:aws:logs:*:*:*"
      },
      {
         "Effect": "Allow",
         "Action": "ses:SendRawEmail",
         "Resource": "*"
      },
      {
         "Effect": "Allow",
         "Action": [
            "s3:GetObject",
            "s3:PutObject"
         ],
         "Resource": "arn:aws:s3:::S3-BUCKET-NAME/*"
      }
   ]
}
```

`index.js`に各種アドレスの設定を記述します。
以下の例では
`{独自ドメインのメールアドレス}`に受信したメールが、Fromを`forwarder@{独自ドメイン}`として`{Gmail}`に転送される
ということになります。
なお、Reply-Toが適切に設定された状態で転送されるので、返信先が`forwarder@{独自ドメイン}`になることはありません。

```index.js

var LambdaForwarder = require("aws-lambda-ses-forwarder");

exports.handler = function(event, context, callback) {
  // See aws-lambda-ses-forwarder/index.js for all options.
  var overrides = {
    config: {
      fromEmail: "forwarder@{独自ドメイン}",
      emailBucket: "{バケット名}",
      emailKeyPrefix: "",
      forwardMapping: {
        "{独自ドメインのメールアドレス}": [
          "{Gmail}"
        ]
      }
    }
  };
  LambdaForwarder.handler(event, context, callback, overrides);
};

```

設定が完了したらZIPにしてLambda関数を作成します。
　※あらかじめ`npm install`で`node_modules`パッケージをインストールしておくことを忘れずに

実行ロールは先ほどのポリシーが適用されていることを確認します。

最後に、SESの`Rule Sets`を更新します。
受信アクションにLambdaを追加し、最終的に以下のようなルールになっていればOKです。

![スクリーンショット 2019-08-09 12.33.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/ca72319b-ee68-6c4c-a48a-61f39ab0e6ad.png)


## メール送信

最後にテストしてみましょう。
外部のメール(yahoo)から独自ドメイン宛てに受信したメールに対して、外部のメール(yahoo)宛に返信ができることを確認できると思います。

![スクリーンショット 2019-08-09 12.23.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466431/bc0490f0-323b-a867-5da4-f1f5fb78a8e3.png)