使用来自 node.js 的 AWS SES 在邮件中上传 .jpg 图像附件
upload .jpg image attachment in mail using AWS SES from node.js
下面是来自 https://github.com/andrewpuch/aws-ses-node-js-examples 的代码,其中有一个发送和电子邮件附件的示例,
我修改了代码以从 aws s3 获取图像文件并将其作为附件作为邮件发送,当我为文本文件执行此操作时效果很好,但是当我发送图像时,在邮件中我无法看到图像,因为它已损坏。
当我尝试用 apple photo 应用程序打开时,它显示缺少元数据,我还在邮件的 header 中添加了 Content-Transfer-Encoding: base64,当我尝试使用 utf8 时, Content-Transfer-Encoding中的 utf-8 和 UTF-8 在 header 中 我从 aws
得到了以下响应
{
"message": "Unknown encoding: utf8",
"code": "InvalidParameterValue",
"time": "2017-03-14T08:42:43.571Z",
"requestId": "2e220c33-0892-11e7-8a5a-1114bbc28c3e",
"statusCode": 400,
"retryable": false,
"retryDelay": 29.798455792479217
}
我修改了代码以通过邮件发送图像附件,我什至尝试将缓冲区编码为 utf-8,base-64,在这上面浪费了足够的时间,不知道为什么它已损坏,如果有人这样做的话之前,帮帮我
// Require objects.
var express = require('express');
var app = express();
var aws = require('aws-sdk');
// Edit this with YOUR email address.
var email = "*******@gmail.com";
// Load your AWS credentials and try to instantiate the object.
aws.config.loadFromPath(__dirname + '/config.json');
// Instantiate SES.
var ses = new aws.SES();
var s3 = new aws.S3();
// Verify email addresses.
app.get('/verify', function (req, res) {
var params = {
EmailAddress: email
};
ses.verifyEmailAddress(params, function (err, data) {
if (err) {
res.send(err);
}
else {
res.send(data);
}
});
});
// Listing the verified email addresses.
app.get('/list', function (req, res) {
ses.listVerifiedEmailAddresses(function (err, data) {
if (err) {
res.send(err);
}
else {
res.send(data);
}
});
});
// Deleting verified email addresses.
app.get('/delete', function (req, res) {
var params = {
EmailAddress: email
};
ses.deleteVerifiedEmailAddress(params, function (err, data) {
if (err) {
res.send(err);
}
else {
res.send(data);
}
});
});
// Sending RAW email including an attachment.
app.get('/send', function (req, res) {
var params = { Bucket: 's3mailattachments', Key: 'aadhar.jpg' };
var attachmentData;
s3.getObject(params, function (err, data) {
if (err)
console.log(err, err.stack); // an error occurred
else {
console.log(data.ContentLength);
console.log(data.ContentType);
console.log(data.Body);
var ses_mail = "From: 'AWS Tutorial Series' <" + email + ">\n";
ses_mail = ses_mail + "To: " + email + "\n";
ses_mail = ses_mail + "Subject: AWS SES Attachment Example\n";
ses_mail = ses_mail + "MIME-Version: 1.0\n";
ses_mail = ses_mail + "Content-Type: multipart/mixed; boundary=\"NextPart\"\n\n";
ses_mail = ses_mail + "--NextPart\n";
ses_mail = ses_mail + "Content-Type: text/html; charset=us-ascii\n\n";
ses_mail = ses_mail + "This is the body of the email.\n\n";
ses_mail = ses_mail + "--NextPart\n";
ses_mail = ses_mail + "Content-Type: image/jpeg; \n";
ses_mail = ses_mail + "Content-Disposition: attachment; filename=\"aadhar.jpg\"\n";
ses_mail = ses_mail + "Content-Transfer-Encoding: base64\n\n"
ses_mail = ses_mail + data.Body;
ses_mail = ses_mail + "--NextPart";
var params = {
RawMessage: { Data: new Buffer(ses_mail) },
Destinations: [email],
Source: "'AWS Tutorial Series' <" + email + ">'"
};
ses.sendRawEmail(params, function (err, data) {
if (err) {
res.send(err);
}
else {
res.send(data);
}
});
}
});
});
// Start server.
var server = app.listen(3003, function () {
var host = server.address().address;
var port = server.address().port;
console.log('AWS SES example app listening at http://%s:%s', host, port);
});
首先,您的 MIME 邮件格式不正确。最后一行应该是 --NextPart--
而不是 --NextPart
.
您还应该使用 Buffer.from(data.Body).toString('base64')
将 data.Body
数组转换为其 base64 字符串表示形式,如下所示:
var ses_mail = "From: 'AWS Tutorial Series' <" + email + ">\n";
ses_mail += "To: " + email + "\n";
ses_mail += "Subject: AWS SES Attachment Example\n";
ses_mail += "MIME-Version: 1.0\n";
ses_mail += "Content-Type: multipart/mixed; boundary=\"NextPart\"\n\n";
ses_mail += "--NextPart\n";
ses_mail += "Content-Type: text/html; charset=us-ascii\n\n";
ses_mail += "This is the body of the email.\n\n";
ses_mail += "--NextPart\n";
ses_mail += "Content-Type: image/jpeg; \n";
ses_mail += "Content-Disposition: attachment; filename=\"aadhar.jpg\"\n";
ses_mail += "Content-Transfer-Encoding: base64\n\n"
ses_mail += Buffer.from(data.Body).toString('base64');
ses_mail += "--NextPart--";
然后,您可以将 ses_mail
字符串作为原始消息数据传递为 RawMessage: { Data: ses_mail }
而不是 RawMessage: { Data: new Buffer(ses_mail) }
。
解决这个问题的另一种方法是将您的 nodemailer MailOptions 参数(内联图像附件 cid:aadhar 和所有)传递给 nodemailer 作曲家,为您生成缓冲区数据,如下所示:
import MailComposer from 'nodemailer/lib/mail-composer';
new MailComposer( mailOptions )
.compile()
.build(( err, Data ) => {
if( err !== null ) {
process.stderr.write( err ); // for example
return;
}
ses.sendRawEmail({
RawMessage: {
Data
}
});
});
Ps:我正在使用笨拙的 callback
技术来尽量减少答案的复杂性。随意将构建调用包装在 promise 和 async/wait 您的缓冲区数据中,然后您可以将其单独传递给您的 ses.sendRawEmail
方法。
下面是来自 https://github.com/andrewpuch/aws-ses-node-js-examples 的代码,其中有一个发送和电子邮件附件的示例,
我修改了代码以从 aws s3 获取图像文件并将其作为附件作为邮件发送,当我为文本文件执行此操作时效果很好,但是当我发送图像时,在邮件中我无法看到图像,因为它已损坏。
当我尝试用 apple photo 应用程序打开时,它显示缺少元数据,我还在邮件的 header 中添加了 Content-Transfer-Encoding: base64,当我尝试使用 utf8 时, Content-Transfer-Encoding中的 utf-8 和 UTF-8 在 header 中 我从 aws
得到了以下响应{
"message": "Unknown encoding: utf8",
"code": "InvalidParameterValue",
"time": "2017-03-14T08:42:43.571Z",
"requestId": "2e220c33-0892-11e7-8a5a-1114bbc28c3e",
"statusCode": 400,
"retryable": false,
"retryDelay": 29.798455792479217
}
我修改了代码以通过邮件发送图像附件,我什至尝试将缓冲区编码为 utf-8,base-64,在这上面浪费了足够的时间,不知道为什么它已损坏,如果有人这样做的话之前,帮帮我
// Require objects.
var express = require('express');
var app = express();
var aws = require('aws-sdk');
// Edit this with YOUR email address.
var email = "*******@gmail.com";
// Load your AWS credentials and try to instantiate the object.
aws.config.loadFromPath(__dirname + '/config.json');
// Instantiate SES.
var ses = new aws.SES();
var s3 = new aws.S3();
// Verify email addresses.
app.get('/verify', function (req, res) {
var params = {
EmailAddress: email
};
ses.verifyEmailAddress(params, function (err, data) {
if (err) {
res.send(err);
}
else {
res.send(data);
}
});
});
// Listing the verified email addresses.
app.get('/list', function (req, res) {
ses.listVerifiedEmailAddresses(function (err, data) {
if (err) {
res.send(err);
}
else {
res.send(data);
}
});
});
// Deleting verified email addresses.
app.get('/delete', function (req, res) {
var params = {
EmailAddress: email
};
ses.deleteVerifiedEmailAddress(params, function (err, data) {
if (err) {
res.send(err);
}
else {
res.send(data);
}
});
});
// Sending RAW email including an attachment.
app.get('/send', function (req, res) {
var params = { Bucket: 's3mailattachments', Key: 'aadhar.jpg' };
var attachmentData;
s3.getObject(params, function (err, data) {
if (err)
console.log(err, err.stack); // an error occurred
else {
console.log(data.ContentLength);
console.log(data.ContentType);
console.log(data.Body);
var ses_mail = "From: 'AWS Tutorial Series' <" + email + ">\n";
ses_mail = ses_mail + "To: " + email + "\n";
ses_mail = ses_mail + "Subject: AWS SES Attachment Example\n";
ses_mail = ses_mail + "MIME-Version: 1.0\n";
ses_mail = ses_mail + "Content-Type: multipart/mixed; boundary=\"NextPart\"\n\n";
ses_mail = ses_mail + "--NextPart\n";
ses_mail = ses_mail + "Content-Type: text/html; charset=us-ascii\n\n";
ses_mail = ses_mail + "This is the body of the email.\n\n";
ses_mail = ses_mail + "--NextPart\n";
ses_mail = ses_mail + "Content-Type: image/jpeg; \n";
ses_mail = ses_mail + "Content-Disposition: attachment; filename=\"aadhar.jpg\"\n";
ses_mail = ses_mail + "Content-Transfer-Encoding: base64\n\n"
ses_mail = ses_mail + data.Body;
ses_mail = ses_mail + "--NextPart";
var params = {
RawMessage: { Data: new Buffer(ses_mail) },
Destinations: [email],
Source: "'AWS Tutorial Series' <" + email + ">'"
};
ses.sendRawEmail(params, function (err, data) {
if (err) {
res.send(err);
}
else {
res.send(data);
}
});
}
});
});
// Start server.
var server = app.listen(3003, function () {
var host = server.address().address;
var port = server.address().port;
console.log('AWS SES example app listening at http://%s:%s', host, port);
});
首先,您的 MIME 邮件格式不正确。最后一行应该是 --NextPart--
而不是 --NextPart
.
您还应该使用 Buffer.from(data.Body).toString('base64')
将 data.Body
数组转换为其 base64 字符串表示形式,如下所示:
var ses_mail = "From: 'AWS Tutorial Series' <" + email + ">\n";
ses_mail += "To: " + email + "\n";
ses_mail += "Subject: AWS SES Attachment Example\n";
ses_mail += "MIME-Version: 1.0\n";
ses_mail += "Content-Type: multipart/mixed; boundary=\"NextPart\"\n\n";
ses_mail += "--NextPart\n";
ses_mail += "Content-Type: text/html; charset=us-ascii\n\n";
ses_mail += "This is the body of the email.\n\n";
ses_mail += "--NextPart\n";
ses_mail += "Content-Type: image/jpeg; \n";
ses_mail += "Content-Disposition: attachment; filename=\"aadhar.jpg\"\n";
ses_mail += "Content-Transfer-Encoding: base64\n\n"
ses_mail += Buffer.from(data.Body).toString('base64');
ses_mail += "--NextPart--";
然后,您可以将 ses_mail
字符串作为原始消息数据传递为 RawMessage: { Data: ses_mail }
而不是 RawMessage: { Data: new Buffer(ses_mail) }
。
解决这个问题的另一种方法是将您的 nodemailer MailOptions 参数(内联图像附件 cid:aadhar 和所有)传递给 nodemailer 作曲家,为您生成缓冲区数据,如下所示:
import MailComposer from 'nodemailer/lib/mail-composer';
new MailComposer( mailOptions )
.compile()
.build(( err, Data ) => {
if( err !== null ) {
process.stderr.write( err ); // for example
return;
}
ses.sendRawEmail({
RawMessage: {
Data
}
});
});
Ps:我正在使用笨拙的 callback
技术来尽量减少答案的复杂性。随意将构建调用包装在 promise 和 async/wait 您的缓冲区数据中,然后您可以将其单独传递给您的 ses.sendRawEmail
方法。