この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS SDK for Node.js を使って、Amazon SES からメール送信してみます。
単純に Node.js からメール送信するだけなのもなんなんで、Twitter Bootstrap を使って以下のようなフィードバックフォームを作りました。
このフォームから、Node.js に Post して Amazon SES 経由でメール送信するロジックを作ってみます。
Amazon SES の設定
Amazon SES は、Amazon Simple Email Service の略で、AWS のメール送信サービスです。
production 環境ではない場合は、メールアドレスを事前に登録する必要があります。
Management Console を使って、SES の画面を開き、Verify a New Email Address から 送信したいメールアドレスを入力して、Verify This Email Address をクリックします。
メールアドレスを入力し、Verify This Email Address をクリックします。
メールが届くので、リンクをクリックして認証させます。
IAMアカウントの作成
次に、Create User for SMTP から、メール送信のポリシーに紐づいた IAMアカウント を作成します。
IAM ユーザの名前を入力して登録します。
Username と Password が表示されるので、メモもしくは、CSVファイルをDownloadしておきます。
メールを送るポリシーは2種類あります。
- SendRawEmail(自由フォーマット)
- From、To、Subject、BodyをAPIで指定
- SendEmail(定型フォーマット)
- ヘッダ、MIME Type、BodyをAPIで指定
上記の手順で、IAMアカウントを作成した場合、SendRawEmailポリシー しかアタッチされていません。
今回は、SendEmail ポリシーを使って、メール送信を行うので、SendEmailポリシー もアタッチしましょう。
Permissions の Attach User Policy をクリックします。
Policy Generator を選択。
SendEmailを追加します。
AWS SDK for Node.js を使う
さてここからが Node.js です。。AWS SDK で Amazon SES 経由でメール送信するロジックを記述します。
先ずは、express でスケルトンを作成。
$ express aws-ses-sample
package.json で aws-sdk を使うように指定します。(※テンプレートエンジンは、ejs を使っています)
{
"name": "application-name",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node-dev app"
},
"dependencies": {
"express": "3.0.3",
"ejs": "*",
"aws-sdk": "*"
}
}
npm install でモジュールをインストール。
$ npm install
aws-sdk@0.9.7-pre.8 node_modules/aws-sdk
├── xmlbuilder@0.4.2
└── xml2js@0.2.4 (sax@0.5.2)
Node.js のコードはこんな感じ。
/*
* POST feedback.
*/
exports.index = function(req, res, next) {
var AWS = require('aws-sdk');
AWS.config.loadFromPath('./config/credentials.json');
var text = req.body.text;
var ses = new AWS.SES({sslEnabled: true});
var params = {
Source: 'xxx@xxx',
Destination: {
ToAddresses: ['xxx@xxx'],
},
Message: {
Subject: {
Data: '【Feedback】'
},
Body: {
Text: {
Data: text
}
}
}
};
ses.client.sendEmail(params, function (err, data) {
if (err) {
next(err);
} else {
res.send();
}
});
}
上記で指定しているcredentials.jsonは以下の通り
{ "accessKeyId": "XXXXXXXXXX", "secretAccessKey": "XXXXXXXXXX", "region": "us-east-1" }
accessKeyId と secretAccessKey は、上記のIAMアカウントを作成した時の SMTP Security Credential を指定します。
SES は、us-east-1 リージョンにホストされているため、リージョンは us-east-1 を指定します。
クライアント側の実装
HTMLはこんな感じです。
<!DOCTYPE html lang="ja">
<html>
<head>
<title>AWS SES Example</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="stylesheets/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body>
<div class="container" style="padding-top: 24px;">
<a href="#feedbackModal" class="btn btn-primary" data-toggle="modal">Launch Feedback</a>
</div>
<div id="feedbackModal" class="modal hide fade">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3>Send us feedback</h3>
</div>
<div class="modal-body">
<textarea id="feedback" class="span7" rows="8" placeholder="ご意見・ご感想をご記入ください"></textarea>
</div>
<div class="modal-footer">
<a id="send" href="#" class="btn btn-primary">Send feedback</a>
</div>
</div>
<script src="http://code.jquery.com/jquery.js"></script>
<script src="javascripts/bootstrap.min.js"></script>
<script src="javascripts/feedback.js"></script>
</body>
</html>
フロントの javascript にて、Send feedback ボタンクリック時に、入力されたメッセージを Node.js に Post します。
$(function(){
$('#send').click(function(){
$.ajax({
type: 'post',
url: 'feedback',
data: {
text: $('#feedback').val()
},
success: function() {
alert('success');
}
});
});
});
メール送信してみる
フォームに入力して、Send feedback ボタンをクリックします。
無事メールが届きました。
今回のソースコードは、GitHub にアップしています。よろしければどーぞ。
参考URL
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SES/Client.html