8

IMAPアカウントからJavaMail1.4.5を使用してメッセージをフェッチしようとしていますが、BODYSTRUCTURE.parseParametersメソッドでnullポインター例外が発生します。

parseParametersコードを見ると、この行が見つかります

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

問題は、setメソッドが.toLowerCase()をnull値に呼び出そうとすることです!!!

解析しようとしている応答は次のとおりです。

* 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

私はついに問題の原因を発見しました。

プロジェクトにApacheCxfを含めています。

Cxfには、一部のjavamailクラスを上書きするgeronimo-javamail_1.4_specへの参照が含まれています。

geronimoへの参照を除いて、すべてが正しく機能します!

于 2012-11-07T20:49:57.167 に答える
11

おそらく、2つの異なるバージョンのJavaMailからのJavaMailクラスが混在しています。クラスパスでjavax.mail。*クラスの他のインスタンス(おそらくj2ee.jarまたはjavaee.jar)を確認してください。

于 2012-11-06T18:10:34.227 に答える
0

私は同様の(おそらく同じ)問題を抱えていました。

この問題は、このOracleFAQに記載されているメールサーバーのバグに関連しています

解決策は次のとおりです。

  • IMAPサーバーのバグを修正する
  • または、OracleFAQに記載されている回避策を使用してください

    // 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

1台のMacでも同じ問題が発生します。別のMacでセットアップしてみました。それは魅力のように機能しました。私はすべてのJenkinsをクリーンアップし、問題のあるマシンでwarを使用してインスタンスを再開しました(別のマシンで動作したのと同じwarを使用しました)。両方のマシンで同じJavaバージョン(1.8.0_211)を使用します。ここにはプロジェクトを持ち込みませんでした。ダミープロジェクトでポーリングメールボックストリガーが正常に機能していることを確認してみました。同じエラーが発生します。個別に何も構成しなかったので、クラスパスの違いがどこにあるのかわかりません。ここでは、ポインタが役立ちます。

于 2019-07-12T11:13:57.117 に答える
0

ステファノ・ベルティーニとビル・シャノンの回答に感謝します!

私の場合、それは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 に答える