Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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收件箱消息?_Php_Email_Imap_Bots_Mail Server - Fatal编程技术网

如何在专用服务器中获取所有php收件箱消息?

如何在专用服务器中获取所有php收件箱消息?,php,email,imap,bots,mail-server,Php,Email,Imap,Bots,Mail Server,在我们的应用程序中,我们需要连接到用户的电子邮件收件箱并获取所有消息。 该应用程序将在Ubuntu操作系统的专用服务器上运行。 我使用imap扩展(imap_open、imap_fetchheader、imap_fetchbody等)在我的电脑上运行了一些测试。 使用此方法时存在多个问题: 1-连接和获取速度非常慢 2-如果收件箱中存在许多邮件,php脚本将超时 3-应用程序是多用户的,请求数很高 我的搜索结果解决了上述问题: 1-我们必须从谷歌或其他电子邮件服务器租用静态IP进行imap连接

在我们的应用程序中,我们需要连接到用户的电子邮件收件箱并获取所有消息。 该应用程序将在Ubuntu操作系统的专用服务器上运行。 我使用imap扩展(imap_open、imap_fetchheader、imap_fetchbody等)在我的电脑上运行了一些测试。 使用此方法时存在多个问题:

1-连接和获取速度非常慢

2-如果收件箱中存在许多邮件,php脚本将超时

3-应用程序是多用户的,请求数很高

我的搜索结果解决了上述问题:

1-我们必须从谷歌或其他电子邮件服务器租用静态IP进行imap连接

2-我们必须使用PHP CLI从数据库获取订单并获取收件箱消息

3-php中的多线程

总结:

我想用php编写一个bot,每天连接邮件服务器。您建议使用什么连接和获取方式?(图书馆、方法、语言等)。谢谢

**更新:我运行以获取30条第一条消息的代码:

$mbox = imap_open('{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'myemailaddress', 'mypassword');

$count = imap_num_msg($mbox);

for($i = $count; $i >= $count - 30; $i--){
    $header = imap_fetchheader($mbox, $i);
    /* process header & body */
}

imap_close($mbox);
这段代码运行得很好,但当我将imap_fetchheader更改为imap_fetchbody时,需要花费更多的时间

更新
根据arkascha的回答,我对自己的设计和体系结构进行了研究,发现低速的原因在于与邮件服务器的连接。因为这是一个有I/O限制的任务,我缓存了到每个邮件服务器的imap连接,速度提高了,但没有那么多。

我可能有偏见,但我会将Zend Framework与Zend_mail_存储类一起使用:如果可能的话,您可以切换到直接访问mbox或maildir文件,或者更接近底层协议,并在zend_mail_protocol_imap以提高速度。

抱歉,您的搜索结果完全错误

  • 从imap服务器获取消息不需要静态IP地址。当然不是“从谷歌租来的”。为什么需要这样做

  • 我看不出为什么php的cli变体更适合这里。相反,它的效率较低,因为它有更大的启动负载,因为必须为每个请求生成一个进程

  • 为什么需要多线程?对于这种情况,它应该提供什么好处?多线程只是交互式的东西感兴趣,因为响应性可能是一个问题。即使这样,这也可能是错误的想法

我自己实现了一个imap客户端几次,没有遇到这样的问题。当然,您可以基于phps imap扩展实现一个健壮而高效的解决方案。连接和传输的速度取决于许多细节,我怀疑php imap实现是问题的原因。可能会有其他问题导致您的陈述,但您没有在问题中具体说明

一般来说,您永远不应该一次性获取大量数据,然后再对其进行处理。这是一个非常糟糕的设计,不能以任何方式扩展。相反,您应该始终按顺序策略处理列表:获取单个数据单元并对其进行处理。然后继续下一个。这样,您的内存占用就可以保持很小,从而防止达到php限制。这还使您能够以较小的块(甚至一次一条消息)处理整个列表,从而防止您达到phps执行时间限制或客户端超时。这些是一般成功的实现模式,它们是健壮的处理实现(也适用于电子邮件)的基础

要回答您的底线问题:

  • 没有任何东西反对使用phps imap扩展

  • 为此使用cron作业,并定期执行,而不是一天一次

  • 在开始实施之前,投资规划一个干净的体系结构


我不会一次提取整个电子邮件,因为收件箱消息的数量和大小因用户而异。整个任务的速度非常重要。要在每次脚本运行时获取一封电子邮件,我们需要使用cron作业。PHP CLI脚本将管理抓取过程抱歉,无法跟踪您。现在,您是否计划一次获取单个用户的所有消息?不要!当然,如果您想处理更大的消息列表,您应该使用cron作业。这并不意味着您必须逐个获取消息,您还可以在每次脚本运行中处理可能包含100条消息的包。但很明显,你不能用同步和交互的方法实现大规模处理,这是行不通的,你会一次又一次地遇到问题。关于cli:它的优点是什么?PHP cli会保持运行,不会因为超时而关闭,而且它不是由appache运行的,可以并行工作。通过使用PHP CLI,web服务器将可以自由响应用户请求对不起,我不同意。1:web服务器仍然处理请求,不管您是使用php作为模块、fastcgi还是老式cgi。2:这里“平行”是什么意思?ApacheWeb服务器由许多并行运行的进程组成,那么区别在哪里呢?相反:您增加了通信开销,这会减慢速度。3:关于超时:您正在尝试修复症状,而不是查找和修复问题的原因。这很少是一个好策略。上面已经说过:使用cron作业定期触发处理,在一次脚本运行中只处理固定数量的消息,按顺序(逐个)获取、处理和释放消息,而不是将所有消息加载到内存中。不管您在web服务器中选择了哪种php执行策略,脚本都或多或少是相同的。