Javax.Mail 尝试使用 gmail 的 imap 扩展访问 X-GM-MSGID
Javax.Mail trying to use gmail's imap extension to access X-GM-MSGID
我正在尝试使用 google 为 javax.mail 中的 gmail 创建的 X-GM-EXT-1
IMAP 扩展。在此处记录 https://developers.google.com/gmail/imap/imap-extensions
我专门尝试使用 UID FETCH
语法扩展来获取 X-GM-MSGID
headers 的序列。
我正在使用的 java 代码:
(我在我的命令中使用了真实的 uid,但为了举例,我从文档的示例中粘贴了相同的范围)
Response[] r = (Response[]) folder.doCommand(protocol -> protocol.command("UID FETCH 1:4 (X-GM-MSGID)", null));
这种声明 imap 命令的方式对我适用于其他扩展(特别是 ESEARCH)
这是来自文档的片段,它是来源 material 我的实验基于此。
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[]
object 包含多个响应行,一个用于每个获取的消息,然后是标记的 OK FETCH (Success)
行。但是,我的回复中只有一行 A57 OK Success
。我不确定这意味着什么,也许 javax.mail 没有像我预期的那样在幕后做某事,或者可能需要做一些特定的事情才能访问完整的响应。
是否有更好或更正确的方法来使用此扩展程序?
编辑:
这是一个可执行示例,它将我描述的输出打印到控制台。一个要求是通过需要传入的imap store认证的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:
在邮件 session 中启用调试模式后,我看到异常被抛出并从常规输出中隐藏。
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(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 后对相同示例代码的快速测试仍然有相同的结果。所以这不是 "fixed" 随着时间的推移。 (引用是因为我不知道 javamail 是否有错误,或者我是否误用了它)
你做得很辛苦。只需使用 "gimap" protocol provider for JavaMail.
我正在尝试使用 google 为 javax.mail 中的 gmail 创建的 X-GM-EXT-1
IMAP 扩展。在此处记录 https://developers.google.com/gmail/imap/imap-extensions
我专门尝试使用 UID FETCH
语法扩展来获取 X-GM-MSGID
headers 的序列。
我正在使用的 java 代码: (我在我的命令中使用了真实的 uid,但为了举例,我从文档的示例中粘贴了相同的范围)
Response[] r = (Response[]) folder.doCommand(protocol -> protocol.command("UID FETCH 1:4 (X-GM-MSGID)", null));
这种声明 imap 命令的方式对我适用于其他扩展(特别是 ESEARCH)
这是来自文档的片段,它是来源 material 我的实验基于此。
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[]
object 包含多个响应行,一个用于每个获取的消息,然后是标记的 OK FETCH (Success)
行。但是,我的回复中只有一行 A57 OK Success
。我不确定这意味着什么,也许 javax.mail 没有像我预期的那样在幕后做某事,或者可能需要做一些特定的事情才能访问完整的响应。
是否有更好或更正确的方法来使用此扩展程序?
编辑:
这是一个可执行示例,它将我描述的输出打印到控制台。一个要求是通过需要传入的imap store认证的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:
在邮件 session 中启用调试模式后,我看到异常被抛出并从常规输出中隐藏。
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(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 后对相同示例代码的快速测试仍然有相同的结果。所以这不是 "fixed" 随着时间的推移。 (引用是因为我不知道 javamail 是否有错误,或者我是否误用了它)
你做得很辛苦。只需使用 "gimap" protocol provider for JavaMail.