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

Gmail POP3无法在Java应用程序中获取所有消息,java,email,gmail,jakarta-mail,pop3,Java,Email,Gmail,Jakarta Mail,Pop3,我已经为我的gmail启用了POP3设置。我可以在Java应用程序中使用我的密码连接到POP3商店。我的收件箱里有大约一万封邮件 当我在收件箱文件夹中调用getMessages时,它只返回280条旧邮件。当我在循环中调用getMessages时,每次调用都会返回相同的消息。我还尝试了getMessages(start,end),但它不会返回那些消息以外的其他消息 如何检索其他邮件?默认情况下,GMail的POP3和IMAP服务器的行为与标准POP3或IMAP服务器不同,并且使用这些协议(以及其他

我已经为我的gmail启用了POP3设置。我可以在Java应用程序中使用我的密码连接到POP3商店。我的收件箱里有大约一万封邮件

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


如何检索其他邮件?

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

如果您想配置您的GMail POP3或IMAP设置,使其按照POP3和IMAP的协议规范进行操作,您需要通过web浏览器登录您的GMail帐户,并导航到GMail
设置
页面的
转发和弹出/IMAP
选项卡,然后将选项设置为如下所示:

POP3下载

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

IMAP访问

[十] 启用IMAP

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


[十] 立即永久删除邮件

这不是真正的答案,但我通过使用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.
var电子邮件=新列表();
使用(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.authenticationMechaniss.Remove(“XOAUTH2”);
Authenticate(smtpConfig.PopUsername,smtpConfig.PopPassword);
client.Inbox.Open(FolderAccess.ReadWrite);
var items=client.Inbox.Fetch(0,-1,MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure);
foreach(项目中的var项目)
{
如果(item.TextBody!=null)
{
var mime=(TextPart)client.Inbox.GetBodyPart(item.UniqueId,item.TextBody);
var text=mime.text;
var email=新的EmailMessage
{
正文=文本
};
电子邮件。添加(电子邮件);
}
}
client.Disconnect(true);
}
回复邮件;
多亏了jstedfast——这一切都是用他的文档完成的。

@jstedfast,我已经配置了POP3设置,请查看:。但它并没有给我收件箱中的所有邮件。它看起来确实不像你点击了“所有邮件”选择按钮。@Bill Shannon谢谢你的回复,请检查。你仍然指向不同的设置?谢谢@theDmi的努力这确实是正确的做法。GMail对POP3的支持基本上已被打破,因为他们希望你使用“下载并删除”类型的客户端,并且在默认情况下,在你“删除”他们向你显示的邮件之前,不会向你显示更多的邮件。你的另一个选择是查看你最近30天的邮件。POP3作为一种协议,并不是真正设计为“同步”协议,也不能很好地扩展到数千条消息中。认识到这一点,Gmail削弱了它。谢谢Max——我已经看了一段时间了,我不太明白它为什么不起作用。希望这能帮助其他人。Mailkit的文档很棒,但只有当你知道你在寻找什么(就像任何好的文档一样)。你最好把后续问题作为一个新问题来问,而不是作为奖励;这真的与原来的问题无关,因为它与POP3、Java或JavaMail无关。@Max我不能取消赏金,所以我的逻辑是,它可能会交给某人,尽管你是对的。