IPv6のみ(パブリックIPv4アドレスなし)のEC2からメールを送る

https://qiita.com/ran/items/7ae62f7dba2bba49e330

前回、IPv6のみのEC2を作成しましたが、そのEC2からメールを送信できるように設定します。

postfixはIPv6に対応しているので、そのままでも一応送信できるのですが、Gmail宛に送ると、
```
Gmail has detected that this 550-5.7.1 message does not meet IPv6 sending guidelines regarding PTR records 550-5.7.1 and authentication.
Please review 550-5.7.1  https://support.google.com/mail/?p=IPv6AuthError for more information 550 5.7.1
```
というようなエラーになって受け付けてくれません。
要はIPv6の逆引きができなくて信用できないから受け付けないということのようです。
postfixはデフォルトでIPv6を優先して使うので、パブリックIPv4アドレスがある場合は、IPv4を優先するように設定することで回避することもできますが、今回はないので、そういうわけにもいきません。

ということで、Amazon Simple Email Service(SES)を使って送るように設定します。
(今回は例として admin@test.example.com をFromアドレスとしたメールを送れるようにします。適宜、自分が管理するドメインに置き換えてください。)
リージョンは、東京(ap-northeast-1)で設定しているので、こちらも違う場合は適宜読み替えてください。

# SESの設定

## ID(Fromにするもの)の作成
[AWS SESの設定＞検証済み ID](https://ap-northeast-1.console.aws.amazon.com/ses/home?region=ap-northeast-1#/verified-identities)を開いて、『IDの作成』ボタンを押します。
IDタイプはドメインを選択し、ドメイン名には、自分が管理しているドメインを入れてください。(今回の例ではtest.example.com)
![スクリーンショット 2023-12-08 15.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/91dbf2c3-6dd0-cca4-e17e-7d12e4989615.png)
Route53で管理しているホストゾーンのドメインの場合は、自動的にDNSレコードが追加されます。(しばらく待つと、ステータスが検証済みになります。)
違うところでDNSを管理している場合は、IDの作成後に表示されるDNSレコードを自分で設定します。

## SMTP認証情報の作成
SESのSMTPエンドポイントを使うので、そのための認証情報を作成します。
[AWS SESのSMTP](https://ap-northeast-1.console.aws.amazon.com/ses/home?region=ap-northeast-1#/smtp)を開いて、右上にある『SMTP認証情報の作成』ボタンを押します。
ここで入力した情報でIAMユーザーが作成されるので、必要ならユーザー名をわかりやすいものに変えるなどして『ユーザーの作成』ボタンを押します。
認証情報が表示されるので、メモるかCSVファイルをダウンロードしておきます。

# postfixの設定

SESのSMTPエンドポイントを使ってメールを送るようにpostfixを設定します。
EC2にssh接続して、`/etc/postfix/main.cf`に以下を追加します。
```
myhostname = test.example.com

smtp_tls_note_starttls_offer = yes
smtp_tls_security_level = encrypt
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587
smtp_sasl_auth_enable = yes
smtp_use_tls = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt
```

`/etc/postfix/sasl_passwd`を作成し、以下のように認証情報を書きます。
SMTPユーザー名とSMTPパスワードには、先程作ったSMTP認証情報の実際の値を入れてください。
```
[email-smtp.ap-northeast-1.amazonaws.com]:587 SMTPユーザー名:SMTPパスワード
```
`sudo postmap hash:/etc/postfix/sasl_passwd`を実行すると、`/etc/postfix/sasl_passwd.db`ファイルができます。
念のためchmodして、postfixを再起動します。
```
sudo chmod 0600 /etc/postfix/sasl_passwd*
sudo systemctl restart postfix
```

# VPCエンドポイントの設定

これでメールが送れるようになったと思いきや、なんとSESのSMTPエンドポイントはIPv6をサポートしていません。
そこで、VPCエンドポイントを作成します。

https://docs.aws.amazon.com/ja_jp/ses/latest/dg/send-email-set-up-vpc-endpoints.html

## セキュリティグループの作成
インバウンドルールを追加し、タイプ＝カスタムTCP、ポート範囲＝587とし、ソースには対象のEC2インスタンスが含まれるようなCIDRブロックかセキュリティグループを設定してください。
![スクリーンショット 2023-12-08 16.48.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/28de4cdc-93a8-48a4-5bda-97bab726dac2.png)
(画像の『192.168.130.0/24』は例なので、自分の環境に合わせて設定してください。)

## SES用エンドポイントの作成
[VPCのエンドポイント](https://ap-northeast-1.console.aws.amazon.com/vpcconsole/home?region=ap-northeast-1#Endpoints:)で右上の『エンドポイントを作成』ボタンを押します。
サービスカテゴリで『AWSのサービス』を選び、サービスの項目で『smtp』で検索したら出てくるもの(1つしかないはず)を選択します。
適切なVPCとサブネットを選択し、セキュリティグループは前項で作成したセキュリティグループを設定してください。
![スクリーンショット 2023-12-08 16.54.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/5c82c045-8ea8-2a8c-89f5-daf0cd58163d.png)

エンドポイントが作成でき、ステータスが使用可能になったら、EC2インスタンスからメールが送れるようになったはずです。
(今回はドメインを設定したので、admin@test.example.comだけでなく、ec2-user@test.example.comなどからも送れます。)