如何在 `Node aws-sdk` sendRawEmail 函数中发送 PDF 附件?
How can send PDF attachment in `Node aws-sdk` sendRawEmail function?
我想使用 sendRawEmail(Node: aws-sdk) 函数发送附件中的 PDF 文件,我尝试了很多方法,电子邮件发送成功,但 PDF 很普通。
请更正我的代码并帮助解决它。
代码在这里:
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 原始消息 must be base64-encoded。因此,您需要获取文件内容作为缓冲区并将其编码为 base64 字符串附件。此外,您不需要为原始消息数据创建新缓冲区,因为它已经接受字符串数据类型。
可选:您也可以省略 Destinations
参数,因为您已经在原始消息数据中提供了 To
字段。 (您也可以提供 Cc
和 Bcc
字段)
你可以试试这个,例如:
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(/([^[=10=]]{76})/g, "\n") + "\n\n";
ses_mail += "--NextPart--";
var params = {
RawMessage: {Data: ses_mail},
Source: "'AWS SES Attchament Configuration' <" + SOURCE_EMAIL + ">'"
};
注意:/([^[=15=]]{76})/
正则表达式替换会打断您的长行,以确保邮件服务器在有编码时不会抱怨消息行太长附件,这可能会导致瞬态反弹。 (参见 RFC 5321)
大家好,对于偶然发现这个问题的任何人,我设法使用 nodemailer and SESV2 解决了它,我有 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();
}
我想使用 sendRawEmail(Node: aws-sdk) 函数发送附件中的 PDF 文件,我尝试了很多方法,电子邮件发送成功,但 PDF 很普通。 请更正我的代码并帮助解决它。
代码在这里:
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 原始消息 must be base64-encoded。因此,您需要获取文件内容作为缓冲区并将其编码为 base64 字符串附件。此外,您不需要为原始消息数据创建新缓冲区,因为它已经接受字符串数据类型。
可选:您也可以省略 Destinations
参数,因为您已经在原始消息数据中提供了 To
字段。 (您也可以提供 Cc
和 Bcc
字段)
你可以试试这个,例如:
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(/([^[=10=]]{76})/g, "\n") + "\n\n";
ses_mail += "--NextPart--";
var params = {
RawMessage: {Data: ses_mail},
Source: "'AWS SES Attchament Configuration' <" + SOURCE_EMAIL + ">'"
};
注意:/([^[=15=]]{76})/
正则表达式替换会打断您的长行,以确保邮件服务器在有编码时不会抱怨消息行太长附件,这可能会导致瞬态反弹。 (参见 RFC 5321)
大家好,对于偶然发现这个问题的任何人,我设法使用 nodemailer and SESV2 解决了它,我有 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();
}