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

在Nodemailer中用raw属性构建带HTML附件的MIME邮件遇问题

用Nodemailer raw属性构建MIME邮件的问题修复

你的代码在MIME结构、边界符使用、编码处理上存在几个关键问题,导致邮件显示异常,以下是修正方案:

原代码的核心问题

  • MIME结构混乱:全局头部先声明了text/html类型,之后又声明multipart/mixed,这会让邮件解析器混淆;正确的结构应该是全局头部声明multipart/mixed,再用边界符分隔正文和附件两个子部分。
  • 边界符错误:定义的boundary是"--boundary",实际使用时应该用--boundary(开头两个短横),结尾的终止边界需要是--boundary--(前后各两个短横),你原代码结尾写的---boundary--多了一个短横,导致附件无法被正确识别。
  • 正文编码不匹配:你声明了正文的Content-Transfer-Encoding: base64,但直接把未编码的HTML字符串放进去,解析器会把它当成base64解码,自然显示乱码或原始base64内容。
  • 头部顺序错误:MIME-Version应该放在Content-Type之前,这是MIME规范的要求。

修正后的代码

const fs = require('fs');
const attachmentPath = './Attachment/index.html';
const oppoxHTML = '<html>hello World</html>';

// 对正文HTML进行base64编码
const encodedBody = Buffer.from(oppoxHTML).toString('base64');
// 读取附件并编码
const encodedAttachment = fs.readFileSync(attachmentPath).toString('base64');

const rawContent = `From: "Joe Man" <mysender@gmail.com>
To: myemail@gmail.com
Subject: Test email with HTML attachment
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="boundary"

--boundary
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64

${encodedBody}

--boundary
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="attachment.html"

${encodedAttachment}

--boundary--`;

关键修正点说明

  1. 调整全局头部结构:只保留邮件基础头部(From/To/Subject/MIME-Version),然后声明multipart/mixed类型和正确的边界符,头部和第一个子部分之间必须加空行。
  2. 正确使用边界符:每个子部分用--boundary开头,最后用--boundary--终止,边界符前后的空行不能少,这是MIME解析的关键。
  3. 正文正确编码:把原始HTML字符串转成base64后再放入,和声明的编码方式匹配。
  4. 附件编码一致:附件内容也做base64编码,同时加上Content-Transfer-Encoding: base64声明(你之前注释掉了,现在要加上)。

这样调整后,邮件解析器就能正确区分正文和附件,不会出现显示异常的情况。

内容的提问来源于stack exchange,提问作者Diana Studebaker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:52:53