【问题标题】:Problems with PHP System_Daemon and IMAP connectionPHP System_Daemon 和 IMAP 连接的问题
【发布时间】:2010-06-03 00:17:27
【问题描述】:

我正在尝试创建一个 PHP 守护程序,该守护程序连接到 IMAP 服务器并在电子邮件进入时对其进行处理。我已经接近工作了,但该守护程序不断抓取它在该守护程序第一次出现时找到的原始电子邮件加载。我相信原因是因为我在父进程中打开了 IMAP 连接。示例如下:

if ($imapConnection=imap_open($authhost,$user,$pass) or die())
{
  //start daemon
  while()
  {
    //Grab email headers 
    $imapHeaders = imap_headers($imapConnection);
    $count = sizeof($imapHeaders)

    //loop the emails
    for($i = 1; $i <= $count, $i++)
    {
      //process the email
      //delete the email
    }

    System_Daemon::iterate(15);
  }
}   
imap_close($imapConnection);

我不想将 IMAP 连接置于循环中。如何在循环之外保持与 IMAP 服务器的连接并仍然收到新电子邮件?

【问题讨论】:

    标签: php imap daemon


    【解决方案1】:

    在 IMAP 中,邮件保留在服务器上。因此,每次来,如果您没有明确删除它们,旧电子邮件仍然存在。为了防止处理这些电子邮件,你可以有一个 var 来保存你之前处理过的邮件数量,所以你可以从 $i = 0(假设最后到达)到 $i

    编辑:

    由于您通过 imap_delete 删除邮件,因此在每个循环中执行 imap_expunge。

    编辑 2:

    使用 imap_reopen,我尝试在每次循环后使用 imap_reopen($imapConnection, "{domain.tld}INBOX"); 在我的服务器上编写脚本,现在它会看到新邮件。不进行新的身份验证,只需移动您的流。

    【讨论】:

    • 我实际上是在处理完邮件后删除了循环中的邮件。如果我要删除电子邮件,我还需要按照您的建议进行操作吗?
    • 此外,一旦启动了守护进程,它似乎就不会找到之后收到的新电子邮件。这就是为什么我认为它与在循环之外建立连接有关。它甚至不知道我删除了电子邮件并继续循环访问相同的电子邮件。
    • 好的。也许你有缓存问题,你可以试试imap_open 选项 OP_SHORTCACHE ?
    • 另一个问题。你只做 imap_delete 吗?还是你做和 imap_expunge 之后?
    • 我不确定短缓存是什么。我得稍微研究一下。我做了一个 imap_delete($imapConnection, $msgNum) ,它似乎工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2015-11-20
    • 2012-08-30
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    相关资源
    最近更新 更多