[AWS]メールサーバーを作成


Webアプリケーションに備わっている、新規ユーザー登録やECサイトの購入確認メールなど私たちの日常で、メールサービスは身近なものとなっています。このメールサービスは、メールサーバーを使うことで実現できますが、AWSはAmazon SES(Simple Email Service)と呼ばれるマネージドサービスが存在します。ただし、これは一般的なメールサーバーとは用途が少し違うため確認していきます。

# メールの送受信の仕組み

一般的に電子メールの送信や他のサーバーへの転送にはSMTPサーバーが、電子メールの受信にはPOP3、IMAP4サーバーが使用されています。

![メール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/13610fd1-66fd-dd62-5fe9-bb0cb603913f.jpeg)

①クライアントAがクライアントBにメールを送信する際に、まずAのメールサーバー(SMTP)に送られます。

②AのSMTPサーバーが今度は、DNSを通してBの宛先のIPアドレスを調べてこれをAのSMTPサーバーに返します。

③AのSMTPサーバーは、BのSMTPサーバーにメールを送信します。また、そのメールはPOP3と呼ばれるサーバーに保管されます。

④BはPOP3サーバーから、Aから送られていきたメールを受信者の端末のメールソフトを通して、メールの内容を確認できます。

# POP3とIMAP4の違い
POP3とIMAP4の２つのプロトコルは、メール受信するためと同じ役割を持っていますが、大きな違いは保管場所にあります。

POP3はメールが、端末のメールソフトを通して自分のパソコン上に取り込まれます。このことから、インターネットに繋がっていなくとも、パソコンからメールの中身を確認できます。しかし、これは逆にメールを受信したパソコン上でしかメールを確認できないため、他の端末での確認はできません。

IMAP4は、ブラウザを通してサーバーに直接メールを読み込みます。POP3と違って、インターネットが繋がっていないとメールの確認ができませんが、逆にネットが繋がれば他の端末からメールを読み込むことができます。

# Amazon SESの作成
本来、メール受信の際にPOP3やIMAP4を利用することが一般的ですが、SESはこれらが含まれていません。よってクライアントを使ったメール受信ができません。しかし、SESを使うことによって、他のメールサーバーとの通信、メールの拒否、スパムやウイルスのスキャンといった、様々なメリットがあります。

## メール送受信機能の実装

SESの作成にあたって、メールの送受信を行う機能を実装するにあたって、リージョンを「バージニア北部」に設定します。
コンソール画面にて、SES=>検証済みID=>IDの作成をクリックします。

### ドメイン設定

![SES作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/d446be60-e0d4-c234-beef-cde205d4e2f1.png)

ドメインにチェックして作成したドメインを入力し、DKIMをチェックします。DKIMは、メールに電子署名を入れることで改ざんやなりすましを防ぐことができます。また、DKIMのは、Route53を使ってDNSを作成しているので、DNSレコードのRoute53への発行を選択します。そして、DKIM署名を有効にします。

### 検証済みメアドの追加
現在のままだと、SESはサンドボックス上の中にあるため、送受信できるメールは検証済みのメールアドレスだけになります。サンドボックスとは、外部に影響を与えない閉じられた環境のことで、SESを作成した時点では悪用を防ぐために、初期の段階でサンドボックスの中に置かれます。しかし、検証済みのアドレスを登録をすればメールの送受信ができます。

![SES メール認証.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/4e21330a-73a0-5772-6af6-24ee4fbc911b.png)

Eメールアドレスには、任意のメールアドレスを指定します。実際に、テストメールを送って正しく設定ができているか確認していきましょう。

先ほど作成したドメインを選択して、"IDの作成"を選択します。
|Eメール形式|From-address|シナリオ|カスタム受信者|
|:--:|:--:|:--:|:--:|
|フォーマット済み|no-reply|カスタム|任意のメアド|

![SES メール認証①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/76da184a-80af-a53d-5ae7-63c49e0d23c6.png)

![SES メール認証②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/a3d15e5d-fd46-e161-f6e6-ab29f138b2f0.png)
テストメールの送信をすると、入力したメアドにテストメールが届きます。

### SMTPによるメール送信
AWSには、Amazon SES SMTPインターフェイスと呼ばれるSMTPを実装できる機能があります。まずはSMTP認証を行うときにIAMユーザーを作成していきます。

![SMTP①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/51b90200-5603-4849-2190-5e6a1dba06a9.png)

