2015-03-02 66 views
3

我正在使用javamail,通過Jodd Mail加載來自IMAP收件箱的電子郵件。該應用程序部署在glassfish中,並且在Windows中使用Oracle Java 7運行時沒有問題。使用圖像附件加載電子郵件問題

使用Oracle Java 7在CentOS 64位計算機上運行glassfish時,存在問題。當加載的圖像附件則拋出異常:

java.lang.IllegalArgumentException: failed to parse: 
    at java.awt.datatransfer.DataFlavor.<init>(DataFlavor.java:368) 
    at javax.activation.ActivationDataFlavor.<init>(ActivationDataFlavor.java:81) 
    at com.sun.xml.internal.ws.encoding.ImageDataContentHandler.<init>(ImageDataContentHandler.java:57) 
    at sun.reflect.GeneratedConstructorAccessor3931.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at java.lang.Class.newInstance(Class.java:379) 
    at javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:588) 
    at javax.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:542) 
    at javax.activation.CommandMap.createDataContentHandler(CommandMap.java:221) 
    at javax.activation.DataHandler.getDataContentHandler(DataHandler.java:614) 
    at javax.activation.DataHandler.getContent(DataHandler.java:542) 
    at javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:657) 
    at jodd.mail.ReceivedEmail.processPart(ReceivedEmail.java:89) 
    at jodd.mail.ReceivedEmail.processPart(ReceivedEmail.java:124) 
    at jodd.mail.ReceivedEmail.parseMessage(ReceivedEmail.java:82) 

該附件具有以下標題:

Content-Type: image/png; 
    name="image1.png" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; 
    filename="image1.png" 

我試圖與Oracle的Java 7和它運行在32位Linux機器相同的代碼段跑沒有問題。

這是javamail/java激活中的錯誤嗎?

+1

內容處置:附件; filename =「image/png」 這是正確的嗎? – fukanchik 2015-03-02 16:30:08

+0

@fukanchik它不是。我已更正標題 – 2015-03-02 16:58:45

+0

@FilipeGomes獲取圖像文件名後,如何在郵件正文中查看它?我想在郵件正文 – 2015-09-22 11:16:06

回答

2

JavaMail和JAX-WS之間的交互存在一個錯誤。我們最近修復了JDK來解決這個問題。我相信它是最新版本的,所以你可能需要在你的CentOS機器上更新你的JDK。

此外,我相信這個問題是由於在圖像上調用getContent方法造成的。許多人編寫代碼調用getContent,然後使用返回的Java類型來確定如何處理內容。這是非常低效的,並且會導致您創建許多您從不需要的Java對象。相反,您應該使用isMimeType方法根據其MIME類型決定如何處理內容。如果您要將圖像附件完成保存到文件(例如),則永遠不需要撥打getContent。這將避免遇到你所看到的錯誤。

+0

中內聯查看圖像謝謝,問題解決了。我測試的另一臺linux機器確實有7u76。 – 2015-03-03 11:12:05

+0

請問您能從哪個JDK版本中精確地修復該錯誤? – 2015-11-13 16:06:36

+0

從[基本錯誤報告](https://bugs.openjdk.java.net/browse/JDK-8043129)看起來它是在7u76首次修復的。 – 2015-11-13 20:03:11