JavaMail 使用来自 sun 内部 "saaj" 包的 MimeMultipart

JavaMail uses MimeMultipart from sun internal "saaj" package

我使用 Spring Boot 和 Apache Camel 作为读取电子邮件、提取附件并进行处理的后台进程。

在第一个版本中这工作正常。第二个版本添加了一个网络服务,包括发送附件。现在,电子邮件附件提取有时有效,有时无效。来自 Camel mailbinding class 的调试消息是:

No attachments to extract as content is not Multipart: com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeMultipart

我怀疑 saaj MimeMultipart class 用于 Web 服务 + 附件,但我们不知道为什么 JavaMail 选择此 class 而不是 javax.mail.internet.MimeMultipart?

有什么想法吗?我们如何防止这种情况?

这是上述日志行的上下文:

o.a.camel.component.mail.MailConsumer    : Fetching 1 messages. Total 1 messages.
o.a.camel.component.mail.MailConsumer    : Mail #0 is of type: com.sun.mail.imap.IMAPMessage - com.sun.mail.imap.IMAPMessage@28091f09
o.a.camel.component.mail.MailConsumer    : Mapping #0 from javax.mail.Message to Camel MailMessage
o.a.camel.component.mail.MailBinding     : Extracting attachments +++ start +++
o.a.camel.component.mail.MailBinding     : No attachments to extract as content is not Multipart: com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeMultipart
o.a.camel.component.mail.MailBinding     : Extracting attachments +++ done +++

这是一个 JRE 错误:JDK-8043129 : JAF initialisation in SAAJ clashing with the one in javax.mail 它说

After initialisation of SAAJ components the JAF handlers defined defined by javax.mail don't work.

它解释了第一封邮件的成功处理(使用 Web 服务进一步处理管道)和后续邮件的附件处理失败。

解决方法很简单:此错误已在 Java 7 Update 76 和 Java 8 Update 20 中修复。

这个问题再次强调了在开发和生产环境中保持相同软件版本的重要性。