PHP获取超过20000条imap电子邮件

时间:2013-03-01 20:26:27

标签: php email cron imap

我正在尝试将多个邮箱导出到数据库。我当前的脚本将连接IMAP并只循环所有消息。虽然邮箱较大但不起作用,但速度会减慢甚至停止。

我们的想法是每天运行脚本,将所有不在数据库中的消息“复制”到数据库中。什么是获取大量电子邮件的最佳方式(20k邮件分布在大约40-50个文件夹中)。

最终,这需要在单个服务器上运行,每天扫描数百甚至数千个帐户(因此想象一下数据量)。它会将邮件(uid和subject)存储到数据库中,并创建一个将存储在dataserver上的包(因此它还需要获取附件)。

2 个答案:

答案 0 :(得分:5)

因此,您希望通过IMAP执行电子邮件备份。有专业的软件工具可以做到这一点。

让我们从简单的事情开始:从收件箱文件夹下载一个特定用户的电子邮件。这要求您(a)使用用户的凭据登录,(b)选择INBOX文件夹,(c)下载消息(假设您已经知道其UID,即55)。您可以在IMAP中执行此操作,如下所示(仅请求 - 响应未显示):

01 LOGIN username password
02 SELECT INBOX
03 UID FETCH 55 BODY[]

特定文件夹中的每条消息都被赋予UID。这是永不更改的邮件的唯一标识符 - 该文件夹中的任何其他邮件都不能使用它。新消息必须具有比以前更高的UID。这使它成为确定您之前是否已下载邮件的有用工具。

下一步:现在让我们看看下载INBOX文件夹中的所有新邮件。假设您是第一次下载消息,而INBOX当前有UID为54,55和57的消息。您可以使用以下命令一次性下载这些消息:

03 UID FETCH 54,55,57 BODY[]

(如果有很多要下载的话,你可能想要批量分解(例如每次30个)。)这样做之后,你存储到目前为止你下载的最高UID。下次,您可以按如下方式检查UID高于该值:

04 UID FETCH 58:* UID

对于UID从58开始的消息,它将检索UID(仅限)。如果您获得结果,则下载这些结果,然后再次存储UID。等等。

有一个问题。只要文件夹的UIDVALIDITY属性(包含在对SELECT命令的响应中)不会更改,消息的UID就是有效的。如果由于某种原因发生变化,该文件夹将失效,您需要重新下载该文件夹中的所有邮件。

最后,您希望将其扩展为适用于所有用户的所有文件夹。要获取特定用户的所有文件夹,请使用IMAP LIST命令:

05 LIST "" "*"

您需要事先了解用户的凭据并循环播放。

这是你需要做的IMAP理论。在PHP中实现它只是一个练习。

答案 1 :(得分:2)

您使用的是imap_ping吗?

  

imap_ping()ping流以查看它是否仍处于活动状态。有可能   发现新邮件;这是定期" new的首选方法   邮件检查"以及"保持活力"对于有的服务器   不活动超时。

要查看的其他内容:imap_timeout imap_reopen

事实上,有一种名为reopen的方法表明某些事情并非如此:)

如果您似乎无法保持连接,则会想到另一个选项是将数据导出为mbox格式并在本地获取。对于庞大的邮箱而言可能会更快,并且可以消除超时/连接问题。