使用node.js中的AWS SES在邮件中上载.jpg图像附件

使用node.js中的AWS SES在邮件中上载.jpg图像附件,node.js,amazon-web-services,amazon-s3,amazon-ses,Node.js,Amazon Web Services,Amazon S3,Amazon Ses,下面是代码,其中有一个示例可以发送和发送带有附件的电子邮件 我修改了代码,从aws s3获取一个图像文件,并将其作为附件与邮件一起发送,当我为文本文件发送图像时,它工作得非常好,但当我发送图像时,在邮件中我无法看到图像,因为它已损坏 当我尝试使用apple photo app打开时,它显示元数据丢失,并且我在邮件标题中添加了内容传输编码:base64,当我尝试在标题中使用utf8、utf-8和utf-8进行内容传输编码时,我得到了aws的以下响应 { "message": "Unknown

下面是代码,其中有一个示例可以发送和发送带有附件的电子邮件

我修改了代码,从aws s3获取一个图像文件,并将其作为附件与邮件一起发送,当我为文本文件发送图像时,它工作得非常好,但当我发送图像时,在邮件中我无法看到图像,因为它已损坏

当我尝试使用apple photo app打开时,它显示元数据丢失,并且我在邮件标题中添加了内容传输编码:base64,当我尝试在标题中使用utf8、utf-8和utf-8进行内容传输编码时,我得到了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);
});
//需要对象。
var express=需要(“express”);
var-app=express();
var aws=要求('aws-sdk');
//使用您的电子邮件地址编辑此。
var email=“******@gmail.com”;
//加载AWS凭据并尝试实例化该对象。
aws.config.loadFromPath(uu dirname+'/config.json');
//实例化SES。
var ses=新的aws.ses();
var s3=新的aws.s3();
//验证电子邮件地址。
app.get('/verify',函数(req,res){
变量参数={
电邮地址:电邮
};
验证电子邮件地址(参数、函数(错误、数据){
如果(错误){
res.send(err);
}
否则{
res.send(数据);
}
});
});
//列出已验证的电子邮件地址。
app.get('/list',函数(req,res){
ses.listVerifiedEmailAddresses(函数(错误,数据){
如果(错误){
res.send(err);
}
否则{
res.send(数据);
}
});
});
//删除已验证的电子邮件地址。
app.get('/delete',函数(req,res){
变量参数={
电邮地址:电邮
};
ses.deleteVerifiedEmailAddress(参数、函数(错误、数据){
如果(错误){
res.send(err);
}
否则{
res.send(数据);
}
});
});
//发送包含附件的原始电子邮件。
app.get('/send',函数(req,res){
var params={Bucket:'s3mailattachments',Key:'aadhar.jpg'};
var附件数据;
s3.getObject(参数、函数(错误、数据){
如果(错误)
console.log(err,err.stack);//发生错误
否则{
console.log(data.ContentLength);
console.log(data.ContentType);
console.log(data.Body);
var ses_mail=“From:‘AWS教程系列’\n”;
ses_-mail=ses_-mail+”收件人:“+email+”\n”;
ses_mail=ses_mail+“主题:AWS ses附件示例\n”;
ses_mail=ses_mail+“MIME版本:1.0\n”;
ses\U mail=ses\U mail+“内容类型:多部分/混合;边界=\“下一部分\”\n\n”;
ses_mail=ses_mail+“--NextPart\n”;
ses_mail=ses_mail+“内容类型:text/html;字符集=us ascii\n\n”;
ses_mail=ses_mail+“这是电子邮件的正文。\n\n”;
ses_mail=ses_mail+“--NextPart\n”;
ses_mail=ses_mail+“内容类型:图像/jpeg;\n”;
ses_mail=ses_mail+“内容配置:附件;文件名=\”aadhar.jpg\“\n”;
ses_mail=ses_mail+“内容传输编码:base64\n\n”
ses_mail=ses_mail+data.Body;
ses_mail=ses_mail+“--NextPart”;
变量参数={
RawMessage:{Data:newbuffer(ses_-mail)},
目的地:[电子邮件],
资料来源:“AWS教程系列”
};
ses.sendRawEmail(参数、函数(错误、数据){
如果(错误){
res.send(err);
}
否则{
res.send(数据);
}
});
}
});
});
//启动服务器。
var server=app.listen(3003,函数(){
var host=server.address().address;
var port=server.address().port;
log('AWS SES示例应用程序侦听http://%s:%s',主机,端口);
});

首先,您的MIME消息格式不正确。最后一行应该是
--NextPart-->/code>,而不仅仅是
--NextPart

您还应该使用
新缓冲区(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 += new Buffer(data.Body).toString('base64');
ses_mail += "--NextPart--";
var ses_mail=“From:'AWS教程系列”\n;
ses_mail+=“收件人:”+电子邮件+“\n”;
ses_mail+=“主题:AWS ses附件示例\n”;
ses_mail+=“MIME版本:1.0\n”;
ses\u mail+=“内容类型:多部分/混合;边界=\”下一部分\“\n\n”;
ses_mail+=“--NextPart\n”;
ses_mail+=“内容类型:text/html;字符集=us ascii\n\n”;
ses_mail+=“这是电子邮件的正文。\n\n”;
ses_mail+=“--NextPart\n”;
ses_mail+=“内容类型:图像/jpeg;\n”;
ses_mail+=“内容配置:附件;文件名=\”aadhar.jpg\“\n”;
ses_mail+=“内容传输编码:base64\n\n”
ses_mail+=新缓冲区(data.Body).toString('base64');
ses_mail+=“--NextPart--”;

然后,您可以将
ses_-mail
字符串作为原始消息数据传递为
RawMessage:{data:ses_-mail}
,而不是
RawMessage:{data:new Buffer(ses_-mail)}

解决此问题的另一种方法是传递nodemailer邮件选项参数(内联图像附件cid:aadhar和所有)进入NodeEmailer composer,为您生成缓冲区数据,如下所示:

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:我正在使用笨拙的
回调
技术来最小化答案的复杂性。请随意将构建调用封装在承诺中,并异步/等待缓冲区数据,然后将其分别传递给您的
ses.sendrawmail
方法。

+1,很好,您能提到为什么我应该只使用base64而不使用其他缓冲区数据吗