如何创建带有嵌入式图像的电子邮件,以便兼容大多数邮件客户端

32

我们创建了一个系统,允许在发出的电子邮件中嵌入图像。

这是我们的系统创建的原始消息。此示例包含一个图像附件和一个嵌入式图像。

Mime-Version: 1.0
From: ...
To: ...
CC: 
Subject: test
x-sender: ...
x-mailer: ...
Content-Type: multipart/mixed; boundary="-------------...A128803765634794"

---------------...A128803765634794
Content-Type: multipart/related; boundary="-------------...B128803765634796"

---------------...B128803765634796
Content-Type: text/html; charset="UTF-8"

<p style="margin: 0; padding: 0"><img src="cid:083.gif" alt="" /></p>

---------------...B128803765634796
Content-type: image/gif; name="083.gif"
Content-ID: <083.gif>
X-Attachment-Id: 083.gif
Content-Disposition: Embedded; filename="083.gif"
Content-transfer-encoding: base64

............................................................................
............................................................................
......................................................
---------------PineappleCodeB128803765634796--
---------------PineappleCodeA128803765634794
Content-type: image/gif; name="waiting.gif"
Content-Disposition: Attachment; filename="waiting.gif"
Content-transfer-encoding: base64

............................................................................
............................................................................
......................................................
---------------PineappleCodeA128803765634794--

我需要添加其他的header或者遵循其他规则吗?

我注意到了一个问题... 我猜这部分是我的问题,还有部分是Gmail的问题。但无论如何,我想让它不再发生。

当邮件被Gmail接收时,我会看到以下内容:

图像无法显示。
在下面显示图像 - 总是从...显示图像

然后嵌入式图像将作为图像附件显示(就像我的另一个图像附件一样)。

我点击“在下面显示图像”,然后我的图像就在邮件正文中显示,但并未从附件部分中删除。

如果我返回到收件箱,然后再次打开邮件,它就正常了。

我不明白为什么会这样。它不是链接的图像(来自外部URL),而且在从Gmail发送嵌入式图像到Gmail时也不会出现这种情况。这让我认为我可能做错了什么,我担心它可能会影响其他收件人。


2
“embedded” 不是有效的 Content-Disposition。它必须是 “inline” 或 “attachment” 中的一个。 - dkarp
2个回答

31

7
谢谢您提供的信息,@Jan。我之前不知道的主要问题在于在MIME部分的Content-ID标头中将cid放入尖括号中,就像这样:Content-ID:<my.random.id@some.domain>,同时仍然在HTML中使用非括号版本,如下所示:<img src="cid:my.random.id@some.domain">。这解决了GMail客户端中的问题。 - Guss
8
人们需要关注的另一件事是,对于Hotmail来说,<img src='cid:xxx' ... />将无法工作。您必须改用<img src="cid:xxx" ... /> - Earth Engine
7
@EarthEngine 花了我一点时间才明白你的意思:使用单引号而不是双引号。 - ctbrown

2
我在Gmail中加载内联图片时遇到了问题,发现我在PHP中误用了PEAR Mail_Mime库。如已注明,Content-ID必须格式化为消息ID。如果没有提供Content-ID,则PEAR Mail_Mime库将尝试添加domainID。它还将尝试在电子邮件的HTML正文中使用正则表达式替换这些Content-ID以维护链接。在我的情况下,此步骤失败,最终导致HTML标记与MIME附件之间的链接断开。因此,Gmail拒绝内联显示图像是完全正确的。但是,它确实将该图像作为附件显示出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接