Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP获取超过20000封imap电子邮件_Php_Email_Cron_Imap - Fatal编程技术网

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

PHP获取超过20000封imap电子邮件,php,email,cron,imap,Php,Email,Cron,Imap,我正在尝试将几个邮箱导出到数据库。我当前的脚本将连接IMAP并循环所有消息。虽然对于较大的邮箱,这将无法工作,并且会减慢甚至停止 其思想是每天运行脚本,将数据库中尚未包含的所有消息“复制”到数据库中。获取大量电子邮件的最佳方式是什么(20k封邮件分布在大约40-50个文件夹中) 最终,这将需要从单个服务器每天扫描数百甚至数千个帐户(想象一下数据量)。它将邮件(uid和主题)存储到数据库中,并创建一个包,该包将存储在数据服务器上(因此它还需要获取附件)。您正在使用吗 imap_ping()ping

我正在尝试将几个邮箱导出到数据库。我当前的脚本将连接IMAP并循环所有消息。虽然对于较大的邮箱,这将无法工作,并且会减慢甚至停止

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

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

您正在使用吗

imap_ping()ping流以查看它是否仍然处于活动状态。可能 发现新邮件;这是周期性“新”测试的首选方法 “邮件检查”以及服务器的“保持活动状态” 不活动超时

其他要查看的内容:

事实上,有一个名为重新打开的方法提示了一些事情,不是吗:)


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

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

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

特定文件夹中的每封邮件都有一个文件夹。这是永不更改的邮件的唯一标识符-该文件夹中的任何其他邮件都不能使用它。新邮件的UID必须高于以前的邮件。这使它成为一个有用的工具,可以确定您以前是否已经下载了邮件

下一步:让我们看看如何下载收件箱文件夹中的所有新邮件。假设您是第一次下载邮件,并且收件箱中当前有UID 54、55和57的邮件。您可以使用以下命令一次下载所有这些消息:

03 UID FETCH 54,55,57 BODY[]
(如果要下载的内容很多,您可能希望将其分批进行(例如,一次30个)。完成此操作后,您将存储迄今为止下载的最高UID。下一次,您可以检查高于该值的UID,如下所示:

04 UID FETCH 58:* UID
这将检索UID(仅适用于从58起具有UID的邮件)。如果得到结果,则下载这些结果,然后再次存储UID。等等

有一个陷阱。只要文件夹的UID有效性属性(包括在对SELECT命令的响应中)不变,邮件的UID就有效。如果由于任何原因发生更改,文件夹将无效,您需要重新下载该文件夹中的所有邮件

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

05 LIST "" "*"
您需要事先知道用户的凭据,并对其进行循环


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

它必须能够连接多个不同的服务器,因此本地不是一个选项。我们的想法是一次收到所有“新”电子邮件。但是我如何才能确保不再次循环(并检查它们是否存在于数据库中)它们呢?啊,这很简单,IMAP有一个“可见”标志,对吗?还有,应该有一个序列<代码>msgno?或者,将电子邮件转发到一个存档中,您可以在处理后进行处理和删除。您描述了IMAP的一个常见用例。邮箱将被“归档”到数据库中,因此“看不见/看到”标志将不起作用。的第二个参数。。。消息序列描述。您可以使用X、Y语法枚举所需的消息,或者使用X:Y语法检索间隔内的所有消息。如果你不能用开箱即用的函数实现你所描述的功能,我会感到惊讶。我可以用cronjob这样的工具批量下载它们,它每分钟运行一次,并检查是否有批要处理。尽管我的应用程序每天至少需要检查1k-5k IMAP框并检索所有新邮件一次。假设IMAP框中平均有大约10k条消息分布在50个文件夹中,那么导入将花费很长时间?有没有什么方法可以让我用PHP加快速度?cronjob(启动所有@不同的盒子)会将进程加快25倍吗?如果你想下载大量数据,你必须克服这一限制。毫无疑问,您将受到处理能力和可用带宽的限制。。。因此,您可以尝试一些优化(如您所提到的,并行运行任务),但在某些情况下,您仍然会达到极限,无法进一步加快速度。我建议更经常地(而不是一天一次)运行小作业,这样下载量相对较小,而且是递增的。此外,我认为,通过10k消息,您指的是所有消息的首次下载。是的,那要花很长时间。不过,你仍然会受到资源的限制。可能有多台计算机并行存档不同的帐户。不,根据RFC3501,所有电子邮件都必须有UID。哈希不是最好的方法。。。尤其是当你没有考虑到身体的时候。两条不同的消息可能(尽管统计上不太可能)解析为同一个散列,这称为冲突。如果用户从一个文件夹中删除所有消息,则UID仍然会比以前的要大(请参阅UIDNEXT i)
05 LIST "" "*"