8

我正在尝试使用 JavaMail 1.4.5 从 IMAP 帐户获取消息,但在BODYSTRUCTURE.parseParameters方法中出现空指针异常。

查看 parseParameters 代码,我找到了这一行

list.set(null, "DONE"); // XXX - hack

问题是 set 方法试图将.toLowerCase()调用为空值!!!

它试图解析的响应是这样的:

* 1 FETCH (BODYSTRUCTURE (("TEXT" "PLAIN" ("CHARSET" "us-ascii") NIL NIL "7BIT" 55 4 NIL NIL NIL NIL)(("TEXT" "HTML" ("CHARSET" "us-ascii") NIL NIL "7BIT" 410 10 NIL NIL NIL NIL)("IMAGE" "JPEG" ("NAME" "image.jpg") "<53498286-6B3E-4AC8-8CA0-481152C80968@xxxx.it>" NIL "BASE64" 536628 NIL ("inline" ("FILENAME" "image.jpg")) NIL NIL) "RELATED" ("TYPE" "text/html" "BOUNDARY" "Apple-Mail=_56FA3EC6-FB02-4882-A1C5-487652E3B4E5") NIL NIL NIL) "ALTERNATIVE" ("BOUNDARY" "Apple-Mail=_CB164992-2501-4351-94D1-61CE7C8D90DC") NIL NIL NIL))

并且,启用调试,我得到这些消息:

DEBUG IMAP: parsing BODYSTRUCTURE 
DEBUG IMAP: msgno 1 
DEBUG IMAP: parsing multipart 
DEBUG IMAP: parsing BODYSTRUCTURE 
DEBUG IMAP: msgno    1 
DEBUG IMAP: single part 
DEBUG IMAP: type TEXT 
DEBUG IMAP: subtype    PLAIN 
DEBUG IMAP: parameter name CHARSET 
DEBUG IMAP: parameter value    us-ascii

然后是 NullPointerException

Exception in thread "main" java.lang.NullPointerException
at javax.mail.internet.ParameterList.set(ParameterList.java:165)
at com.sun.mail.imap.protocol.BODYSTRUCTURE.parseParameters(BODYSTRUCTURE.java:404)
at com.sun.mail.imap.protocol.BODYSTRUCTURE.<init>(BODYSTRUCTURE.java:224)
at com.sun.mail.imap.protocol.BODYSTRUCTURE.<init>(BODYSTRUCTURE.java:109)
at com.sun.mail.imap.protocol.FetchResponse.parse(FetchResponse.java:158)
at com.sun.mail.imap.protocol.FetchResponse.<init>(FetchResponse.java:67)
at com.sun.mail.imap.protocol.IMAPResponse.readResponse(IMAPResponse.java:136)
at com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:270)
at com.sun.mail.iap.Protocol.command(Protocol.java:313)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:1529)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:1521)
at com.sun.mail.imap.protocol.IMAPProtocol.fetchBodyStructure(IMAPProtocol.java:1221)
at com.sun.mail.imap.IMAPMessage.loadBODYSTRUCTURE(IMAPMessage.java:1307)
at com.sun.mail.imap.IMAPMessage.getDataHandler(IMAPMessage.java:623)
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:927

感谢任何可以帮助我的人!

4

6 回答 6

14

我终于找到了问题的原因。

我在我的项目中包含了 Apache Cxf。

Cxf 包含对 geronimo-javamail_1.4_spec 的引用,它覆盖了一些 javamail 类。

排除对 geronimo 的引用,一切正常!

于 2012-11-07T20:49:57.167 回答
11

您可能已经混合了来自两个不同版本的 JavaMail 的 JavaMail 类。检查您的类路径以查找 javax.mail.* 类的其他实例,可能在 j2ee.jar 或 javaee.jar 中。

于 2012-11-06T18:10:34.227 回答
0

我有类似(也许相同)的问题。

该问题与此处Oracle 常见问题解答中描述的邮件服务器错误有关。

解决方案是:

  • 修复 IMAP 服务器中的错误
  • 或使用 Oracle FAQ 中描述的解决方法

    // Get the message object from the folder in the
    // usual way, for example:
    MimeMessage msg = (MimeMessage)folder.getMessage(n);
    
    // Use the MimeMessage copy constructor to make a copy
    // of the entire message, which will fetch the entire
    // message from the server and parse it on the client:
    MimeMessage cmsg = new MimeMessage(msg);
    
    // The cmsg object is disconnected from the server so
    // setFlags will have no effect (for example).  Use
    // the original msg object for such operations.  Use
    // the cmsg object to access the content of the message.
    

或者

// Get the message object from the folder in the
// usual way, for example:
MimeMessage msg = (MimeMessage)folder.getMessage(n);

// Copy the message by writing into an byte array and
// creating a new MimeMessage object based on the contents
// of the byte array:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
msg.writeTo(bos);
bos.close();
SharedByteArrayInputStream bis =
        new SharedByteArrayInputStream(bos.toByteArray());
MimeMessage cmsg = new MimeMessage(session, bis);
bis.close();

// The cmsg object is disconnected from the server so
// setFlags will have no effect (for example).  Use
// the original msg object for such operations.  Use
// the cmsg object to access the content of the message.

多亏了这个 Oracle 论坛帖子,我才找到了这个

于 2014-11-07T13:10:20.077 回答
0

谢谢你给我这个问题的建议

我在我的项目中添加了以下依赖项并且一切正常

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-api</artifactId>
    <version>2.1.3</version>
    <type>jar</type>
</dependency> 
于 2016-04-04T16:20:25.063 回答
0

我在一台 Mac 上遇到了同样的问题。我试过在另一台mac上设置它。它就像魅力一样。我已经清理了所有 Jenkins 并在有问题的机器上再次使用 war 启动了实例(使用了在另一台机器上工作的相同的战争)。在两台机器上都有相同的 Java 版本 (1.8.0_211)。我没有在这里引入任何项目,只是尝试检查投票邮箱触发器与虚拟项目是否正常工作。我犯了同样的错误。我也不知道类路径的区别在哪里,因为我没有单独配置任何东西。任何指针在这里都会有所帮助。

于 2019-07-12T11:13:57.117 回答
0

非常感谢 Stefano Bertini 和 Bill Shannon 的回答!

就我而言,它是从 cxf-rt-frontend-jaxws 中排除的:

<!-- CXF -->
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>${cxf.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-javamail_1.4_spec</artifactId>
        </exclusion>
    </exclusions>
</dependency>
于 2021-03-09T11:02:14.850 回答