You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:19:10