电子邮件中的 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 多部分的主要内容,如果未能解决你的问题,请参考以下文章