2015-03-02 69 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