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


How to fetch all inbox messages in php in a dedicated server?

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

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

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

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

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

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

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

3-php中的多线程。

摘要:

我想用php编写一个机器人程序,每天连接到邮件服务器。你建议用什么连接和获取方式?(库、方法、语言等)感谢

**更新:我运行的代码获取了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_fetcheader更改为imap_fetch body时,需要花费更多的时间。

更新:根据arkascha的回答,我进行了设计和架构,发现低速的原因是与邮件服务器的连接。因为这是一个有I/O限制的任务,所以我缓存了到每个邮件服务器的imap连接,孔的速度提高了,但没有那么快。

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

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

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

  • 为什么需要多线程?对于这种情况,它应该提供什么好处?多线程只对可能存在响应问题的交互式内容感兴趣。即便如此,这也可能是错误的想法。

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

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

回答您的底线问题:

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

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

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

我可能有偏见,但我会将Zend Framework与Zend_Mail_Storage类一起使用:http://framework.zend.com/manual/1.7/en/zend.mail.read.html如果可能的话,你可以选择切换到直接访问mbox或maildir文件,或者更接近底层协议,在zend_mail_procol_imap中破解一些东西来提高速度。