电子邮件中的 MIME 多部分

Posted

技术标签:

【中文标题】电子邮件中的 MIME 多部分【英文标题】:MIME Multipart in email 【发布时间】:2021-01-11 18:17:18 【问题描述】:

我正在尝试在电子邮件中嵌入图像。

电子邮件是通过通过套接字向端口 25 上的 SMTP 服务器发送数据来创建的。这是 MIME 位:

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=mixedsection;

--mixedsection
Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
Content-Disposition: inline

Below should be an inline embedded image

--mixedsection
Content-Type: image/png; file=ts-charts.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png

iVBORw0KGgoAAAANSUhEUgAAAnoAAAHqCAMAAACk+hPgAAABpFBMVEX// (etc etc etc)

--mixedsection--

收到电子邮件后,第二部分(图像)似乎已转换为附件,并且从未内联显示。所有其他部分工作正常,图像被正确编码为 base64,因此可以打开附件。当 Content-Disposition 设置为 inline 或 attachment 时,text/plain 部分都能正常工作。

我使用过其他邮件客户端(outlook、thunderbird)嵌入图片,图片内联显示没有问题。

即使我剥离了其他所有内容,我什至无法让图像内联显示。以下内容仍作为附件收到:

MIME-Version: 1.0
Content-Type: image/png; file=ts-charts.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png

iVBORw0KGgoAAAANSUhEUgAAAnoAAAHqCAMAAAC (etc etc)

所以问题是,我在这里缺少什么,以及如何让图像内联显示?

【问题讨论】:

AFAIK 图像永远不会显示在文本中。纯文本无法指示图像的位置。 RFC 假设一个文本部分,加上可能的替代文本形式,如 html。如您所见,带有 cid 的 HTML 是显示随电子邮件发送的图像的方法。 【参考方案1】:

由于某种原因,我无法直接按照 RFC 标准方式让它在原版中运行;如果有人知道如何这样做,请发帖。

所以,我放弃了,使用 inline HTML/CID 嵌入图片。

我是这样做的:

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=mixedsection;

--mixedsection
Content-Type: multipart/related; boundary=relatedsection;

--relatedsection
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 8Bit
Content-Disposition: inline

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body>
    <p><img src="cid:myembeddedimage" ></p>
  </body>
</html>

--relatedsection
Content-Type: image/png; name=ts-charts.png
Content-ID: myembeddedimage
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png

iVBORw0KGgoAAAANSUhEUgAAAnoAAAHqCAMAAACk+hPgAAABpFBMVEX//3 (etc etc)

--relatedsection--
--mixedsection--

注意我也改了:

Content-Type: image/png; file=ts-charts.png

通过删除文件属性并替换为名称属性:

Content-Type: image/png; name=ts-charts.png

我不太相信这是一种好的或推荐的方法,但它确实有效。

编辑:.... 只是为了完成。我终其一生都想不出如何混合纯文本和 HTML 嵌入图像,所以选择简单地将文本放入 HTML。

这是最后的信息:

MIME-Version: 1.0
Content-Type: multipart/related; boundary=relatedsection;

--relatedsection
Content-Type: text/html;
Content-Transfer-Encoding: 8bit
Content-Disposition: inline

<html>
   <head>
      <meta http-equiv="content-type" content="text/html;">
   </head>
   <body>
      <p> Below is an embedded image ...</p>
      <p><img src="cid:myembeddedimage" ></p>
   </body>
</html>

--relatedsection
Content-Type: image/png; name=ts-charts.png
Content-ID: myembeddedimage
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png
 
AHqCAMAAACk+hPgAAABpFBMVEX///8PDw8jIyPDw8OPj333mOm2ajzGtEbdPpm (etc (etc)
--relatedsection--

我不得不删除外部的 multipart/mixed,因为通过交换服务器运行此消息会导致附件(att0001、att0002)被附加到消息中。在 Thunderbird、gmail 或任何客户端在 i-Phone 上调用的任何东西上,这些幽灵附件都没有问题。

【讨论】:

以上是关于电子邮件中的 MIME 多部分的主要内容,如果未能解决你的问题,请参考以下文章

电子邮件:MIME,用附件多部分发送?

在 MIME 多部分消息中显式指定边界?

MIME 电子邮件多部分解析器 [重复]

将一些文件附加到 MIME 多部分电子邮件

MIME 多部分解析器

使用 PGP/MIME 签署多部分邮件