0

我正在学习 javamail API。要发送包含图像的电子邮件,我使用 imgPart.setHeader ("Content-ID", "img")。收件人将看到上面附有图像和图像的邮件内容。但是当我使用 Outlook 撰写包含图像的电子邮件时,收件人不会看到任何附加图像,只会看到邮件文本和嵌入图像。Outlook 如何做到这一点?

谢谢你。

4

3 回答 3

2

除了纯文本之外,Outlook 和其他类似客户端还嵌入了 HTML 版本的文本。然后在 html 中,他们使用img标签(在嵌入图像本身时设置)引用带有 ID 的图像。图像像您已经做的那样单独嵌入。

但我建议您使用比“img”更唯一的 ID(不要与我上面提到的标签混淆)作为部分 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

之后,Thunderbird(在这种情况下,与 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:part1.03070608.09040802@xxxxxxxxxxxxxxxx" alt=""><br>
    <br>
    End of message<br>
    <br>
  </body>
</html>

--------------080209080402080405070800

注意上面图片的链接(我用 x 打乱了域):

<img src="cid:part1.03070608.09040802@xxxxxxxxxxxxxxxx" alt="">

如果您现在查看邮件正文中的其余附件,您将看到其Content-IDID 与 HTML 中引用的 ID 相同 - 图像本身像往常一样以 Base64 格式附加。参考链接总是以cid:<attachement ID>

ID 可以是任何不与身体其他部位发生冲突的东西。

还要注意Content-Disposition指示 Thunderbird 以内联方式显示它的行,这不是绝对必要的,因为它在 HTML 中被引用,但可以帮助客户端了解此图像的意图是内联显示它还是使其可作为“纯“ 附件:

Content-Type: image/png;
 name="ddebjigc.png"
Content-Transfer-Encoding: base64
Content-ID: <part1.03070608.09040802@xxxxxxxxxxxxxxxx>
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--

希望这更清楚。

于 2012-10-30T05:26:14.197 回答
0

如 JavaMail FAQ 中所述,您是否创建了多部分/相关消息?

于 2012-10-30T06:21:12.003 回答
0
                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);
于 2012-10-30T20:09:52.020 回答