加载图像附件问题 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
。这将避免 运行 进入您所看到的错误。
我正在通过 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
。这将避免 运行 进入您所看到的错误。