【AWS】使用AWS的SES来发送邮件(使用nodejs)
重要文件
仅限于经过验证的电子邮件地址或经过验证的域名才能发送和接收邮件。在应用程序的某个时间点,将向任何指定的电子邮件地址发送一封电子邮件。
请参考下面的github链接获取本文中的示例源代码。
前提 – Qian ti
-
- Route53 で登録しているドメイン名のアドレス (support@xxx.yyy.zzz) をFROMとする
-
- Node.js環境
- AWSアカウント
域名认证
SES控制台
-
- 打开Amazon SES控制台。
-
- 点击导航栏中的[创建身份]。
-
- 选择身份类型为域名。
-
- 填写在Route53中已注册的域名。
- 点击[创建身份]按钮。
Node.js
如果通过Node.js,请参考以下文件进行域名 ID 的验证。
// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set region
AWS.config.update({region: 'REGION'});
// Create the promise and SES service object
var verifyDomainPromise = new AWS.SES({apiVersion: '2010-12-01'}).verifyDomainIdentity({Domain: "DOMAIN_NAME"}).promise();
// Handle promise's fulfilled/rejected states
verifyDomainPromise.then(
function(data) {
console.log("Verification Token: " + data.VerificationToken);
}).catch(
function(err) {
console.error(err, err.stack);
});
注册发信人邮箱地址(From)
必须注册发件人地址。从SES控制台进行注册的情况下,上述域名注册方式几乎相同。
如果通过nodejs,可以参考以下源码。
另外,关于收件人地址,对于sandbox模式,必须进行注册才能发送,但是一旦解除sandbox,可以自由地发送邮件,无需注册收件人地址。
// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set region
AWS.config.update({region: 'REGION'});
// Create promise and SES service object
var verifyEmailPromise = new AWS.SES({apiVersion: '2010-12-01'}).verifyEmailIdentity({EmailAddress: "ADDRESS@DOMAIN.EXT"}).promise();
// Handle promise's fulfilled/rejected states
verifyEmailPromise.then(
function(data) {
console.log("Email verification initiated");
}).catch(
function(err) {
console.error(err, err.stack);
});
寄件人的處理
如果您将发件人姓名设置为以下内容,您就可以进行发件人姓名的设置。
Source: '送信者名 <mail address>'
然而,如果发件人名称为日语,则会显示乱码。
在发送时,应将发件人名称进行MIME编码,并放入Source参数中。
(不要对电子邮件地址进行编码)
SDK: libmime
示例源代码:
var awsSdk = require('aws-sdk');
var libmime = require('libmime');
AWS.config.update({region: 'ap-northeast-1'})
const ses = new AWS.SES({apiVersion: '2010-12-01'})
exports.handler = (event, context, callback) => {
// 送信先
var to = ['送信先メールアドレス'];
// 送信元
var from = '送信者メールアドレス';
// 送信者名
var fromName = '私がメールを送ったマン';
// 送信者名 MIMEエンコード
fromName = libmime.encodeWord(fromName, 'Q');
from = fromName + ' <' + from + '>';
// 件名
var subject = 'メールタイトル';
// 本文
var body = '本文です。';
// SES 送信用 パラメータ
var params = {
Destination: {
ToAddresses: [to]
},
Message: {
Body: {
Text: {
Data: body,
Charset: 'utf-8'
}
},
Subject: {
Data: subject,
Charset: 'utf-8'
}
},
Source: from
};
var email = ses.sendEmail(params, function(err, data){
if(!err) {
// 成功
callback(null, data);
}
});
};
職業郵件HTML的支持
如果要使用HTML发送,请将消息的正文转换为HTML格式,就可以发送了。但是对于运营商邮件来说,HTML会出现乱码的问题。
var params = {
Destination: {
ToAddresses: [to]
},
Message: {
Body: {
Html: {
Data: messageBody,
Charset: 'utf-8'
}
},
Subject: {
Data: subject,
Charset: 'utf-8'
}
},
Source: from
};
var email = ses.sendEmail(params, function(err, data){
if(!err) {
// 成功
callback(null, data);
}
});
在这种情况下,我们可以使用多部分传输进行修改。
将HTML转换为文本
首先,我们需要将HTML的body部分转换成文本。我们可以使用html-to-text的SDK来进行简单的转换。
const htmlToText = require('html-to-text')
// html-to-textを使用してHTMLをテキストに変換
const plainText = htmlToText.htmlToText(messageBody, {
wordwrap: true, // 改行する
ignoreImage: true // 画像を無視
})
多部分投递(sendRawEmail)
使用ses的sendRawEmail函数。
// テキストとHTMLメッセージを結合してMultiPartメッセージを構築
const multiPartMessage = `From: ${fromName} <${from}>\n`
+ `To: ${toAddresses.join(', ')}\n`
+ `Subject: ${title}\n`
+ 'MIME-Version: 1.0\n'
+ 'Content-Type: multipart/alternative;\n'
+ ' boundary="----=_Part_0_1234567890"\n\n'
+ '------=_Part_0_1234567890\n'
+ `Content-Type: text/plain; charset=utf-8\n\n${plainText}\n\n`
+ '------=_Part_0_1234567890\n'
+ `Content-Type: text/html; charset=utf-8\n\n${htmlMessage}\n\n`
+ '------=_Part_0_1234567890--'
const params = {
RawMessage: {
Data: multiPartMessage
},
Destinations: toAddresses,
Source: `${fromName} <${from}>\n`
}
return new Promise(function (resolve, reject) {
ses.sendRawEmail(params, function (err, data) {
if (err) {
reject(err)
} if (data) {
resolve(data)
}
})
})
申请减轻上限
-
- Amazon SES サンドボックス
-
- 詐欺行為や不正行為防止及びISPからのSPAM認定回避のため、新規ユーザーのアカウントは、サンドボックス(検証目的の環境)に配置され、動作の一部に制限を受けます。
-
- 送信できるのは1日あたり200通まで、1秒あたり1メッセージまで。
-
- アカウントをサンドボックスの外に移動する手続きを行うと、制限が解除された環境で動作します。
- 手続きには 1 営業日かかるそうです。
请你提供这个题目的原文,我才能为您进行中文的同义重述。
-
- AWS Javascript SDK SESリファレンス
- ドキュメント