IMAP 函数 SEARCHSINCE <date> 到 GMAIL returns 不完整的电子邮件列表

IMAP function SEARCHSINCE <date> to GMAIL returns incomplete list of emails

我正在对一个(我认为)已经运行了一年或更长时间的流程进行故障排除。此解决方案更新了较新版本的解决方案软件,现在看来我们的 IMAP 检索过程之一无法正常工作。 (在更新之前,我没有听到任何关于它的抱怨 - 因此它一定是有效的,对吧?:) 但我没有来自 'before the update' 的任何数据或样本来确切知道它是什么样的结果到时候。)

此解决方案在 FileMaker 中编码,使用 MBS 插件实现 cURL 功能。此过程使用 cURL 命令通过 IMAP 协议连接到 GMail 帐户。此过程每小时运行一次。

总的来说,它运行良好 - 没有错误。问题是它似乎 return 发送了错误的电子邮件集。我们使用 'SEARCHSINCE 18-Oct-2021' 函数来限制找到的电子邮件。

如果我在浏览器中登录帐户,我会在收件箱中看到 10 月 19 日收到的 6 封电子邮件。

当我在 Gmail 网络界面中进行搜索时:After:2021/10/18 我收到 24 封电子邮件,这些电子邮件包括 10 月 19 日收到的新邮件。

  1. IMAP 问题示例:SEARCHSINCE 19-Oct-2021

• 实际:11 封电子邮件... • 但是 - 这些电子邮件来自 10/18,而不是 >=10/19...这些结果不包括 10/19 的任何内容。

  1. IMAP 问题示例:SEARCHSINCE 18-Oct-2021

•实际:38 封电子邮件...

•但是 - 其中一些电子邮件来自 10/15,而不是 >=10/18;并且这些结果不包括 10/19 的任何内容。

(我检查了两次搜索中的示例电子邮件,来源中的 'Date' 和 'ReceivedOn' headers 的日期为 10/15。)

  1. 一时兴起,我将搜索日期设置为 2021 年 10 月 20 日

•结果 = 无 ID

这是一个实际的 IMAP 交换:

Connected to imap.gmail.com (74.125.142.109) port 993 (#0)
TLSv1.3 (OUT), TLS handshake, Client hello (1):
TLSv1.3 (IN), TLS handshake, Server hello (2):
TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
TLSv1.3 (IN), TLS handshake, Certificate (11):
TLSv1.3 (IN), TLS handshake, CERT verify (15):
TLSv1.3 (IN), TLS handshake, Finished (20):
TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
TLSv1.3 (OUT), TLS handshake, Finished (20):
SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
Server certificate:
 subject: CN=imap.gmail.com
 start date: Sep 13 03:11:41 2021 GMT
 expire date: Nov 20 03:11:40 2021 GMT
 issuer: C=US; O=Google Trust Services LLC; CN=GTS CA 1C3
 SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
old SSL session ID is stale, removing
* OK Gimap ready for requests from <server>  <id>
A001 CAPABILITY
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH
A001 OK Thats all she wrote! <id>
A002 AUTHENTICATE PLAIN <key>
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- SPECIAL-USE APPENDLIMIT=35651584
A002 OK <email account> authenticated (Success)
A003 SELECT INBOX
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen $NotPhishing $Phishing)
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen $NotPhishing $Phishing \*)] Flags permitted.
* OK [UIDVALIDITY 1] UIDs valid.
* 5101 EXISTS
* 0 RECENT
* OK [UIDNEXT 5114] Predicted next UID.
* OK [HIGHESTMODSEQ 793152]
A003 OK [READ-WRITE] INBOX selected. (Success)
A004 SEARCH SENTSINCE 19-Oct-2021
* SEARCH 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101
A004 OK SEARCH completed (Success)
Connection #0 to host imap.gmail.com left intact

有人知道如何让 Google 工作吗?

编辑,10/20:测试了一些额外的东西,但我似乎在使用 IMAP 时得到了相同的结果,这与我通过 GMail 网络搜索界面得到的结果不匹配。

此收件箱中有 3 封来自今天 (10/20) 的电子邮件。

找到 Gmail 的 IMAP 扩展,并尝试使用它进行搜索。它使用 GMail-interface-style 搜索输入。而不是 'SEARCH SENTSINCE',有了这个扩展,它看起来像:

SEARCH X-GM-RAW "after:2021/10/19"

结果:未找到来自 10/20

的消息

形式略有不同(这是 2021 年 10 月 19 日的 Unix 纪元秒数):

SEARCH X-GM-RAW "after:1634626801"

结果:没有来自 10/20

的电子邮件

直接在 Gmail 网络界面中搜索:'after:1634626801' = 19 个结果,包括来自 10/20(今天)的电子邮件

也试过:

SEARCH SINCE 2021-10-19

结果:没有来自 10/20 的消息(return 来自 10/19 的消息)。

所以 IMAP 搜索结果是一致的,至少在不同的搜索方法中是这样。但它们不是我需要的结果 - 它没有找到最新的东西。

我终于明白了。这个过程的 FMP 脚本中有一个错误。它不是 MBS,也不是 IMAP,也不是 Google(该死的)。

具体而言,发出了两个不同的 IMAP 命令。 SEARCH(这是我在上面展示的,我认为错误所在的位置),然后是 RETRIEVE。问题是这两个命令引用了不同的 ID:IMAP 有两个 ID——默认的 'Id' 和 'UID'。它们非常相似——它们都是序列号——但它们并不相同。 UID 更永久。所以我的搜索返回了 'default' 种类的消息 ID,而检索引用了电子邮件的 'UID' 值。

搜索(未指定 UID,因此 returns 默认 ID):

SEARCH SINCE 10-Oct-2021

检索(使用 UID)

imaps://<ServerName>/INBOX?UID=...

新搜索(returns 个 UID,以便匹配检索):

UID SEARCH SINCE 10-Oct-2021