Email Delphi和Indy 10无法阅读gmail电子邮件。阅读一次后的时间

Email Delphi和Indy 10无法阅读gmail电子邮件。阅读一次后的时间,email,delphi,gmail,indy,Email,Delphi,Gmail,Indy,我尝试从gmail帐户获取电子邮件的数量,这是第一次正常工作,每次之后,只要我没有断开与服务器的连接(在执行断开连接命令之前,我通过调试器停止执行)。 但当我执行断开连接时,我无法再检索电子邮件,电子邮件数量始终为0。但当我在线检查时,电子邮件仍在收件箱中,我可以在线打开电子邮件并阅读内容,bit无法再使用Indy检索电子邮件 这只会发生在gmail上,而不会发生在我尝试过的其他电子邮件帐户上 下面是代码的一部分。 pop.CheckMessages第一次返回1,但一旦我断开连接并重新启动,它总

我尝试从gmail帐户获取电子邮件的数量,这是第一次正常工作,每次之后,只要我没有断开与服务器的连接(在执行断开连接命令之前,我通过调试器停止执行)。 但当我执行断开连接时,我无法再检索电子邮件,电子邮件数量始终为0。但当我在线检查时,电子邮件仍在收件箱中,我可以在线打开电子邮件并阅读内容,bit无法再使用Indy检索电子邮件

这只会发生在gmail上,而不会发生在我尝试过的其他电子邮件帐户上

下面是代码的一部分。 pop.CheckMessages第一次返回1,但一旦我断开连接并重新启动,它总是返回0

有人知道我做错了什么吗?这就好像邮件被标记了,无法通过电子邮件客户端再次阅读

pop:=tidpop3.Create(nil);
pop.Host := 'pop.gmail.com';
pop.Port := 995;
pop.Username := MyUserName;
pop.Password := MyPassword;
pop.ConnectTimeout := 10000;
ssl := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
ssl.SSLOptions.Method := sslvTLSv1;
ssl.SSLOptions.Mode := sslmClient;
pop.IOHandler := ssl;
pop.UseTLS := utUseImplicitTLS;
pop.Connect;
num:=pop.CheckMessages;
pop.Disconnect;
pop.Free;
ssl.Free;

POP从服务器上删除电子邮件-您只需阅读一次(至少在大多数实现中-这有点让人困惑,这就是为什么您仍然在线查看邮件的原因。从POP的角度来看,邮件从服务器上消失了,但谷歌仍将其保留在服务器上,并将其标记为POP死机,以免破坏IMAP功能)。如果要将邮件保留在服务器上并与服务器邮件状态保持同步,请使用IMAP

在传统的POP会话中,您必须明确地告诉服务器,您希望在读取服务器副本后删除它-客户端通常被配置为自动执行此操作,因为这是使用POP的常见方式。使用
TIdPOP3
时,您必须显式调用
IdPOP3.Delete()
,但GMail的POP实现除外

正常模式是如何工作的

POP客户端会话从您的邮件客户端(Thunderbird、Outlook、Sparrow等)开始,要求您的Gmail邮箱提供尚未下载的邮件列表。在Gmail向您的邮件客户端提供邮件列表后,您的客户端将开始下载这些邮件。在POP普通模式下,Gmail提供了大约250条尚未下载的最旧邮件的列表(垃圾邮件和垃圾被排除在外)一旦消息被下载,Gmail会将其标记为“弹出”

因此,在“正常”模式下,GMail只会通过POP发送一次消息。要访问仍在服务器上但已“弹出”的邮件,您可以选择GMail使用最新模式(参见上面的链接)

我在Gmail中的邮件被弹出后会发生什么情况?

使用最近模式时,“弹出”消息(在正常模式下下载)仍将显示给邮件客户端。这意味着,即使一个POP客户端(使用正常模式)将消息标记为弹出,另一个POP客户端(使用最近模式)仍将能够看到消息(除非您已将Gmail设置为在使用POP选项访问邮件时删除通过POP下载的邮件,在这种情况下,POP客户端以正常模式下载邮件后,邮件将被发送到垃圾箱)

与正常模式不同,您必须将POP客户端设置为在服务器上保留消息(而不是删除消息),因为当POP客户端发出DELE(删除)时命令在最近的模式下,它将被发送到Gmail中的垃圾箱,无论用户在使用POP设置访问邮件时的。如果其中一个POP客户端删除邮件,其他POP客户端将再也看不到这些邮件(除非从垃圾箱中移出)

Remy的回答提供了有关使用POP访问消息时的设置的更多详细信息


POP是上个世纪的一种古老恐龙。它是在服务器空间昂贵、互联网速度极慢、人们通常只有一台计算机的情况下设计的。使用POP就像将服务器用作邮箱一样。你可以检查邮件并将所有邮件下载到本地客户端,然后从服务器上删除它们(清空邮箱)。这节省了服务器上的空间,并加快了检查新邮件的速度,但这意味着所有邮件最终都存储在您用来检查邮件的任何计算机上,而这是它唯一存在的地方。时代已经改变了-POP通常应被视为已死亡。只是不要使用它。

在Gmail的设置中,有一个配置res通过POP访问电子邮件时的处理方式:

“使用POP访问消息时”设置有4个选项:

听起来你好像启用了“删除Gmail的副本”选项


这仅适用于Gmail。大多数电子邮件提供商不会像这样将它们的POP和IMAP实现分开。它们通常只访问一个收件箱并保持两个协议同步。

POP本身不会删除电子邮件,除非客户端使用
DELE
命令显式删除它们,并通过
QUIT
c结束会话ommand so删除被处理(如果POP会话异常结束,将忽略挂起的删除)。因为显示的代码没有调用
TIdPOP3.Delete()
,电子邮件应该留在服务器上。然而,Gmail的特殊之处在于它有一个选项,可以自动删除通过POP访问的电子邮件。请确保在Gmail设置中关闭该选项。@RemyLebeau我已经更新了该选项和一些额外信息。“除非您已将Gmail设置为在使用POP选项访问邮件时删除通过POP下载的邮件,否则在这种情况下,POP客户端以正常模式下载邮件后,邮件将被发送到垃圾箱“-这可能是所看到的行为的罪魁祸首。@RemyLebeau不,因为他们仍然可以使用webmail客户端查看收件箱中的邮件。他们使用
正常模式
,而不是
最近模式
,后者仍然会在收件箱中返回未打开的邮件。@RemyLebeau这就像GMail的默认行为一样。”(正常模式)将客户端设置为自动删除客户端