Javax.Mail 尝试使用 gmail 的 imap 扩展来访问 X-GM-MSGID

问题描述 投票:0回答:2

我正在尝试在javax.mail中使用google为gmail创建的

X-GM-EXT-1
IMAP扩展。文档在这里https://developers.google.com/gmail/imap/imap-extensions

我特别尝试使用

X-GM-MSGID
语法扩展来获取一系列
UID FETCH
标头。

我正在使用的java代码: (我在命令中使用真实的 uids,但为了举例,我粘贴了文档示例中的相同范围)

Response[] r = (Response[]) folder.doCommand(protocol -> protocol.command("UID FETCH 1:4 (X-GM-MSGID)", null));

这种声明 imap 命令的方式对我来说适用于其他扩展(特别是 ESEARCH)

这是文档中的一个片段,它是我实验所依据的源材料。

a008 FETCH 1:4 (X-GM-THRID)
* 1 FETCH (X-GM-THRID 1278455344230334865)
* 2 FETCH (X-GM-THRID 1266894439832287888) 
* 3 FETCH (X-GM-THRID 1266894439832287888)
* 4 FETCH (X-GM-THRID 1266894439832287888)
a008 OK FETCH (Success)

我期望我的

Response[]
对象包含多个响应行,每个响应行对应每条获取的消息,然后是标记的
OK FETCH (Success)
行。然而,我的回复中只得到一行
A57 OK Success
。我不确定这意味着什么,也许 javax.mail 没有按照我预期的方式执行某些操作,或者可能需要执行某些特定操作才能访问完整响应。

有更好的方法,或更正确的方法来使用此扩展吗?

编辑:

这是一个可执行示例,它将我描述的输出打印到控制台。一项要求是,通过需要传入的 imap 存储进行身份验证的 gmail 收件箱文件夹中必须至少有 1 条消息,以便 ESEARCH 能够识别要使用的 MIN uid。

private void MCVE(IMAPStore store) throws MessagingException {
    IMAPFolder inbox = (IMAPFolder) store.getFolder("Inbox");
    inbox.open(Folder.READ_ONLY, ResyncData.CONDSTORE);

    Response[] minUidResponse = (Response[]) inbox.doCommand(
            protocol -> protocol.command("UID SEARCH RETURN (min max count all) 1:*", null)
    );

    String minUid = "";
    for (Response aLine : minUidResponse) {
        String str = aLine.toString();
        if (str.startsWith("* ESEARCH")) {
            List<String> tokens = Arrays.asList(str.split(" "));
            minUid = tokens.get(tokens.indexOf("MIN") + 1);
        }
    }

    final String finalMinUid = minUid; // lambas need effectively final stuff
    Response[] gidResponse = (Response[]) inbox.doCommand(
            protocol -> protocol.command("UID FETCH " + finalMinUid + " (X-GM-MSGID)", null)
    );

    System.out.println("Printing result of X-GM-MSGID uid fetch");
    for (Response r : gidResponse) {
        System.out.println(r.toString());
    }
}

编辑2:

在邮件会话中启用调试模式后,我看到正在抛出异常并隐藏在常规输出中。

 DEBUG IMAP: connection available -- size: 1
 A4 ENABLE CONDSTORE
 * ENABLED
 A4 OK Success
 A5 EXAMINE Inbox (CONDSTORE)
 * FLAGS (\Answered \Flagged \Draft \Deleted \Seen $NotPhishing $Phishing)
 * OK [PERMANENTFLAGS ()] Flags permitted.
 * OK [UIDVALIDITY 1] UIDs valid.
 * 7 EXISTS
 * 0 RECENT
 * OK [UIDNEXT 23071] Predicted next UID.
 * OK [HIGHESTMODSEQ 1327692]
 A5 OK [READ-ONLY] Inbox selected. (Success)
 A6 UID SEARCH RETURN (min max count all) 1:*
 * ESEARCH (TAG "A6") UID COUNT 7 MIN 23064 MAX 23070 ALL 23064:23070
 A6 OK SEARCH completed (Success)
 A7 UID FETCH 23064 (X-GM-MSGID)
 * 1 FETCH (X-GM-MSGID 1594485864262816838 UID 23064 MODSEQ (1327330))
 DEBUG IMAP: ignoring bad response, THROW:
 com.sun.mail.iap.ParsingException: error in FETCH parsing, unrecognized item at index 11, starts with "X-GM-MSGID 159448586..."
     at com.sun.mail.imap.protocol.FetchResponse.parse(FetchResponse.java:219)
     at com.sun.mail.imap.protocol.FetchResponse.<init>(FetchResponse.java:96)
     at com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:392)
     at com.sun.mail.iap.Protocol.command(Protocol.java:354)
     at my.package.ImapSync.lambda$MCVE$5(ImapSync.java:85)
     at com.sun.mail.imap.IMAPFolder.doProtocolCommand(IMAPFolder.java:3784)
     at com.sun.mail.imap.IMAPFolder.doCommand(IMAPFolder.java:3734)
     at my.package.ImapSync.MCVE(ImapSync.java:84)
     ...
 A7 OK Success


 Printing result of X-GM-MSGID uid fetch
 A7 OK Success

编辑3:

我使用的javamail版本是1.5.5。我将尝试升级到 1.6.1,看看这是否会改变服务器响应的解析方式。

升级到 1.6.1 后对相同示例代码进行快速测试,结果仍然相同。所以这并不是随着时间的推移而“修复”的事情。 (引用是因为我不知道javamail是否有bug,或者我是否误用它)

java gmail jakarta-mail imap gmail-imap
2个回答
2
投票

你做得很艰难。只需使用 JavaMail 的 “gimap” 协议提供程序


0
投票

Cyber Genie 在解决加密货币被盗或丢失给骗子或发送到错误钱包的问题上已被铭记在心。例如,他们帮助客户在欺诈性投资计划中丢失或被盗以太坊、比特币和其他加密货币。立即在 Telegram 上查找 -CYBERGENIEHACKPRO-。

© www.soinside.com 2019 - 2024. All rights reserved.