【问题标题】:Delphi and Indy 10 unable to read gmail emails 2nd. time after reading onceDelphi 和 Indy 10 第二次无法阅读 gmail 电子邮件。读过一次后的时间
【发布时间】:2018-04-09 02:26:49
【问题描述】:

我尝试从 gmail 帐户获取电子邮件数量,它第一次工作正常,之后每次都正常,只要我不断开与服务器的连接(我在断开连接之前通过调试器停止执行命令)。 但是当我执行断开连接时,我再也无法找回邮件了,邮件数一直是0。但是我在线查看时邮件还在收件箱中,我可以在线打开邮件并阅读内容,有点无法找回不再与 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;

【问题讨论】:

    标签: email delphi gmail indy


    【解决方案1】:

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

    “当使用 POP 访问邮件时”设置有 4 个选项:

    听起来您启用了“删除 Gmail 的副本”选项。

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

    【讨论】:

    • 听起来 OP 在通过其他客户端访问 GMail 时仍然可以看到他们的邮件,但是(即:webmail 等 - 邮件仍在服务器上并标记为未读)但他们无法再次访问它们通过 POP。无论此设置如何,GMail 都可能将邮件标记为已被 POP 读取并且不再提供它,即使在没有 DELE 命令的情况下...我会尝试找到一个参考来支持这一点这只是假设。
    • @J...:当我阅读 OP 的问题时,这不是我所理解的。在使用TIdPOP3 访问电子邮件后,没有任何迹象表明其他 POP/IMAP 客户端可以看到这些电子邮件。该问题特别指出,当TIdPOP3 连接、断开连接、然后重新连接时,较早的电子邮件消失了。这意味着 Gmail 的“删除 Gmail 的副本”设置已生效。其他客户不参与。 “在线查询”是指 Gmail 网络邮件界面,不使用 POP3 或 IMAP,
    • 他们在问题...when I check online, and I can open the email online and read the content, bit cannot retrieve the email anymore with Indy. 中陈述了我的答案的更新。
    • 我做了更多的测试,邮件真的在服务器上,我可以通过浏览器打开gmail并在我的收件箱中看到它们,可以打开它们等等,但是没有客户端,甚至没有Outlook,可以阅读在我和 Indy 一起读过一次之后,它们就不再存在了。
    【解决方案2】:

    POP 从服务器中删除电子邮件 - 您只阅读一次(至少在大多数实现中 - GMail separates POP and IMAP functionality 这有点令人困惑,为什么您仍然可以在线看到邮件。从 POP 的角度来看,邮件从服务器中消失了但谷歌还是把它留在那里,标记为 POP 已死,以免破坏 IMAP 功能)。如果您想将邮件留在服务器上并与服务器邮件状态保持同步,请使用 IMAP。

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

    普通模式如何工作?

    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 通常应该被认为已经死了。只是不要使用它。

    【讨论】:

    • POP 本身不会删除电子邮件,除非客户端使用DELE 命令明确删除它们并通过QUIT 命令结束会话以便处理删除(如果 POP 会话异常结束,则挂起删除被忽略)。由于显示的代码没有调用TIdPOP3.Delete(),因此电子邮件应留在服务器上。但是,Gmail 的特殊之处在于它可以选择自动删除通过 POP 访问的电子邮件。确保在您的 Gmail 设置中关闭该选项。
    • @RemyLebeau 我已经更新了它和一些额外的信息。
    • "除非您在 When messages are accessed with POP 选项中将 Gmail 设置为删除通过 POP 下载的邮件,在这种情况下邮件将在 POP 客户端以正常模式下载后被发送到垃圾箱” - 这可能是造成这种行为的罪魁祸首。
    • @RemyLebeau 不,因为他们仍然可以使用网络邮件客户端查看收件箱中的邮件。他们使用normal mode 而不是recent mode,后者仍会在收件箱中返回未弹出的消息。
    • @RemyLebeau 就像GMail的默认行为(正常模式)一样,无论客户端是否实际发送DELE命令,客户端都被设置为自动DELE客户端。在任何一种情况下,实际消息的行为都完全由When messages are accessed with POP 设置决定,但对于普通模式的 POP 客户端,它总是好像发送了一个 DELE(它们不再被POP 客户端)。
    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    相关资源
    最近更新 更多