PHP获取超过20000 IMAP电子邮件(PHP fetch over 20000 imap em

2019-08-17 06:47发布

我想几个邮箱导出到一个数据库中。 我现在的脚本将连接IMAP和公正的循环中的所有消息。 虽然与更大的邮箱,这是行不通的,它会放慢甚至停止。

我们的想法是每天运行脚本谁在数据库中还没有到数据库中“复制”的所有邮件。 最新最好的方式来获取电子邮件的数量大(20K邮件散布在大约40 - 50个文件夹)。

最终,这将需要从一台服务器的工作扫描数百甚至数千账户每天(想象一下这样的数据量)。 它将邮件(uid和主题)存储到数据库中,并创建将被存储在数据服务器(所以它也需要获取附件)包。

Answer 1:

所以,你要通过IMAP进行邮件备份。 有专业的软件工具,可以做到这一点。

让我们从一些简单的开始:下载邮件从收件箱文件夹中一个特定的用户。 这需要你(一)与用户的凭据登录,(b)选择收件箱文件夹,以及(c)下载邮件(让我们假设你已经知道它的UID,这是55)。 您在IMAP这样做如下(仅适用于请求 - 响应未显示):

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

在一个特定的文件夹中的每个消息被给予一个UID 。 这是永远不会改变该消息的唯一标识符-它不能由该文件夹中的任何其它消息一起使用。 新消息必须比以前的更高的UID。 这使得一个有用的工具,以确定是否你已经下载了该消息之前。

下一步:现在让我们看看在收件箱文件夹下载所有新邮件。 让我们假设你正在下载消息的第一时间,INBOX目前有消息来的UID 54,55和57可以使用命令一次性下载这些信息,例如:

03 UID FETCH 54,55,57 BODY[]

(如果有很多下载您可能需要分批打破这个工作(例如30在时间)。)这样做之后,你存储你下载迄今为止最高的UID。 接下来的时间,你可以检查的UID比如下更高:

04 UID FETCH 58:* UID

这将检索UID(唯一)的消息从58日起一个UID。 如果你得到的结果,那么你下载的,并再次保存的UID。 等等。

这里有一个陷阱。 消息的UID是有效的,只要该文件夹的属性UIDVALIDITY(包含在响应于该SELECT命令)不改变。 如果这个改变是什么原因,该文件夹是无效的,你需要从头再来下载该文件夹中的所有邮件。

最后,要扩展该功能对所有用户的所有文件夹的工作。 为了让所有的文件夹为特定的用户,您可以使用IMAP LIST命令:

05 LIST "" "*"

你需要知道事先用户和循环在他们的凭据。

这背后是你需要做什么IMAP理论。 在PHP中实现它留作练习。



Answer 2:

您是否使用imap_ping

imap_ping()执行ping流,看它是否仍然有效。 它可能会发现新邮件; 这是一个周期性的“新邮件检查”以及“保持活动”对于具有非活动超时服务器的首选方法。

其他的看: imap_timeout imap_reopen

事实上,有被称为方法reopen提出的东西,不是吗:)

我想到的,如果你只是似乎无法保持连接另一种选择是将数据导出到mbox格式,并得到它在本地。 可能是一个巨大的邮箱速度更快,并且清除超时/连接问题。



文章来源: PHP fetch over 20000 imap emails