如何在JavaMail中发送包含嵌入图像和常规附件的电子邮件?

时间:2010-05-18 03:50:18

标签: java iphone smtp javamail javax.mail

我想知道如何以正确的顺序构建SMTP多部分邮件,以便在iPhone邮件客户端上正确呈现(在GMail中正确呈现)。

我正在使用Javamail构建包含以下部分的电子邮件:

  • 内容类型为“text / html; UTF-8”
  • 的正文部分
  • 嵌入式图片附件。
  • 文件附件

我通过GMail SMTP(通过SSL)发送邮件,并使用GMail帐户正确发送和呈现邮件,但邮件无法在iPhone邮件客户端上正确呈现。在iPhone邮件客户端上,图像在“之前图像”文本之前呈现,之后应该呈现。在“Before Image”文本之后,有一个带有问号的图标(我认为这意味着它无法找到引用的CID)。我不确定这是否是iPhone邮件客户端的限制或我的邮件发送代码中的错误(我强烈假设后者)。

我认为也许我的部件上的标题可能不正确或者我可能以错误的顺序提供了多部分。我将收到的邮件的文本作为gmail的输出包含在内(这使得文件更正

Message-ID: <3977333.1.1274154021787.JavaMail.Chris@smtp.gmail.com>
Subject: =?UTF-8?Q?Test_from_=E3=82=AF=E3=83=AA=E3=82=B9?=
MIME-Version: 1.0
Content-Type: multipart/mixed; 
    boundary="----=_Part_0_20870565.1274154021755"

------=_Part_0_20870565.1274154021755
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-ID: <20100518124021763_368238_0>

iVBORw0K ----- TRIMMED FOR CONCISENESS
6p1VVy4alAAAAABJRU5ErkJggg==
------=_Part_0_20870565.1274154021755
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit

<html><head><title>Employees Favourite Foods</title>
<style>
        body { font: normal 8pt arial; }
        th   { font: bold   8pt arial; white-space: nowrap; }
        td   { font: normal 8pt arial; white-space: nowrap; }
</style></head><body>

        Before Image<br><img src="cid:20100518124021763_368238_0">
        After Image<br><table border="0">
<tr>
<th colspan="4">Employees Favourite Foods</th>
</tr>
<tr>
<th align="left">Name</th><th align="left">Age</th><th align="left">Tel.No</th><th align="left">Fav.Food</th>
</tr>
<tr style="background-color:#e0e0e0">
<td>Chris</td><td>34</td><td>555-123-4567</td><td>Pancakes</td>
</tr>
</table></body></html>
------=_Part_0_20870565.1274154021755
Content-Type: text/plain; charset=us-ascii; name=textfile.txt
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=textfile.txt

This is a textfile with numbers counting from one to ten beneath this line:
one
two
three
four
five
six
seven
eight
nine
ten(no trailing carriage return)
------=_Part_0_20870565.1274154021755--

即使你无法帮助我,如果论坛的任何成员可以转发包含内嵌图像(非外部超链接图像)的非个人邮件,我将不胜感激。我只需找到一份工作样本,然后我可以通过这个。

谢谢,

克里斯。

3 个答案:

答案 0 :(得分:1)

您是否阅读过RFC 2822,它定义了电子邮件的规范要求?我自己没有读过这个,所以我不确定它是否提到了多部分电子邮件,但它可能是一个很好的起点。 Apple似乎非常擅长坚持标准。

http://www.faqs.org/rfcs/rfc2822.html

答案 1 :(得分:1)

我在base64编码的图像部分中没有看到任何Content-Disposition。您应该将其设置为内联。你甚至可以在这里包含文件名,还有更多选项(查找它们)。

示例:

Content-Disposition: inline; filename="inlineimage1.gif"

您将内容类型设置为application / octet-stream似乎有点狡猾,您可以将其设置为正确的格式。

示例:

Content-Type: image/gif; name="inlineimage1.gif"

答案 2 :(得分:0)

如果有人绊倒了 - 这就是如何组成多部分:

  • multipart / mixed(包含文字和附件)

    • multipart / alternative(包含文本和HTML)

      • text / plain(纯文本)
      • multipart / related(HTML +嵌入图片)
        • text / html(Html内容,图片引用为src =“cid:xxx”
        • image1(Content-Id:xxx)
        • IMAGE2
        • ...
    • attachment 1
    • attachment 2
    • ...