java - 发布带有图像附件的加载电子邮件

标签 java jakarta-mail attachment

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

在CentOS 64bit机器上运行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)

附件具有以下 header :

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。这将避免遇到您所看到的错误。

关于java - 发布带有图像附件的加载电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28813571/

相关文章:

java - 詹姆斯的发件箱

java - 将 PDF 附加到电子邮件

java - 保护 Java 小程序中使用的图像

Java 小服务程序 : RequestDispatcher doesn't work doesn't redirect paths

JavaMail API 不适用于移动数据但适用于 Wifi

用于搜索帖子附件的 Wordpress 插件(通常是文本文件,如 doc 或 Pdf)

Android/iOS - 如何构建一个仅在您想要附加图像时才会调用的应用程序?

java - 从 AWS Lambda 内部以编程方式触发 CloudWatch 事件

java - 将 JSONArray 中的所有 null 值替换为空字符串

JavaMail - 电子邮件中的主题和收件人字段为空