AWS SDK for Node.js を使ってフィードバックフォームからメール送信する
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