发出加载带有图像附件的电子邮件

时间:2015-03-02 15:35:30

标签: java javamail attachment

我正在使用javamail通过Jodd Mail从IMAP收件箱加载电子邮件。该应用程序部署在glassfish中,并且在使用Oracle Java 7的Windows中运行没有问题。

使用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 个答案:

答案 0 :(得分:2)

JavaMail和JAX-WS之间的交互存在一个错误。我们最近在JDK中修复了一个问题来解决这个问题。我相信它已在最新版本中提供,因此您可能需要在CentOS计算机上更新JDK。

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