加载图像附件问题 e-mail

Issue loading e-mail with image attachment

我正在通过 Jodd Mail 使用 javamail 从 IMAP 收件箱加载 e-mail 邮件。该应用程序部署在 glassfish 和 运行 中,在 Windows 中没有问题,使用 Oracle Java 7.

运行 在 CentOS 64 位机器的 glassfish 中,用 Oracle Java 7,有问题。加载图像附件时抛出异常:

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)

附件有以下headers:

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

我在装有 Oracle Java 7 的 32 位 linux 机器上尝试了 运行 相同的代码片段,运行 没有问题。

这是 javamail/java 激活中的错误吗?

JavaMail 和 JAX-WS 之间的交互存在错误。我们最近对 JDK 进行了修复以解决此问题。我相信它有最新版本,因此您可能需要在您的 CentOS 机器上更新 JDK。

此外,我认为这个问题是由于在图像上调用 getContent 方法引起的。许多人编写调用 getContent 的代码,然后使用返回的 Java 类型来确定如何处理内容。这是非常低效的,并且会导致您创建许多您永远不需要的 Java 对象。相反,您应该使用 isMimeType 方法根据内容的 MIME 类型来决定如何处理内容。如果您对图像附件所做的只是将其保存到文件中(例如),您永远不需要调用 getContent。这将避免 运行 进入您所看到的错误。