AWS SESでメール受信してLambda連携

AWS以外での監視サービスを利用していてメールでしか監視の情報が受信できないことがあったので、AWS SESでメールを受信してからLambdaを経由して社内のチャットツールに連携してみました。

## 構成イメージ

イメージ作ろうと思ったけど手抜きで・・・

```
監視ツールなどのサービス

  |
  | メール送信
  ↓

SES受信 → S3保存 → Lambda

  |
  | Webhook
  ↓

内部チャットツール
```

## AWS SESのIDにドメインを登録

Route53に登録したドメインをIDに登録します。
※Route53だとEasy DKIMで自動で認証までしてくれます。
※Route53以外でもDKIMの設定で発行されたDNSレコードをドメイン側で登録して検証すれば利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/93374cba-c1ea-4952-bdc1-04102cf16117.png)

## Route53のドメインにMXレコードの追加

東京リージョンを使用しているので`10 inbound-smtp.ap-northeast-1.amazonaws.com`の値でMXレコードを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/200d8df9-1a09-4204-ac43-aa936c331d38.png)

使用するリージョンにより変わるので、必要に応じて以下の公式ドキュメントで確認してください。

https://docs.aws.amazon.com/general/latest/gr/ses.html#ses_inbound_endpoints

## メール受信情報を扱うLambdaの準備

今回は何かするわけでは無いので、デフォルトの内容にログ出力を追加したのみです。
※ここでS3からファイル取得して、[mailparser](https://www.npmjs.com/package/mailparser)などのライブラリで読み取るところまでやれば、社内チャットやSlackなどに通知できます。

```javascript
export const handler = async (event) => {

  // 受信した内容をログに出力
  console.log(JSON.stringify(event, null, 2))

  // TODO implement
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};
```

## メール受信時のS3バケットの準備

メール情報を保持するS3バケットを作成して、イベントを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/1a02e3c9-d338-4a34-9f09-ee64a8bf798a.png)

ファイル追加時のPutでLambdaを起動するようにしておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/8766b952-fcae-43a3-891a-894c5212e2cf.png)

※保持期間があるならライフサイクルポリシーで一定期間経過ファイルの削除

## AWS SESでメール受信の設定

### 受信ルールセットを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/2665d352-854f-4912-a63b-5fac3072b4fe.png)

### 受信ルールの追加

先ほどのルールセットにルールを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/3967943a-4ab0-4e95-9bda-91990600c2a2.png)

### 受信するメールアドレスを条件に設定

受信に利用するメールアドレスは、MXレコードに登録されているドメインなら@より前は自由に設定できます。
将来的に使い分けれることを想定して設定しておくのが良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/d9fa68a7-f207-4e38-a384-13c954b50072.png)

### アクションの指定でS3への保存を指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/7d27f0be-a849-4625-8651-74ec2a67f6b6.png)

設定するIAMロールに設定する権限は、アクション時のオプションに応じて変更する必要があるので以下を参考に作成
※画面上でIAMロールを作成できるけど、IAM Policyは自動で作成されない点にちゅうい

https://docs.aws.amazon.com/ses/latest/dg/receiving-email-permissions.html#receiving-email-permissions-s3-iam-role

### ルールセットの有効化

ルールセットはデフォルトでステータスが`無効`になっているため、明示的に有効にする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/5eba233a-9f1a-4fc2-a4a1-0731f06933d4.png)

## SESメール受信内容の連携方式における注意点

- `SES → Lambda` で直接連携
    - この場合はメール本文が含まれない
- `SES → SNS → Lambda` で連携
    - メール本文は連携できるが150kbまでの制限あり
    - ※サイズに収まるならS3を利用しない、この方式が良さそう

## その他

SESにメール受信を設定後、早速試したら以下が発生しましたが、こちらはルールセットの有効化忘れでした。。

```
Returned Mail: 550 5.1.1 Requested action not taken: mailbox unavailable
```

## 参考サイト

https://docs.aws.amazon.com/ses/latest/dg/receiving-email-mx-record.html

https://qiita.com/kenshiroh/items/2f52484fbf7919478559