我正在学习javamail API。要发送包含图片的电子邮件,我使用imgPart.setHeader(“Content-ID”,“img”)。收件人将在上面看到带有图像和图像的邮件内容。但是当我编写邮件包含使用Outlook的图像时,收件人将看不到任何附加图像,只能看邮件文本和嵌入图像。 Outlook如何做到这一点?发送电子邮件包含像Outlook这样的图像吗?
谢谢。
我正在学习javamail API。要发送包含图片的电子邮件,我使用imgPart.setHeader(“Content-ID”,“img”)。收件人将在上面看到带有图像和图像的邮件内容。但是当我编写邮件包含使用Outlook的图像时,收件人将看不到任何附加图像,只能看邮件文本和嵌入图像。 Outlook如何做到这一点?发送电子邮件包含像Outlook这样的图像吗?
谢谢。
除了纯文本之外,Outlook和其他类似客户端嵌入了HTML版本的文本。在html中,他们使用img
标记(当您嵌入图像本身时设置)引用带有ID的图像。图像已经分开嵌入,就像你已经做的那样。
但我建议你使用比'img'(不要与上面提到的标签混淆)part-ID(f.ex. hash原始文件名)更独特的ID。
更新:
要更清楚地显示这里是一个例子。可以说,我发这封邮件:
这会给这个源发送的SMTP - 在这里你看到的第一部分是纯文本格式:
...other header parts snipped
Subject: Demo attachments
Content-Type: multipart/alternative;
boundary="------------080308060008080306040307"
This is a multi-part message in MIME format.
--------------080308060008080306040307
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
This text is attached as HTML. As we reference an image this will be
displayed here as well as being an attachment as usual.
End of message
--------------080308060008080306040307
是雷鸟之后(在此与Outlook相同)插入相同文本的HTML版本,其编辑位于:
Content-Type: multipart/related;
boundary="------------080209080402080405070800"
--------------080209080402080405070800
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body text="#000000" bgcolor="#FFFFFF">
This text is attached as HTML. As we reference an image this will be
displayed here as well as being an attachment as usual.<br>
<br>
<img src="cid:[email protected]" alt=""><br>
<br>
End of message<br>
<br>
</body>
</html>
--------------080209080402080405070800
请注意以上图像的链接(I scra mbled与X的域名):
<img src="cid:[email protected]" alt="">
如果你现在看在邮件正文中的附件的其余部分,你会看到Content-ID
具有相同的ID在HTML中引用 - 本身附于图像通常以Base64格式。参考链接始终以cid:<attachement ID>
ID可以是任何不会与身体其他部分发生碰撞的东西。
另请注意,Content-Disposition
行指示Thunderbird以内联方式显示它,并非严格必要,因为它在HTML中被引用,但可帮助客户知道该图像的意图是将其显示为内联还是使其可用下载一个 “纯粹” 的附件:
Content-Type: image/png;
name="ddebjigc.png"
Content-Transfer-Encoding: base64
Content-ID: <[email protected]>
Content-Disposition: inline;
filename="ddebjigc.png"
iVBORw0KGgoAAAANSUhEUgAAANsAAAAcCAIAAABnDF0bAAASPElEQVR4nO2b+VMTWbvHc/+I
+TNu6SiyyL4lyL4qm4gIoigiO4ii4OCGsoR9QAQZkRAC4uj4jigZRRyZV3iRfQ+BrJ3uQMjG
Ork/dLrTaxJmbt2aqkvXt6ic06efX/jUs5zzHEZ6WuKBDvTPEePx49YDHeifIwYIQQRBSghS
...剪断缩短在这个例子中的文字...
sFjyaDrJSZ6SMnZjnCKphQLLIrYhUgGSPSj6IbHoJl2HxYVvEojkezZ0oo3jlD4ScwvW2EhB
c/8Vv4zUZE66LIuGXdOdV1x0xl/H+Zs+EjNEnCKRMPy8pfs3GKdIaKPEOUXSegUikGFNJ/rB
c/D8nz3/A+4rfUt5pwb4AAAAAElFTkSuQmCC
--------------080209080402080405070800--
--------------080308060008080306040307--
希望这使得它更清晰。
我为html内容创建一个bodyPart,为图像创建一个imgPart。 – user1780606
我不知道这是否是“否”或“是”。您是否阅读过JavaMail FAQ条目? –
是的,我做过。我的代码在底部发布。 – user1780606
File template = new File ("template.htm");
FileUtils readContent = new FileUtils();
String content = readContent.readFileToString (template);
MimeMultipart multiPart = new MimeMultipart ("related");
BodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent (content, "text/html");
multiPart.addBodyPart (bodyPart);
BodyPart imgPart = new MimeBodyPart();
DataSource img_data = new FileDataSource ("template\\image001.jpg");
imgPart.setDataHandler (new DataHandler (img_data));
imgPart.setDisposition (MimeBodyPart.INLINE);
imgPart.setHeader ("Content-ID", "img_1");
multiPart.addBodyPart (imgPart);
感谢,但为什么Outlook发送图像而没有任何附件?你能更清楚地告诉我吗? – user1780606
我更新了答案,使其更加清晰。 – K3N
谢谢,我明白你的意思。 – user1780606