简体   繁体   English

如何在 `Node aws-sdk` sendRawEmail 函数中发送 PDF 附件?

[英]How can send PDF attachment in `Node aws-sdk` sendRawEmail function?

I want to send PDF file in attachment using sendRawEmail(Node: aws-sdk) function, I have tried lots of ways, email sends successfully but PDF goes plain.我想使用 sendRawEmail(Node: aws-sdk) 函数发送附件中的 PDF 文件,我尝试了很多方法,电子邮件发送成功但 PDF 变得平淡无奇。 Please correct my code and help to solve it.请更正我的代码并帮助解决它。

Code is here:代码在这里:

try {
    data = fs.readFileSync('files/demo-invoice-new.pdf', 'utf8');

    console.log(data.toString());

    var ses_mail = "From: 'AWS SES Attchament Configuration' <" + SOURCE_EMAIL + ">\n";
    ses_mail = ses_mail + "To: " + toEmail + "\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: application/octet;\n";
    ses_mail = ses_mail + "Content-Disposition: attachment; filename=\"demo-invoice-new.pdf\"\n\n";
    ses_mail = ses_mail + data.toString('utf8') + "\n\n";
    ses_mail = ses_mail + "--NextPart--";

    var params = {
        RawMessage: { Data: new Buffer(ses_mail) },
        Destinations: [toEmail],
        Source: "'AWS SES Attchament Configuration' <" + SOURCE_EMAIL + ">'"
    };

    console.log(params);

    var sendPromise = new AWS.SES(AWS_SES_CONFIG).sendRawEmail(params).promise();

    return sendPromise.then(
        data => {
            console.log(data);
            return data;
        }).catch(
        err => {
            console.error(err.message);
            throw err;
        });
} catch (e) {
    console.log('Error:', e.stack);
}

SES raw messages must be base64-encoded . SES 原始消息必须是 base64 编码的 So, you'll need to get the file content as buffer and encode it as base64 string attachment.因此,您需要获取文件内容作为缓冲区并将其编码为 base64 字符串附件。 Also, you don't need to create a new buffer for raw message data since it already accepts a string data type.此外,您不需要为原始消息数据创建新缓冲区,因为它已经接受字符串数据类型。

OPTIONAL : You can also omit the Destinations parameter since you're already providing the To field in the raw message data.可选:您也可以省略Destinations参数,因为您已经在原始消息数据中提供了To字段。 (You can also provide the Cc and Bcc fields as well) (您也可以提供CcBcc字段)

You could try this for example:你可以试试这个,例如:

data = fs.readFileSync("files/demo-invoice-new.pdf");

var ses_mail = "From: 'AWS SES Attchament Configuration' <" + SOURCE_EMAIL + ">\n";
ses_mail += "To: " + toEmail + "\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\n\n";
ses_mail += "This is the body of the email.\n\n";
ses_mail += "--NextPart\n";
ses_mail += "Content-Type: application/octet-stream; name=\"demo-invoice-new.pdf\"\n";
ses_mail += "Content-Transfer-Encoding: base64\n";
ses_mail += "Content-Disposition: attachment\n\n";
ses_mail += data.toString("base64").replace(/([^\0]{76})/g, "$1\n") + "\n\n";
ses_mail += "--NextPart--";

var params = {
    RawMessage: {Data: ses_mail},
    Source: "'AWS SES Attchament Configuration' <" + SOURCE_EMAIL + ">'"
};

NOTE : The /([^\0]{76})/ regular expression replacement breaks your long lines to make sure that mail servers do not complain about message lines being too long when there is an encoded attachment, which might result in a transient bounce.注意/([^\0]{76})/正则表达式替换会打断您的长行,以确保邮件服务器在有编码附件时不会抱怨消息行太长,这可能会导致短暂的弹跳。 (See RFC 5321 ) (参见RFC 5321

Hi there for anybody who stumbles upon this problem I managed to solve it using nodemailer and SESV2 , I had base64 encoded data so your script might be a little different from mine but the snippet below should give you an idea... Here's my solution hope it helps someone:嗨,对于任何偶然发现这个问题的人,我设法使用nodemailerSESV2解决了它,我有 base64 编码的数据,所以你的脚本可能与我的有点不同,但下面的代码片段应该给你一个想法......这是我的解决方案希望它可以帮助某人:

const MailComposer = require("nodemailer/lib/mail-composer");
const AWS = require("aws-sdk");

const generateRawMailData = (message) => {
    let mailOptions = {
        from: message.fromEmail,
        to: message.to,
        subject: message.subject,
        text: message.bodyTxt,
        html: message.bodyHtml,
        attachments: message.attachments.map(a => ({ filename: a.name, content: a.data, encoding: 'base64' }))
    };
    return new MailComposer(mailOptions).compile().build();
};

const exampleSendEmail = async () => {
    var message = {
        fromEmail: "sender@server.com",
        to: "receiver@sender.com",
        subject: "Message title",
        bodyTxt: "Plaintext version of the message",
        bodyHtml: "<p>HTML version of the message</p>",
        attachments: [{
            name: 'hello.txt',
            data: 'aGVsbG8gd29ybGQ='
        }]
    };

    let ses = new AWS.SESV2(),
    params = {
      Content: { Raw: { Data: await generateRawMailData(message) } },
      Destination: {
        ToAddresses: message.to,
        BccAddresses: message.bcc,
      },
      FromEmailAddress: message.fromEmail,
      ReplyToAddresses: message.replyTo,
    };

  return ses.sendEmail(params).promise();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM