繁体   English   中英

在Google App Engine(Java)上发送嵌入式电子邮件附件

[英]Sending inline email attachments on Google App Engine (Java)

我在获取内联附件以内联显示时遇到困难。 当电子邮件客户端收到消息时,即使我从日志中看到将某些内容设置为“内联”,所有附件也都带有Content-Disposition “附件”。 同样,无论何时我设置CID标头,它都不会发送到电子邮件客户端(例如,如果我查看源/原始文件)。 就像内容处置一样,它正在以某种方式丢失。

我正在使用以下代码:

public static void performSend(Event event, Guest guest) throws Exception {
    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);

    String htmlBody = event.getEmail().getHtmlBody(event.getInlineInvitationImages(), guest);
    Multipart mp = new MimeMultipart();

    MimeBodyPart htmlPart = new MimeBodyPart();
    htmlPart.setContent(htmlBody, "text/html");
    mp.addBodyPart(htmlPart);

    //Add attachments
    for(InvitationImage image : event.getInvitationImages()) {
        Logger.info("Now attaching image %s, with length %d, content type %s, cid %s and disposition %s", image.filename, image.imageData.length, image.contentType, image.cid, image.getDisposition().toString());
        MimeBodyPart attachment = new MimeBodyPart();
        attachment.setDisposition(image.getDisposition());
        attachment.setFileName(image.filename);
        attachment.setContentID("<"+image.cid+">");

        DataSource src = new ByteArrayDataSource(image.imageData, image.contentType); 
        attachment.setDataHandler(new DataHandler(src));
        mp.addBodyPart(attachment);
    }

    Message msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress("myname@gmail.com", "My Name"));
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(guest.email, guest.getFullname()));
    msg.setSubject(event.getEmail().subject);
    msg.setContent(mp);
    msg.saveChanges();

    //Log the email
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    msg.writeTo(baos);
    new Log(baos.toByteArray()).save();

    Transport.send(msg);
}

我的GAE日志中的相关代码段是

play.Logger信息:现在附加图像myimage.jpg,长度为73336,内容类型为image / jpeg,cid e4ae3388-312d-498e-b958-12e814507934@rsvp-rocket.appspot.com并内联处理

电子邮件源的相关代码段如下所示:

Content-Type: multipart/mixed; boundary=20cf307f3beca61df004baa44d82
Return-Path: 3-jJXTwsJDD0qruo-qnbjdsflZhk.bnljZxcddcnqfZmgnslZhk.bnl@apphosting.bounces.google.com
X-OriginalArrivalTime: 07 Mar 2012 10:05:47.0455 (UTC) FILETIME=[DE047CF0:01CCFC49]

--20cf307f3beca61df004baa44d82
Content-Type: multipart/alternative; boundary=20cf307f3beca61de604baa44d80

--20cf307f3beca61de604baa44d80
Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes

Come to my wedding!



--20cf307f3beca61de604baa44d80
Content-Type: text/html; charset=ISO-8859-1

<p style="color: gray;">Come to my wedding!</p><div><img src="cid:e4ae3388-312d-498e-b958-12e814507934@rsvp-rocket.appspot.com" border="0" /></div>
--20cf307f3beca61de604baa44d80--
--20cf307f3beca61df004baa44d82
Content-Type: image/jpeg; name="DamianKathrynWeddingSaveTheDate.jpg"
Content-Disposition: attachment; 
    filename="DamianKathrynWeddingSaveTheDate.jpg"
Content-Transfer-Encoding: base64

有什么想法吗? 为什么要清除处置和CID? 我是否错过了一些显而易见的作品,或者这是电子邮件的神秘技巧的一个例子?

更新:

我已将外发电子邮件转储到数据存储区中的Log实体。 在这里,我可以看到内嵌图像确实具有“内嵌”的Content-Disposition。 因此,当它到达电子邮件客户端时,已经将其删除。 奇怪的是html部分是base64编码的(如下所示)。 这正常吗?

这是到达Gmail的信息:

Message-ID: <20cf307d02b099e30804bab9b98e@google.com>
Date: Thu, 08 Mar 2012 11:39:12 +0000
Subject: Test invite
From: My Name <myname@gmail.com>
To: My Name <myname@gmail.com>
Content-Type: multipart/mixed; boundary=20cf307d02b099e2fb04bab9b98d

