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

Go语言构建带多附件与HTML正文的SMTP原始邮件故障排查求助

嘿,我仔细瞅了下你生成的原始邮件内容,问题主要出在MIME结构的层级逻辑上,还有几个小细节没处理对,咱们一步步捋清楚:

核心问题分析

首先你搞错了MIME邮件的层级关系:

  • 顶级的multipart/mixed是用来装正文模块和所有附件的容器,它的直接子项只能是两类:
    1. 一个multipart/alternative(专门用来放纯文本正文和HTML正文,供邮件客户端选着显示)
    2. 每个附件单独作为multipart/mixed的直接子部分(绝对不需要给每个附件套multipart/alternative——那是给正文格式备选用的,不是给附件用的!)
  • 你现在的错误操作是给每个附件都套了一层多余的multipart/alternative,这会让邮件客户端完全无法正确识别附件,最终解析出空文件或者无文件名的异常文件。
  • 还有两个小细节拖后腿:
    • 附件的Content-Disposition末尾多了个多余的分号(比如filename="random-text.txt";),得删掉
    • HTML正文里你用了HTML实体转义(<h1>),但Content-Transfer-Encoding设的是7bit,应该直接写原始HTML标签,不然邮件客户端会显示源码而不是渲染后的效果
修正后的原始邮件示例

我给你调整了结构并修正了细节,你可以直接参考这个正确的格式:

From: FooBar
To: some@mail.com
Subject: Random Text
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="VH5S0k0C2sKbOiiC0CQW0H0gdwo0A00wLHuY0Knk0dzaTr5y55VB0O5UqN0D5ARY"

--VH5S0k0C2sKbOiiC0CQW0H0gdwo0A00wLHuY0Knk0dzaTr5y55VB0O5UqN0D5ARY
Content-Type: multipart/alternative; boundary="WMaSWQ0Q205bd0Ly000W5p00N5ohAMoUpXu050nC0d0a0r0y050B0O0UkN0D0ARY"

--WMaSWQ0Q205bd0Ly000W5p00N5ohAMoUpXu050nC0d0a0r0y050B0O0UkN0D0ARY
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit

To see this message, use an app with support for HTML.
--WMaSWQ0Q205bd0Ly000W5p00N5ohAMoUpXu050nC0d0a0r0y050B0O0UkN0D0ARY
Content-Type: text/html; charset="UTF-8"
Content-Disposition: inline
Content-Transfer-Encoding: 7bit

<h1>Your random text is: </h1><b>JU0NZU4ODAX</b>
--WMaSWQ0Q205bd0Ly000W5p00N5ohAMoUpXu050nC0d0a0r0y050B0O0UkN0D0ARY--

--VH5S0k0C2sKbOiiC0CQW0H0gdwo0A00wLHuY0Knk0dzaTr5y55VB0O5UqN0D5ARY
Content-Type: text/plain; charset="utf-8"
Content-Description: random-text.txt
Content-Disposition: attachment; filename="random-text.txt"
Content-Transfer-Encoding: base64
Content-ID: <random-text.txt>

SlUwTlpVNE9EQVg=
--VH5S0k0C2sKbOiiC0CQW0H0gdwo0A00wLHuY0Knk0dzaTr5y55VB0O5UqN0D5ARY

--VH5S0k0C2sKbOiiC0CQW0H0gdwo0A00wLHuY0Knk0dzaTr5y55VB0O5UqN0D5ARY
Content-Type: text/plain; charset="utf-8"
Content-Description: no-matter.txt
Content-Disposition: attachment; filename="no-matter.txt"
Content-Transfer-Encoding: base64
Content-ID: <no-matter.txt>

w4kgQklSTCBNRVNNTw==
--VH5S0k0C2sKbOiiC0CQW0H0gdwo0A00wLHuY0Knk0dzaTr5y55VB0O5UqN0D5ARY--
Go代码的调整建议

在你的Go代码里,重点要改MIME部分的构建逻辑:

  • 先创建顶级的multipart/mixed writer
  • 先往这个writer里写入multipart/alternative模块(包含纯文本和HTML正文)
  • 然后直接往顶级writer里逐个写入每个附件的内容,不要再给附件套多余的multipart/alternative
  • 注意每个MIME头的格式正确性,比如去掉不必要的分号,HTML内容不要做实体转义

另外,Go标准库的net/mail和mime/multipart已经封装了很多MIME构建的逻辑,尽量用这些标准库来拼接内容,避免手动写原始字符串时容易犯的格式错误——比如用multipart.NewWriter来自动处理boundary和分隔符,省心又不容易错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:47:50