Node.js aws-sdk sendRawEmail发送PDF附件异常,如何修正代码?
解决AWS SES sendRawEmail发送PDF附件显示为纯文本的问题
嘿,我懂你遇到的这个糟心问题——明明邮件发出去了,但PDF附件变成乱码纯文本,完全没法正常打开对吧?其实问题出在两个地方:读取PDF文件的编码方式和邮件MIME结构的规范设置,咱们一步步来修正:
问题根源
PDF是二进制格式的文件,你之前用utf8编码读取它,会把原始的二进制数据强行转换成文本字符,直接破坏了文件的结构,所以附件才会显示成纯文本乱码。
修正方案
1. 正确读取PDF文件
要以二进制模式读取PDF,然后转换成邮件附件标准的Base64编码,这样才能保证文件数据完整。
2. 构建符合MIME规范的邮件内容
邮件需要用multipart/mixed类型的MIME结构,明确区分正文和附件部分,同时给附件设置正确的Content-Type、编码方式和附件声明。
完整修正代码
const AWS = require('aws-sdk'); const fs = require('fs'); // 配置AWS区域和SES客户端 AWS.config.update({ region: 'us-east-1' }); // 替换成你的AWS区域 const ses = new AWS.SES({ apiVersion: '2010-12-01' }); const SOURCE_EMAIL = 'your-sender@example.com'; // 替换成已验证的发件邮箱 const toEmail = 'recipient@example.com'; // 替换成收件邮箱 async function sendEmailWithPDFAttachment() { try { // 以二进制模式读取PDF文件,转换成Base64编码 const pdfBuffer = fs.readFileSync('files/demo-invoice-new.pdf'); const pdfBase64 = pdfBuffer.toString('base64'); // 生成唯一的MIME边界字符串(用来分隔邮件的不同部分) const mimeBoundary = '----=_NextPart_000_0001_01D9A1B2C3D4E5F6'; // 构建完整的MIME邮件内容 let rawEmailContent = `From: 'AWS SES Attachment Test' <${SOURCE_EMAIL}> To: ${toEmail} Subject: 测试PDF附件邮件 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="${mimeBoundary}" --${mimeBoundary} Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit 这是邮件的正文内容,下方是你需要的PDF附件。 --${mimeBoundary} Content-Type: application/pdf; name="demo-invoice-new.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="demo-invoice-new.pdf" ${pdfBase64} --${mimeBoundary}--`; // 调用SES的sendRawEmail接口 const sendParams = { RawMessage: { Data: rawEmailContent // AWS SDK会自动处理成符合要求的编码格式 } }; const result = await ses.sendRawEmail(sendParams).promise(); console.log('邮件发送成功,Message ID:', result.MessageId); } catch (error) { console.error('邮件发送失败:', error); } } // 执行发送函数 sendEmailWithPDFAttachment();
关键注意点
- 发件邮箱必须是在AWS SES中已验证的邮箱或域名,否则会发送失败
- MIME边界字符串要保证唯一,避免和邮件内容里的字符串重复
- 附件的
Content-Type必须设为application/pdf,这样邮件客户端才会识别为PDF文件 Content-Disposition: attachment会告诉客户端把这部分内容作为附件展示,而不是内嵌在正文中
内容的提问来源于stack exchange,提问作者Ansari Maksud
相关产品推荐
相关产品推荐

