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

时间:2014-04-15 08:05:01

标签: php email imap bots mail-server

在我们的应用程序中,我们需要连接到用户电子邮件收件箱并获取所有邮件。 该应用程序将由Ubuntu OS在专用服务器中运行。 我通过使用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连接,并且提高了孔速度,但没有那么多。

2 个答案:

答案 0 :(得分:1)

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

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

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

  • 为什么需要多线程?它应该为这种情况带来什么好处?多线程仅对响应性可能成为问题的交互式内容感兴趣。即使这样,这也可能是错误的想法。

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

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

回答你的底线问题:

  • 没有人反对使用phps imap extension

  • 为此使用cron作业并在常规基础上进行,而不是每天一次

  • 在开始实施之前投资于规划干净的架构

答案 1 :(得分:0)

我可能有偏见,但我会使用Zend Framework和Zend_Mail_Storage类:http://framework.zend.com/manual/1.7/en/zend.mail.read.html您可以选​​择一些选项,例如切换到直接访问mbox或maildir文件(如果可能)或者更接近底层协议和在zend_mail_protocol_imap中破解某些东西以提高速度。