【问题标题】:Gmail IMAP Javamail search returns no messages where web doesGmail IMAP Javamail 搜索不返回 web 的任何消息
【发布时间】:2019-01-22 14:55:11
【问题描述】:

我正在对通过电子邮件发送链接的 Web 应用程序进行负载测试。我有一个专门设置为收件人的 gmail 帐户。在生成新帐户时,我会在收件人电子邮件中添加一个 guid(例如 loadtest_nmndbiwpdi@gmaildomain.com)。当我执行测试时,它要么完全成功,要么完全失败,但失败似乎很随机。

这是我的搜索 sn-p:

        if (!inbox.isOpen()) {
            inbox.open(Folder.READ_ONLY);
        }

        SearchTerm toTerm = new RecipientTerm(RecipientType.TO, new InternetAddress(to));
        messages = inbox.search(toTerm);

当脚本运行时,它会在 100 次迭代循环中执行此操作,并暂停 3 秒。当 imap 调试时脚本输出失败时,重复显示以下内容:

A4 SEARCH TO loadtest_nmndbiwpdi@gmaildomain.com ALL
* SEARCH
A4 OK SEARCH completed (Success)

但没有实际结果。但是,在执行期间,我可以在 gmail 中搜索此收件人,然后它会立即弹出。有什么建议可以深入了解这一点吗?

【问题讨论】:

  • 您始终可以使用 Gmail 特定的搜索语法,它应该运行与 Gmail 相同的搜索。请参阅 Gmail IMAP 扩展程序。不知道JavaMail是否原生支持。
  • 嗨,Max,感谢您的建议。我切换到 GmailRawSearchTerm 并且看到了相同的行为。我也尝试了 pop 但问题是我第一次加载时会拉出所有内容并且似乎进行客户端搜索,然后后续搜索什么也不返回。这有点让我相信 gmail 正在(悄悄地)鼓励我不要将它们用作数据库,并且我应该在本地缓存所有电子邮件并在那里搜索。
  • 不是那个,是POP3不支持远程搜索。该协议非常非常愚蠢。
  • 他们的 IMAP 服务器可能有问题。您可以自己取所有信封并进行搜索。 UID 总是会增加,因此您可以随时查看最新消息。

标签: gmail jakarta-mail imap


【解决方案1】:

我实现了一个本地缓存。我在负载测试场景开始时对其进行初始化,下载最后几天的消息并捕获最后的消息 UID(使用 gmail imap 插件)。每当会话查找电子邮件时,它都会在本地缓存中查找。如果它不存在,它会设置一个标志,以便其他会话不会重叠缓存并检索最新消息。

因为是断断续续的,我想给它几天。过去 4 天运行良好。我可能会更进一步,在新邮件的文件夹上设置一个侦听器,但现在我很满意 gmail 只是返回“成功”,但在连续进行了这么多 imap 搜索后没有进行搜索。

感谢大家的反馈和建议!

【讨论】:

    【解决方案2】:

    Gmail 并未完全实现 IMAP 规范,尤其是在搜索方面。 Gmail 搜索总是针对整个单词,尽管这在这里应该不是问题。

    您可以尝试使用Gmail-specific support in JavaMail,例如GmailRawSearchTerm 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-26
      • 2011-04-29
      • 1970-01-01
      • 2015-01-26
      • 2013-12-07
      • 2012-11-08
      • 2014-03-06
      • 2014-02-12
      相关资源
      最近更新 更多