--20cf307d02b099e2fb04bab9b98d
Content-Type: multipart/alternative; boundary=20cf307d02b099e2f404bab9b98b

--20cf307d02b099e2f404bab9b98b
Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes

Come to my wedding!



--20cf307d02b099e2f404bab9b98b
Content-Type: text/html; charset=ISO-8859-1

<p style="color: gray;">Come to my wedding!</p><div><img src="cid:e4ae3388-312d-498e-b958-12e814507934@rsvp-rocket.appspot.com" border="0" /></div>
--20cf307d02b099e2f404bab9b98b--
--20cf307d02b099e2fb04bab9b98d
Content-Type: image/jpeg; name="DamianKathrynWeddingSaveTheDate.jpg"
Content-Disposition: attachment; 
    filename="DamianKathrynWeddingSaveTheDate.jpg"
Content-Transfer-Encoding: base64

/9j/4AAQSkZJRgABAQEBLAEsAAD/7QBSUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAABkcAVoAAxsl

这是我为同一条消息记录的内容:

From: My Name <myname@gmail.com>
To: My Name <myname@gmail.com>
Message-ID: <29985819.01331206751990.JavaMail.javamailuser@localhost>
Subject: Test invite
MIME-Version: 1.0
Content-Type: multipart/mixed; 
    boundary="----=_Part_0_20814850.1331206751553"

------=_Part_0_20814850.1331206751553
Content-Type: text/html
Content-Transfer-Encoding: base64

PHAgc3R5bGU9ImNvbG9yOiBncmF5OyI+Q29tZSB0byBteSB3ZWRkaW5nITwvcD48ZGl2PjxpbWcg
c3JjPSJjaWQ6ZTRhZTMzODgtMzEyZC00OThlLWI5NTgtMTJlODE0NTA3OTM0QHJzdnAtcm9ja2V0
LmFwcHNwb3QuY29tIiBib3JkZXI9IjAiIC8+PC9kaXY+
------=_Part_0_20814850.1331206751553
Content-Type: image/jpeg; name=DamianKathrynWeddingSaveTheDate.jpg
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=DamianKathrynWeddingSaveTheDate.jpg
Content-ID: <e4ae3388-312d-498e-b958-12e814507934@rsvp-rocket.appspot.com>

/9j/4AAQSkZJRgABAQEBLAEsAAD/7QBSUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAABkcAVoAAxsl

有任何想法吗? 当我查看Amazon SES和Postmark时,GAE上的电子邮件迅速进入“太难了”的篮子。

首先,考虑将Session.getDefaultInstance()替换为Session.getInstance()。 我不知道这是否与您的问题有关,但可以避免将来可能出现的问题。

要找出消息未通过预期的原因的方法,请使用msg.writeTo(new FileOutputStream(“ msg.txt”))在Transport.send()之前保存一个副本,然后将文件中的内容与您在邮件客户端中看到的内容。 如果他们不一样,最可能的原因是,你正在使用的邮件服务器中的一个变换消息, 认为该消息应该的样子。 Exchange经常这样做。

不幸的是,GAE不提供此类功能。

Google为GAE应用程序提供了标准的javax.mail API。 您不必在依赖项列表中包含任何SUN / Oracle * .jar。 实际上,GAE提供了自己的javax.mail实现,仅与原始SUN实现半兼容。 此外,GAE在引擎盖下执行了一些完全出乎意料的操作。 例如,如果您发送纯HTML电子邮件,则接收方将收到包含“替代” mime的多部分消息,其中将包含HTML剥离的文本/纯文本消息以及原始HTML邮件。 当尝试将cid和html一起使用html时,您还会陷入一堆例外。 同样,任何“ MimeMultiPart”嵌套都将导致异常或未定义的行为。 从Google文档中仔细检查后,对javax.mail的支持将非常有限。 他们甚至提到:“为了安全起见,邮件部分和附件必须是允许的几种类型之一”。 安全性可能是获得如此有限支持的原因之一,但不是最终原因。

您可能想给以下AppEngine问题加注星标:

http://code.google.com/p/googleappengine/issues/detail?id=965

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM