Amazon SES で添付ファイル付きメールを送る

 こんにちは。CTC 丸山です。今回はAWS JavaScript SDKを使い、SESで添付ファイル付きメールを送る方法について解説します。

▼ ハイライト
1. Amazon SESとは?
2. SESの初期設定(メールアドレスを登録)
3. 添付ファイルのないメールをSESで送信する
4. 添付ファイルのあるメールをSESで送信する

1. Amazon SESとは?

 SESとはSimple Email Serviceの略称で、様々な種類のメールを送ることができるサービスです。

 AWS上で起こった事象をメールで通知する方法としては、SNSのSubscriptionでEmailを選択することでメール通知を行うこともできますが、添付ファイル付きでメールを送りたい場合には、SESを使う必要があります。

 SESを使い始めるに当たりいくつか注意事項がありますが、まず知っておかなければならないのが、”サンドボックス(初期状態)”と”プロダクション”という2つのアクセスレベルがある点です。初めてSESを使う時は、”サンドボックス”状態になっており、以下の制約があります。

  • 確認済み(Verify済み)アドレスにのみ送信可能
  • 24時間で200通まで送信可能
  • 最大1通/秒の送信レート


 送信先に制限をなくす場合や、より多くのメールを配信したい場合にはAWSに申請を行う必要があります。

 また、現状ではSESのアルゴリズムが日本国内の携帯キャリアの制限等に十分配慮した構造となっておらず、メールが届かない等の問題が発生する可能性があるため、携帯キャリアメールに送信したい場合には、注意する必要があります。

2. SESの初期設定(メールアドレスを登録)

 SESでメールを送信する方法は、SDK等から直接SESのサービスを呼び出してメール送信する場合と、SMTPエンドポイントを使う場合の2パターンがありますが、今回はSDKから呼び出す方法とご紹介します。

 SandBox環境のまま検証を行いますので、まず送信元、送信先のアドレスの登録を行います。

手順 1. SESの管理コンソールで "Email Addresses" を選択

aws ses eMail

図 1. AWS SES 管理画面

手順 2. "Verify a New Email Address" をクリック

aws ses eMail

図 2. AWS SES 管理画面 (Email Addresses)


手順 3. メールアドレスを入力し、"Verify This Email Address" をクリック

aws ses eMail

図 3. AWS SES 管理画面 (Verify This Email Address)


手順 4. 確認メールで Verify を実行

 手順 3 で入力したアドレス宛に、確認のメールが届くので、本文に記載されているリンクをクリックしてVerifyする。

aws ses eMail

 4. AWS SES 管理画面 (Verify)



3. 添付ファイルのないメールを SES で送信する

 今回はJavaScript SDK (Node.js SDK)を使うため、まずAPIドキュメントを確認してみると、メールを送信するために用意されたメソッドは、sendEmailとsendRawEmailという2つが用意されていることが分かります。

 sendEmailはAPIドキュメントに記載されているように、sendEmailを呼び出す際に必要なパラメータを渡すことで、簡単にメール送信をすることができます。このパラメータ名もわかりやすいので、あまり困ることはないと思います。以下にSESを使ったメール送信を行うNode.jsのサンプルコードを掲載します。

var AWS = require('aws-sdk');
var ses = new AWS.SES({apiVersion: '2010-12-01', region: 'us-east-1'});

var params = {
// メール送信元のアドレスを記載します
// (注意)SESに登録され、verify済みのアドレスを指定
Source: '送信元メールアドレス',
// 送信先アドレスを記載します
// SandBox環境の場合は、SESに登録され、verify済みのアドレスのみ指定可能
Destination: {
ToAddresses: ['宛先メールアドレス']
},
// メール本文
Message: {
// メールのタイトルを記載
Subject: {
Data: 'SESテスト',
Charset: 'ISO-2022-JP'
},
// メールの本文を記載
Body: {
Text: {
Data: 'テストメッセージの本文です。',
Charset: 'ISO-2022-JP'
}
}
}
};

ses.sendEmail(params, function(err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
console.log('*** sendEmail complete ***');
}
});

 7行目と11行目の「送信元メールアドレス」、「宛先メールアドレス」部分は、SESに登録したメールアドレスで置き換えてください。

 Charsetは文字コードを指定している部分で、利用する目的や環境によって変更してください。
 日本語のメールを送信したい場合には、JIS(ISO-2022-JP)がよく使われているようです。

