在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--`;
关键修正点说明
- 调整全局头部结构:只保留邮件基础头部(From/To/Subject/MIME-Version),然后声明
multipart/mixed类型和正确的边界符,头部和第一个子部分之间必须加空行。 - 正确使用边界符:每个子部分用
--boundary开头,最后用--boundary--终止,边界符前后的空行不能少,这是MIME解析的关键。 - 正文正确编码:把原始HTML字符串转成base64后再放入,和声明的编码方式匹配。
- 附件编码一致:附件内容也做base64编码,同时加上
Content-Transfer-Encoding: base64声明(你之前注释掉了,现在要加上)。
这样调整后,邮件解析器就能正确区分正文和附件,不会出现显示异常的情况。
内容的提问来源于stack exchange,提问作者Diana Studebaker
相关产品推荐
相关产品推荐

