GMail和POP3 RETR问题 - 切换到IMAP?

时间:2010-01-30 21:44:32

标签: language-agnostic email gmail imap pop3

当我使用POP3协议访问GMail收件箱时,似乎在使用RETR命令获取给定电子邮件后,在QUIT-ting和重新连接之后,在调用LIST时,以前的RETR-ieved电子邮件不再列出。

然后,在转到:GMail设置//转发和POP / IMAP并设置“为所有邮件启用POP(即使已经下载的邮件)”时,下次登录时所有电子邮件都会被再次列出,但如果我RETR其中任何一个,重新记录后它再次从LIST中消失..

然后我可以再次转到GMail设置并重复整个过程,但它对我来说是个显示器,因为我正在编写一个无需任何手动操作即可运行的脚本。

我错过了什么,或者只有IMAP可以帮到这里吗?

(编辑:RFC http://www.ietf.org/rfc/rfc1939.txt没有说RETR命令删除消息)

3 个答案:

答案 0 :(得分:4)

这是Gmail的预期行为。根据{{​​3}},“[a] ll消息可能会被下载到另一台计算机上;在下载邮件后,它将不会再次下载。”

还有一个this question,其中提取了过去30天的邮件,无论是否已经将其发送到另一个POP客户端。

也就是说,不要试图在短时间内通过不同的计算机获取所有邮件,如'recent mode'

我强烈建议使用IMAP。

答案 1 :(得分:0)

Gmail的POP3配置有时可能令人困惑。您可以找到Gmail POP3 behavior here

切换到IMAP是一个非常好的解决方案。

答案 2 :(得分:0)

这是一个常见问题,不幸的是,它并不总是最简单的解决方案。希望这些信息将帮助您和其他人找到适合您需求的最佳实施方案。免责声明:如果您可以选择或具有将IMAP添加到pop3的功能,那肯定会使事情变得更易于管理。

Gmail具有自己的Pop3实现,也就是说,并非所有这些都与其他pop3提供程序有关 这是问题的生命周期以及一些可以帮助您解决问题的信息:

您可以在NORMAL模式或RECENT模式下连接到pop3服务器。这会将弹出服务器上的“会话”置于“事务状态”。 通过在连接时为用户名添加前缀“ recent:” +用户名来使用最新模式。最近模式将返回服务器上最近30天的电子邮件。注意*这将取代我将在下面介绍的UIDL命令。即如果尚未删除,最近模式将返回所有30天的电子邮件。由于它总是返回最近30天,因此,如果您有多个客户端,则它们在最新模式下都将收到相同的信息。

正常模式是默认模式。普通模式将遵守您选择使用的命令的限制。 UIDL将返回服务器上大约250封最旧的电子邮件。如果服务器上有500封电子邮件,并且您没有删除任何电子邮件,则UIDL会返回前250封电子邮件的ID和唯一标识符,无论如何,因此您可能不知道新的250封电子邮件。以下警告,GMAIL在Web控制台上有一个选项,您可以在其中配置弹出窗口,将其设置为“从现在开始启用弹出窗口”。通过选择并保存,该时刻的时间戳将由弹出服务器用来“刷新”最旧的时间。因此,UIDL从那时起将开始向您返回消息,直到您再次达到250标记(假设您尚未删除它们)。

请务必注意,在您发出QUIT命令之前,事务状态一直存在。发出该命令后,服务器进入“更新”状态,它将开始发布您请求的更新,例如DELETE命令,或者在下载完成后将其弹出。在成功发出QUIT之前,不会删除任何内容,并且服务器状态不会更改。

STAT命令将向您显示服务器上pop3堆栈中的电子邮件数量。

RETR命令将检索或下载电子邮件,但直到成功结束会话后,它才标记为已下载

如果维护服务器的状态并弹出电子邮件,许多开发人员用来检索消息号和唯一标识符的

UIDL非常有用。 UIDL只会返回最旧的250 ish(我见过251-255)电子邮件。如果您一直在轮询新电子邮件,那么如果未删除电子邮件,这将很危险。也!如果您需要删除电子邮件,请确保在Web控制台中配置了“将邮件保留在我的收件箱中”的GMAIL设置,以便您可以备份这些电子邮件。

LIST命令将在正常模式下解决您的问题,以获取250封以上的电子邮件,(请注意:您仍然需要在本地维护一个id文件来交叉检查传入的邮件,以了解它是新邮件还是旧邮件)。 ..但是:此命令还会从SENT框中返回邮件,对于许多人来说,这不是可行的解决方案。

提示:

如果您正在快速有效地管理收件箱,并且不认为250是您的流程中的限制因素,则UIDL和RETR将起作用。

如果您无法将收件箱保持在250个以下,但还需要访问新电子邮件,并且您不希望收件箱增长到令人发指的大小,并且性能也没有关系,则应该使用“最近”模式。