NodeJS中AWS SES多附件MIME邮件问题:仅首个附件生效
问题:AWS SES sendRawEmail仅显示第一个附件,第二个附件无法加载
我正在使用AWS SES发送带附件的邮件,由于sendEmail函数不支持发送附件,因此采用SES的sendRawEmail函数。为发送原始邮件,我将邮件转换为如下MIME文本,包含两个转成base64的图片附件、正文及若干邮件头:
From: from@test.com To: to@test.com Cc: Bcc: Subject: Test from Lambda MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part2904462804807624" ------=_Part2904462804807624 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hello world ------=_Part2904462804807624 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit <h1>Hello</h1><p>world</p> ------=_Part2904462804807624 Content-Type: image/jpeg; name="sea-surface-turquoise-blue-color-background-some-reflections-calm-crystal-clear-water-small-ripples-sea-surface-turquoise-221064440.jpg" Content-Description: sea-surface-turquoise-blue-color-background-some-reflections-calm-crystal-clear-water-small-ripples-sea-surface-turquoise-221064440.jpg Content-Disposition: attachment;filename="sea-surface-turquoise-blue-color-background-some-reflections-calm-crystal-clear-water-small-ripples-sea-surface-turquoise-221064440.jpg"; Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQAAAQABAAD/4gIcSUNDX1BST0ZJTEUAAQEAAAIMbGNtcwIQAABtbnRyUkdCIFhZWiAH3AABABkAAwApADlhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApkZXNjAAAA/ ..................................... ..................................... ..................................... MOO3FwVjiwfsg1fcci0NRnULhYioZ2KOJRlg33mWBSNrslR+COggrOdzIshEqj4ghEN3WU6jhDlg8zDHGYoRsMNKcauLzWjjzBY26eC5ZFlpeI0fITV8EdMstRZcj4mTDEpYYeTuUa1+yBUdHBcs8rdahAOUiCgJLUZEn/9k= ------=_Part2904462804807624-- Content-Type: image/jpeg; name="image.desktop.size-xl.sme-greenoption-xl1280x720.jpeg" Content-Description: image.desktop.size-xl.sme-greenoption-xl1280x720.jpeg Content-Disposition: attachment;filename="image.desktop.size-xl.sme-greenoption-xl1280x720.jpeg"; Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCALQBQADASIAAhEBAxEB/ ..................................... ..................................... ..................................... ojzPGee6OP61rQa14b06zmutOtLmw1KJSsSTpvILcZV+gx7it/wJaNeeEbqGWK2uIgSttHKoIRwD8p7gZx/Sli023sNae2j0mzS9njKkGcm3kTA3ADdlST6qc150q1HmdNrbs/0Dof/2Q== ------=_Part2904462804807624-- ------=_Part2904462804807624--
邮件发送后仅第一个附件能被成功添加,第二个附件无法显示(截图如下),单独测试第二个附件时功能正常,请问该MIME文本存在什么问题?

问题分析与解决方案
核心问题
你的MIME文本存在两处致命错误:
- 提前闭合了MIME边界:第一个附件结束后,你使用了
------=_Part2904462804807624--(末尾带两个连字符的闭合标记),这会直接终止整个multipart/alternative容器,后续的第二个附件被视为边界外的无效内容,无法被邮件客户端解析。 - 冗余的闭合标记:文本末尾重复出现多次
------=_Part2904462804807624--,属于无效内容,会干扰邮件解析。
修正后的MIME结构
调整边界使用规则,确保所有内容(正文、两个附件)都在容器内,仅在最后使用一次闭合标记:
From: from@test.com To: to@test.com Cc: Bcc: Subject: Test from Lambda MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part2904462804807624" ------=_Part2904462804807624 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hello world ------=_Part2904462804807624 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit <h1>Hello</h1><p>world</p> ------=_Part2904462804807624 Content-Type: image/jpeg; name="sea-surface-turquoise-blue-color-background-some-reflections-calm-crystal-clear-water-small-ripples-sea-surface-turquoise-221064440.jpg" Content-Description: sea-surface-turquoise-blue-color-background-some-reflections-calm-crystal-clear-water-small-ripples-sea-surface-turquoise-221064440.jpg Content-Disposition: attachment;filename="sea-surface-turquoise-blue-color-background-some-reflections-calm-crystal-clear-water-small-ripples-sea-surface-turquoise-221064440.jpg"; Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQAAAQABAAD/4gIcSUNDX1BST0ZJTEUAAQEAAAIMbGNtcwIQAABtbnRyUkdCIFhZWiAH3AABABkAAwApADlhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApkZXNjAAAA/ ..................................... MOO3FwVjiwfsg1fcci0NRnULhYioZ2KOJRlg33mWBSNrslR+COggrOdzIshEqj4ghEN3WU6jhDlg8zDHGYoRsMNKcauLzWjjzBY26eC5ZFlpeI0fITV8EdMstRZcj4mTDEpYYeTuUa1+yBUdHBcs8rdahAOUiCgJLUZEn/9k= ------=_Part2904462804807624 Content-Type: image/jpeg; name="image.desktop.size-xl.sme-greenoption-xl1280x720.jpeg" Content-Description: image.desktop.size-xl.sme-greenoption-xl1280x720.jpeg Content-Disposition: attachment;filename="image.desktop.size-xl.sme-greenoption-xl1280x720.jpeg"; Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCALQBQADASIAAhEBAxEB/ ..................................... ojzPGee6OP61rQa14b06zmutOtLmw1KJSsSTpvILcZV+gx7it/wJaNeeEbqGWK2uIgSttHKoIRwD8p7gZx/Sli023sNae2j0mzS9njKkGcm3kTA3ADdlST6qc150q1HmdNrbs/0Dof/2Q== ------=_Part2904462804807624--
额外优化建议
multipart/alternative的设计初衷是提供同一内容的不同格式(比如纯文本和HTML正文),带附件的邮件更规范的做法是使用multipart/mixed作为顶层容器:
- 顶层容器用
multipart/mixed,设置对应的边界; - 内部嵌套一个
multipart/alternative容器存放纯文本和HTML正文; - 在顶层容器下单独添加两个附件部分。
这种结构能更好兼容各类邮件客户端,避免解析异常。
内容的提问来源于stack exchange,提问作者Binara Medawatta
相关产品推荐
相关产品推荐

