带有多个附件 + html 的 SMTP 邮件 Mime

Posted

技术标签:

【中文标题】带有多个附件 + html 的 SMTP 邮件 Mime【英文标题】:SMTP Mail Mime with multiple attachments + html 【发布时间】:2021-11-05 19:42:00 【问题描述】:

我正在尝试更多地研究原始电子邮件,为此我在 Go 中编写了一些代码来帮助我构建带有附件和 html 正文的电子邮件。

但我有一个问题,目前我只能发送一个附件(不能处理多个附件)或 HTML 正文。当我尝试发送 HTML + 1 附件时,我收到一个内容为空且没有名称的文件

所以,我不知道我的原始电子邮件有什么问题,如果有人可以提供帮助,我真的很感激。

以下是生成的原始电子邮件,如果有人可以帮助我了解它的问题所在。

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
To see this message, use an app with support for HTML.

--WMaSWQ0Q205bd0Ly000W5p00N5ohAMoUpXu050nC0d0a0r0y050B0O0UkN0D0ARY
Content-Type: text/html; charset="UTF-8"
Content-Description: 
Content-Disposition: inline
Content-Transfer-Encoding: 7bit

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

--WMaSWQ0Q205bd0Ly000W5p00N5ohAMoUpXu050nC0d0a0r0y050B0O0UkN0D0ARY--

Content-Type: multipart/alternative; boundary="hcx0dnS50VSCeMb5mSyM05W00yQT0odL7050u0XMn5UdUa0rdy050B0OgUjNDARY"

--hcx0dnS50VSCeMb5mSyM05W00yQT0odL7050u0XMn5UdUa0rdy050B0OgUjNDARY
A file containing some information

--hcx0dnS50VSCeMb5mSyM05W00yQT0odL7050u0XMn5UdUa0rdy050B0OgUjNDARY
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=

--hcx0dnS50VSCeMb5mSyM05W00yQT0odL7050u0XMn5UdUa0rdy050B0OgUjNDARY--

Content-Type: multipart/alternative; boundary="0PZiT5S5IpaWM5bEOA0Uw5W0000TDo5X0y50u00Ln50dIa7r0yS50B5O5UZNDARY"

--0PZiT5S5IpaWM5bEOA0Uw5W0000TDo5X0y50u00Ln50dIa7r0yS50B5O5UZNDARY
A file containing some information

--0PZiT5S5IpaWM5bEOA0Uw5W0000TDo5X0y50u00Ln50dIa7r0yS50B5O5UZNDARY
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==

--0PZiT5S5IpaWM5bEOA0Uw5W0000TDo5X0y50u00Ln50dIa7r0yS50B5O5UZNDARY--

--VH5S0k0C2sKbOiiC0CQW0H0gdwo0A00wLHuY0Knk0dzaTr5y55VB0O5UqN0D5ARY--

【问题讨论】:

这看起来让我一团糟:标题在新行之后开始的部分(因此是正文),没有正确标题的部分...。甚至不清楚邮件的结构是怎样的,只能猜测。为什么要手动创建 MIME 而不是使用 mime/multipart? @SteffenUllrich 起初是想研究一下 mime 在电子邮件中的工作原理,但也许可以很好地开始使用 golang mime 模块。谢谢 【参考方案1】:

您可以尝试使用此https://github.com/jordan-wright/email 生成具有相同内容和附件的 .eml 文件,然后将其与您的文件进行比较以找出差异。

【讨论】:

【参考方案2】:

如果不了解您的期望,就很难看出这里出了什么问题;但是对于每个附件都有multipart/alternative 肯定是很可疑的。您基本上是在说“这是两个等效的部分;使用您喜欢的任何一个”,但是没有任何标题的部分(隐式为 text/plain)似乎无法提供与明确的文本部分。

显而易见且直接的问题是在最后两个 multipart/alternative 部分之前没有 MIME 边界。您需要在标头之前有 MIME 边界,如下所示:

...
<h1>Your random text is: </h1><b>JU0NZU4ODAX</b>

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

--hcx0dnS50VSCeMb5mSyM05W00yQT0odL7050u0XMn5UdUa0rdy050B0OgUjNDARY

A file containing some information
...

但我猜你应该只删除最后两个结构中的multipart/alternative 层,并最终得到一个包含一个multipart/alternative 的***multipart/mixed(带有text/plaintext/html 渲染,或者也许只是省略无用的text/plain 部分,这对每个人来说都很烦人,只需放置一个text/html 部分而不是multipart/alternative 结构,如果这确实是您可以提供的所有有用的结构),然后是两个text/plain 部分Content-Disposition: attachment.

顺便说一句,不要在示例中使用您不知道他们属于谁的地址(更不用说您知道属于无辜第三方的地址)。

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

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

--WMaSWQ0Q205bd0Ly000W5p00N5ohAMoUpXu050nC0d0a0r0y050B0O0UkN0D0ARY

We thought it would be helpful to display an annoying suggestion
to look at this in an HTML viewer instead of provide you with
the information which is only visible in the HTML part.
Nyah, nyah.

--WMaSWQ0Q205bd0Ly000W5p00N5ohAMoUpXu050nC0d0a0r0y050B0O0UkN0D0ARY
Content-Type: text/html; charset="UTF-8"
Content-Description: (if you don't have a description, don't add this header)
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
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--

【讨论】:

它有效,我在处理它时遇到了一些问题,这是正确的;但是您的回答非常完整,并帮助我看到了我正在做的事情中的一些错误。谢谢! 你可以说附件是否应该总是在电子邮件的底部? 在 MIME 中没有任何东西强迫它这样做,但客户可能会期望它。

以上是关于带有多个附件 + html 的 SMTP 邮件 Mime的主要内容,如果未能解决你的问题,请参考以下文章

通过 SMTP 发送带有附件、纯文本/文本和文本/html 的电子邮件

如何使用 Outlook 2010(无 smtp)和 python 发送带有嵌入图像(不是附件)的 HTML 格式电子邮件

如何发送带有附件的电子邮件(使用我自己的SMTP服务器)?

发送带有附件的 HTML 电子邮件

python3 发送邮件携带附件(可携带多个不同格式的附件)

BizTalk SMTP 发送带有附件的邮件(无编排,自定义发送管道组件)