4. 添付ファイルのあるメールを SES で送信する

 SESで送信するメールに添付ファイルを含めたい場合には、sendRawEmailというメソッドを使用します。
 APIドキュメントを確認してみると、以下のような記載になっています。


aws ses eMail

 sendEmailの際には、本文を記載する場合にMessageという属性の中に、SubjectとBodyがあり、そこにメッセージを指定するだけでしたので分かりやすかったですが、こちらのsendRawEmailの場合には、RawMessageという属性が用意されていますが、中身の書き方は明記されていません。というのも、このsendRawEmailは標準で用意されたフォーマット(sendEmailメソッド)よりも、より詳細な設定を行いたい場合に使用するもののため、汎用性は高いですがぱっと見は分かりにくくなっています。

 公式ドキュメントにも以下のように記載があります。


 Amazon SES による E メールの構成方法と送信方法について、自動フォーマットよりも詳細な制御を行う必要がある場合があります。その場合には、Amazon SES raw Eメールインターフェイスを使用することにより、E メールヘッダーと MIME の種類を指定して、高度にカスタマイズされたメッセージを受取人に送信できます。


 MIMEの規格や書き方を分かっている人にとっては難しくないでしょうが、ゼロから学習するのには時間がかかってしまいますので、npmで用意されているモジュールを使うことで、今回の目的である”添付ファイル付きのメールをSESで送る”が実現できます。

 npmを検索するとわかると思いますが、様々なモジュールが用意されています。その中でも今回はmailcomposerというものを使いたいと思います。

 このモジュールを使うと、添付ファイル付きのメッセージをBuffer型で出力することができるので、先ほどのsendRawEmailのRawMessageに渡すデータを簡単に作ることができます。mailcomposerのドキュメントを見るとわかりますが、メッセージを作成する際に渡すパラメータ(From, To, Subject等)も分かりやすい表現になっています。以下に、テキストファイルを添付したメールをSESで送信する、Node.jsのサンプルコードを示します。

var AWS = require('aws-sdk');
var Promise = require('bluebird');
Promise.longStackTraces();
var mailcomposer = require('mailcomposer');

function createMessage() {
return new Promise(function(resolve, reject) {
var mailOption = {
from: '送信元メールアドレス',
to: '宛先メールアドレス',
subject: 'SES添付メールテスト',
text: 'SESテストメッセージです。',
attachments: [{
filename: 'test.txt',
content: 'ハローワールド'
}]
};
var mail = mailcomposer(mailOption);
mail.build(function(err, msg) {
if (err) {
reject(err);
} else {
console.log(msg);
resolve(msg);
}
});

});
}


function sendRawEmail(msg) {
return new Promise(function(resolve, reject) {
var ses = new AWS.SES({apiVersion: '2010-12-01', region: 'us-east-1'});
var params = {
RawMessage: {
Data: msg
}
};
ses.sendRawEmail(params, function(err, data) {
if (err) {
reject(err);
} else {
console.log(data);
resolve();
}
});
});
}


createMessage()
.then(sendRawEmail)
.then(function() {
console.log('*** sendRawEmail complete ***');
})
.catch(function(err) {
console.log('*** error ***');
console.log(err.stack);
});

 詳しくは、mailcomposerのドキュメントを参照して頂ければと思いますが、既存ファイルの保存場所を指定してメッセージを送信することもできますので、必要に応じて使い分けてください。

var mailOption = {
from: '送信元メールアドレス',
to: '宛先メールアドレス',
subject: 'SES添付メールテスト',
text: 'SESテストメッセージです。',
attachments: [{
path: './test.txt'
}]
};

ファイル添付する場合の、Amazon SESが対応していない形式もありますのでご注意ください。対応していないファイル形式はコチラで確認することができます。

さいごに

 今回はAWS SDK for JavaScript(Node.js)を使って、SESで添付ファイル付きのメールを送る方法をご紹介しました。APN プレミアコンサルティングパートナーの伊藤忠テクノソリューションズ株式会社 (以下、CTC) は AWS のコンサルティング、設計、構築・運用までをワンストップでサポートするサービス『CUVIConAWS』をご提供しています。AWS の導入にあたってお困りの点があれば、お気軽にご相談頂けますと幸いです。サービスの詳細については以下をご覧下さい。

関連記事を読む

お問合せボタン

関連記事はこちら