【问题标题】:Gmail POP3 not getting all messages in Java applicationGmail POP3 未在 Java 应用程序中获取所有邮件
【发布时间】:2015-11-05 00:37:12
【问题描述】:

我已为我的 gmail 启用 POP3 设置。我可以在 Java 应用程序中使用我的密码连接到 POP3 商店。我的收件箱中有大约 10k 条消息。

当我在收件箱文件夹中调用 getMessages 时,它只返回 280 条旧邮件。当我循环调用getMessages 时,每次调用都会返回相同的消息。我也试过getMessages(start, end),但它不返回除了那些 280 之外的其他消息。

如何检索其他消息?

【问题讨论】:

  • 感谢 @theDmi 的努力

标签: java email gmail jakarta-mail pop3


【解决方案1】:

默认情况下,GMail 的 POP3 和 IMAP 服务器的行为与标准 POP3 或 IMAP 服务器不同,并使用这些协议隐藏来自客户端的消息(以及其他非标准行为)。

如果您想配置您的 GMail POP3 或 IMAP 设置,使其按照 POP3 和 IMAP 的预期行为方式按照其协议规范运行,您需要通过网络浏览器登录到您的 GMail 帐户并导航到您的 GMail Settings 页面的 Forwarding and POP/IMAP 选项卡,并将您的选项设置为如下所示:

POP3 下载

[X] 为所有邮件启用 POP(即使是已经下载的邮件)

IMAP 访问

[X] 启用 IMAP

[X] 自动删除关闭 - 等待客户端更新服务器

[X]立即永久删除消息

【讨论】:

  • @jstedfast,我已经配置了POP3设置,请看:link。它仍然没有给我收件箱中的所有消息。
  • 您似乎没有单击“所有邮件”选择按钮。
  • @Bill Shannon 感谢您的回复,请查看POP3 Settings。您仍然指向不同的设置吗?
【解决方案2】:

不是一个真正的答案,但我通过使用 Mailkit 的IMAP 解决了这个问题。另外,这是 C#,不是 Java 代码,但也许它可以帮助遇到同样问题的人:

      var emails = new List<EmailMessage>();

      using (var client = new ImapClient())
      {
        client.Connect("imap.gmail.com", _smtpConfig.SSLIMAPPort, SecureSocketOptions.SslOnConnect);
        client.ServerCertificateValidationCallback = (s, c, h, e) => true;
        client.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
        client.AuthenticationMechanisms.Remove("XOAUTH2");
        client.Authenticate(smtpConfig.PopUsername, smtpConfig.PopPassword);

        client.Inbox.Open(FolderAccess.ReadWrite);
        var items = client.Inbox.Fetch(0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure);

        foreach (var item in items)
        {
          if (item.TextBody != null)
          {
            var mime = (TextPart)client.Inbox.GetBodyPart(item.UniqueId, item.TextBody);
            var text = mime.Text;

            var email = new EmailMessage
            {
              Body = text
            };

            emails.Add(email);
          }
        }

        client.Disconnect(true);
      }

      return emails;

Thanks to jstedfast - it was all done using his docs.

【讨论】:

  • 这确实是正确的做法。 GMail 的 POP3 支持基本上被破坏了,因为他们希望您使用“下载和删除”类型的客户端,并且默认情况下不会向您显示更多消息,直到您“删除”他们向您显示的消息。
  • 您的另一个选择是查看过去 30 天电子邮件的窗口。 POP3 作为一种协议,并没有真正设计为“同步”协议,并且不能很好地扩展到数千条消息。认识到这一点后,Gmail 对其进行了削弱。
  • 谢谢 Max - 我一直在研究这个问题,但我不太明白为什么它不起作用。希望这对其他人有帮助。 Mailkit 的文档很棒,但只有在您知道自己在寻找什么时(就像任何好的文档一样)。
  • 您最好将您的后续问题作为一个新问题提出,而不是作为赏金;它确实与原始问题无关,因为它与 POP3、Java 或 JavaMail 无关。
  • @Max 我无法取消赏金,所以我的逻辑是它可能会交给某人,尽管你是对的。
猜你喜欢
  • 2012-04-24
  • 2023-03-11
  • 1970-01-01
  • 2015-10-29
  • 2010-09-08
  • 2021-04-07
  • 1970-01-01
  • 2013-05-19
  • 2019-04-18
相关资源
最近更新 更多