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

前端 未结 2 705
粉色の甜心
粉色の甜心 2021-01-18 00:27

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. Please correct my c

相关标签:
2条回答
  • 2021-01-18 00:57

    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:

    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();
    }
    
    0 讨论(0)
  • 2021-01-18 01:03

    SES raw messages must be base64-encoded. So, you'll need to get the file content as buffer and encode it as base64 string attachment. 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. (You can also provide the Cc and Bcc fields as well)

    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. (See RFC 5321)

    0 讨论(0)
提交回复
热议问题