2014-03-12 21 views
1

我想發送一封電子郵件與Java郵件API(javax.mail)。消息必須包含html,並且裏面有對圖像的引用。這是一個挑戰,因爲不允許引用磁盤上的物理文件,但我已經爲該映像創建了一個base64字符串(http://www.base64-image.de/step-1.php),並將該數據複製到靜態字符串變量。 With javax.mail我建立了一個類型爲的消息MulitPart分爲兩部分。第一部分是html本身,第二部分是圖像。通過<img src="cid:image-id"/>.html電子郵件參考圖像base64字符串

Message msg = new MimeMessage(session); 
Multipart multipart = new MimeMultipart("related"); 
BodyPart htmlPart = new MimeBodyPart(); 
     htmlPart.setContent("<html><body><h2>A title</h2>Some text in here<br/>" + 
       "<img src=\"cid:the-img-1\"/><br/> some more text<img src=\"cid:the-img-1\"/></body></html>", "text/html"); 
multipart.addBodyPart(htmlPart); 

public static final String base64logo = "/9j/4AAQSkZJRgABAQEASABIAAD/4QBe…"; // ein ganz langer String erzeugt über http://www.base64-image.de/step-1.php 

sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder(); 
byte[] imageByte = decoder.decodeBuffer(base64logo); 
InternetHeaders header = new InternetHeaders(); 
BodyPart imgPart=new MimeBodyPart(header, imageByte); 
imgPart.setHeader("Content-ID","the-img-1"); 
imgPart.setDisposition(MimeBodyPart.INLINE); 
multipart.addBodyPart(imgPart); 
msg.setContent(multipart); 

HTML部分參考圖像不幸的是,圖像中缺少接收的電子郵件。

當我指出我的磁盤上的文件,它的工作:

DataSource ds=new FileDataSource("c:/temp/image001.jpg"); 
imgPart.setDataHandler(new DataHandler(ds)); 

我們與拓藍髮展,我們不能引用 到外部文件,因爲這將使部署過程 更加複雜。

你可以在我的方法中找到一些錯誤的做法嗎?

親切的問候 Hilderich

+1

一般方法是正確的。我懷疑圖像引用有問題。查看您發送的郵件的*完整*來源。圖像應該在那裏,檢查你引用它的ID是否正確。 – Durandal

+0

謝謝!但是引用(Content-ID)拼寫正確。 – Hilde

+0

我有同樣的問題,你找到任何解決方案? – TwTw

回答

0

很久以前就有人問過這個問題。但我會回答這個問題,因爲我面臨同樣的問題,從我自己的回答here

byte[] tile = DatatypeConverter.parseBase64Binary(base64logo); 
BodyPart messageBodyPart = new MimeBodyPart(); 
DataHandler dataHandler = new DataHandler(new ByteArrayDataSource(tile, "image/jpeg")); 
messageBodyPart.setDataHandler(dataHandler); 
messageBodyPart.setHeader("Content-ID", "<the-img-1>"); 
multipart.addBodyPart(messageBodyPart); 
msg.setContent(multipart); 

希望它能幫助別人。