Gmail POP3无法获取Java应用程序中的所有消息

时间:2015-08-12 11:59:03

标签: java email gmail javamail pop3

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

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

如何检索其他消息?

2 个答案:

答案 0 :(得分:0)

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

如果您要将GMail POP3或IMAP设置配置为按照其协议规范的方式执行POP3和IMAP的行为,则需要通过Web浏览器登录到您的GMail帐户并导航到您的GMail Forwarding and POP/IMAP页面的Settings标签,并将您的选项设置为:

POP3下载

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

IMAP访问

[X]启用IMAP

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

[X]立即删除邮件

答案 1 :(得分:0)

这不是一个真正的答案,但是我通过使用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.