AWS SESを使って添付ファイル付きのメールを送信する

### 結論
sendRawEmail関数を用いてMIME形式のメールにすれば添付ファイルを送信できる。

### sendEmailでは添付ファイル付きのメールを送信できない
SESでメール送信する際に最初に思いつく方法がsendEmail関数を使った方法かと思います。
シンプルで扱いやすいsendEmailですが、シンプルすぎるがゆえにファイルを添付することができません。そこでより詳細な形式でメールを送信できる機能を備えたsendRawEmail関数の登場です。sendRawEamilを使えば、MIME標準の形式に従い、バイナリコンテンツや添付ファイル付きのメッセージを送信できるようになります。

### MIME規格とは
メールはもともとSMTP(SimpleMailTransferProtocol)形式を使い、7ビットASCII文字のみを使ってメール送信を行うよう設計されていました。ですが、これでは単純なテキスト情報しか送信できないため、SMTPを拡張したMIME(Multipurpose Internet Mail Extensions)という規格が誕生しました。こちらは先に挙げたテキストに加え、画像や動画などのバイナリデータの追加やテキストの書式設定なども行うことができます。このMIME規格に従ったメール規格を扱えるのは、SESではsendRawEmail関数にあたります。ということで、SESを使って添付ファイル付きのメールを送信しようとすると必然的にこちらの関数を使う流れになります。

### MIME形式のメールにしてくれるライブラリ「Nodemailer」
さて、先に挙げたMIME形式ですが割とクセのある形式です。下記のような形式です。
※下記URLより抜粋
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/send-email-raw.html

```

From: "Sender Name" <sender@example.com>
To: recipient@example.com
Subject: Customer service contact info
Content-Type: multipart/mixed;
    boundary="a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a"

--a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
Content-Type: multipart/alternative;
    boundary="sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a"

--sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

Please see the attached file for a list of customers to contact.

--sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<html>
<head></head>
<body>
<h1>Hello!</h1>
<p>Please see the attached file for a list of customers to contact.</p>
</body>
</html>

--sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a--

--a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
Content-Type: text/plain; name="customers.txt"
Content-Description: customers.txt
Content-Disposition: attachment;filename="customers.txt";
    creation-date="Sat, 05 Aug 2017 19:35:36 GMT";
Content-Transfer-Encoding: base64

SUQsRmlyc3ROYW1lLExhc3ROYW1lLENvdW50cnkKMzQ4LEpvaG4sU3RpbGVzLENhbmFkYQo5MjM4
OSxKaWUsTGl1LENoaW5hCjczNCxTaGlybGV5LFJvZHJpZ3VleixVbml0ZWQgU3RhdGVzCjI4OTMs
QW5heWEsSXllbmdhcixJbmRpYQ==

--a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a--

```

このような形式に沿ってメールを作っていくのは骨が折れそうです。そこでこちらの形式に自動で整えてくれるライブラリを活用します。それがNodemailerです。以下のような記述で、簡単にMIME形式のデータを作成してくれるようです。

```javascript
import AWS from 'aws-sdk'
import nodemailer from 'nodemailer'

const main = async () => {

  const transporter = nodemailer.createTransport({
    SES: new AWS.SES({ apiVersion: '2010-12-01', region: 'ap-northeast-1' }), 
  })

  const result = await transporter.sendMail({
    from: 'test@example.com', 
    to: 'test@example.com', 
    subject: 'タイトル',
    text: '本文',
    attachments: [ // 添付ファイルはここで指定できます
      {
        filename: 'sample.png', 
        path: './sample.png',
      },
    ],
  })

}

main()
```
ちなみにNodemailerにはSES TRANSPORTという機能が用意されていて、そちらを使ってより簡易的にメール送信ができるようになっています。とても便利…
https://nodemailer.com/transports/ses/

### 最後に
ここまで読んでくださってありがとうございました。
まだまだ初心者なので、間違い等ありましたら指摘いただけると幸いです！

参考：
https://dev.classmethod.jp/articles/amazon-ses-with-file/
https://nodemailer.com/transports/ses/