ユーザーの名前は任意の名前を指定し作成をクリックすると、次は認証情報のダウンロードボタンをクリックします。ここで表示される、ユーザー名とパスワードは今後必要になってくるため、忘れないようにしましょう。ダウンロードが完了したらIAMユーザーが作成されていることを、IAMダッシュボードから確認します。

次に、このIAMユーザーを利用してSMTP経由でメールを送信するテストを行っていきます。
まずは、SSH通信でWebサーバーに接続してファイルを作成した後以下の内容を記述します。

```
$ ssh wbe01

$ vim sendmailtest.py
```
```~/.ssh/sendmailtest.py
# --- config: utf-8 --- 
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email import charset

# 各種情報
account = '*****************' ----------- ①
password ='*****************' ----------- ②
server = '*****************'  ----------- ③
from_addr = 'no-reply@<ドメイン名>'
to_addr = '<認証したメールアドレス>'

# SMTPサーバーに接続する
con = smtplib.SMTP(server, 587)
con.set_debuglevel(1)
con.starttls()
con.login(account, password)

# 送信するメールのメッセージを作成する
cset = 'utf-8'
message = MIMEText('SMTPのテスト', 'plain', cset)
message['Subject'] = Header(u'SMTP経由での電子メール送信のテストです', cset)
message['From'] = from_addr
message['To'] = to_addr

# メールを送信する
con.sendmail(from_addr, [to_addr], message.as_string())

# SMTPから切断する
con.close()
```
①、②は、認証情報のダウンロードした際のアカウント名とパスワードを入力します。③には、SMTPのエンドポイントに記述されているものをそのままコピーします。(SMTP設定画面により確認)

最後に、PythonのコマンドでメールがSMTPで送信されることを確認していきます。
```
$ python3.7 sendmailtest.py
```
このコマンドを出力することで、ログから送信者アドレスと受信者アドレスが確認できれば、SMTP通信が行われていることが確認できます。

## メール受信の実装
前述した通りメールの受信にはPOP3やIMAP4を利用されますが、AWSにはメール受信の際にアクションと呼ばれる独自のAPIが存在しているため、これを利用してリアルタイムで処理を行うことができます。

SES=>Eメール受信=>ルールセットの作成 をクリックして、ルールセットの名前をつけていきます。今回は、"sample-ruleset"と命名しました。次は、実際にルールを作成していきます。

![スクリーンショット 2023-03-13 20.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/78fd9914-0b57-b9c4-adb7-a846a415d77b.png)
ルール名は、"sample-rule-inquiry"としデフォルトのままで次へを押します。

受信可能なメールアドレスを設定画面になります。ここで設定するメールアドレスは、SESで登録したドメイン名と同じ必要があります。今回は、"inquiry@<ドメイン名>"のようなメールアドレスを入力します。

次は、実際にメール受信アクションを追加していきます。S3バケットに受信メールを保存するため、まずはS3バケット(任意の名前)を入力します。

![スクリーンショット 2023-03-13 20.22.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/34f7bd9a-f15f-0720-e2c8-39f9708faab8.png)
以上で受信メールサーバーの設定は終わりです。最後に、送信元であるSMTPサーバーが、先ほど作成した受信サーバーを認識できていないためRoute53のドメインにMXレコードを追加していきます。

|レコード名|レコードタイプ|値|トラフィックルーティング先|
|:--:|:--:|:--:|:--:|
|空欄|MX|レコードタイプに応じたIPまたは値|受信メールサーバーのIPアドレス|

![スクリーンショット 2023-03-13 20.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/e7655330-7912-0aaa-7099-0a2f51967db0.png)
以上で、メールを受信する準備ができました。

# サンドボックス外に移動する
サンドボックスの外に移動するために、SESのダッシュボードから本稼働アクセスのリクエストをしていきます。

|メールタイプ|URL|ユースケース|その他の連絡先|言語|
|:--:|:--:|:--:|:--:|:--:|
|トランザクション|WebサイトのURL|どのようにメールサーバーを利用するのかの説明|メールのお問い合わせ先|日本語|

![スクリーンショット 2023-03-13 21.01.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/78b48d8d-a39c-61ce-b48f-65354d7b99f5.png)

![スクリーンショット 2023-03-13 21.01.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/1b9b605a-7cb4-495d-c6c9-be48abb95bf7.png)

その後、AWS内部の担当者からメールが届き、サンドボックス外に移動したことが確認できます。


# 参考
AWSではじめるインフラ構築入門 翔泳社出版

https://business.ntt-east.co.jp/content/cloudsolution/column-220.html