2012-03-07 13 views
2

インラインアタッチメントをインラインで表示するのが難しいです。電子メールクライアントがメッセージを受信すると、添付ファイルのすべてが、「インライン」に設定されていることがログからわかるとしても、添付ファイルはすべてコンテンツ処理となります。また、CIDヘッダーを設定すると、いつでも電子メールクライアントに送信されません(例:ソース/オリジナルを表示する場合)。どういうわけか、それはコンテンツの処分のように失われています。今、長さ73336で、画像myimage.jpgを取り付け、 内容:Google App Engine(Java)でインライン電子メールの添付ファイルを送信する

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("[email protected]", "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情報は次のとおりです。

私は、次のコードを使用しています型画像/ JPEG、 [email protected]及び配置インライン

をCID

Content-Type: multipart/mixed; boundary=20cf307f3beca61df004baa44d82 
Return-Path: [email protected]ng.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:[email protected]" border="0" /></div> 
--20cf307f3beca61de604baa44d80-- 
--20cf307f3beca61df004baa44d82 
Content-Type: image/jpeg; name="DamianKathrynWeddingSaveTheDate.jpg" 
Content-Disposition: attachment; 
    filename="DamianKathrynWeddingSaveTheDate.jpg" 
Content-Transfer-Encoding: base64 

任意の考え:

電子メール・ソースの関連するスニペットは、次のようになりますか?ディスポジションとCIDがクリアされているのはなぜですか?私はいくつかの明白な部分を欠いているか、これは電子メールの不可解な芸術の例ですか?

更新:

私は、データストアにログインエンティティに送信メールをダンプしました。そこには、インライン・イメージが本当に「インライン」のContent-Dispositionを持っていることがわかります。だから、電子メールクライアントに到達するまでに、何かがそれを削除しました。変わったことは、htmlパーツが(下記のように)base64でエンコードされていることです。これは正常ですか?

ここでのGmailに到着したものです:

Message-ID: <[email protected]> 
Date: Thu, 08 Mar 2012 11:39:12 +0000 
Subject: Test invite 
From: My Name <[email protected]> 
To: My Name <[email protected]> 
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:[email protected]" 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 <[email protected]> 
To: My Name <[email protected]> 
Message-ID: <[email protected]> 
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: <[email protected]> 

/9j/4AAQSkZJRgABAQEBLAEsAAD/7QBSUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAABkcAVoAAxsl 

任意のアイデア? GAEの電子メールは、Amazon SESとPostmarkを見るとすぐに「あまりにもハードな」バスケットになります。

答えて

1

まず、Session.getDefaultInstance()をSession.getInstance()に置き換えることを検討してください。それがあなたの問題と関係があるかどうかは分かりませんが、将来の潜在的な問題を避けることができます。

メッセージが期待通りに伝わらない理由を調べるには、msg.writeTo(new FileOutputStream( "msg.txt"))を使用してTransport.send()の直前にコピーを保存してから、あなたのメールクライアントに表示されているファイルと一緒に。それらが同じでない場合は、使用しているメールサーバの1つがメッセージをと変換しているというメッセージが表示されます。のように見えるはずです。 Exchangeはこれを頻繁に行います。

0

生憎GAEは、このような機能を提供しません。

Googleは、GAEアプリケーション用の標準javax.mail APIを提供しています。 SUNの/ Oracle * .jarを依存関係リストに含める必要はありません。実際、GAEは元のSUN実装と半互換性のあるjavax.mailの独自の実装を提供しています。さらに、GAEは、ボンネットの下でいくつかの完全に予期しない操作を実行します。たとえば、純粋なHTMLメールを送信すると、受信者はHTMLで取り除かれたtext/plainメッセージと元のHTMLメールを含むmime「alternative」を含むマルチパートメッセージを取得します。また、cid埋め込みのインラインイメージでhtmlを使用しようとすると、例外が発生します。また、任意の「MimeMultiPart」ネストは、例外または未定義のビヘイビアを提供します。慎重に調べると、javax.mailのサポートが非常に限定されていることがGoogleドキュメントから明白になります。彼らはそれについても言及しています: "セキュリティ上の理由から、メッセージ部分と添付ファイルはいくつかの種類のうちの一つでなければなりません"。おそらくセキュリティはそのような限られたサポートの1つではありますが、最終的な理由ではありません。

関連する問題