在PHP中使用IMAP()来获取最近未读的电子邮件数量

Jyo*_*jan 4 php ubuntu imap gmail-imap

我想要不.来自gmail帐户的最近未读邮件.为此,我在我的Ubuntu系统中安装了IMAP并尝试了一些PHP iMAP功能.这是我到现在为止所尝试的.

/* connect to gmail */
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'user@gmail.com';
$password = 'user_password';

/* try to connect */
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' .    imap_last_error());
Run Code Online (Sandbox Code Playgroud)

现在我说明我的所有尝试.注意 - 我已经通过向测试电子邮件ID发送新邮件尝试了每次尝试

Attempt_1:使用imap_search()

$recent_emails = imap_search($inbox,'RECENT');
if ($recent_emails)
   echo count($recent_emails);
else
   echo "false return";
imap_close($inbox);
Run Code Online (Sandbox Code Playgroud)

现在Attempt_1的输出是"错误返回";

尝试_2:使用imap_mailboxmsginfo()

$check = imap_mailboxmsginfo($inbox);
if ($check)
    echo "Recent: "   . $check->Recent  . "<br />\n" ;
else
    echo "imap_check() failed: " . imap_last_error() . "<br />\n";
imap_close($inbox);
Run Code Online (Sandbox Code Playgroud)

这里的输出是Recent:0,而我已经向这个id发送了2封新邮件

Attempt_3:使用imap_status()

$status = imap_status($inbox, $hostname, SA_ALL);
if ($status)
  echo "Recent:     " . $status->recent      . "<br />\n";
else
  echo "imap_status failed: " . imap_last_error() . "\n";
Run Code Online (Sandbox Code Playgroud)

//输出最近:0

Attempt_4:使用imap_search()再次使用参数NEW

$recent_emails = imap_search($inbox,'NEW');
if ($recent_emails)
   echo count($recent_emails);
else
   echo "false return";
imap_close($inbox);
Run Code Online (Sandbox Code Playgroud)

输出 - 错误返回

那我在哪里错了?如何获取最近未读的电子邮件?

Her*_*ert 5

这个功能似乎有效:

function CountUnreadMail($host, $login, $passwd) {
    $mbox = imap_open($host, $login, $passwd);
    $count = 0;
    if (!$mbox) {
        echo "Error";
    } else {
        $headers = imap_headers($mbox);
        foreach ($headers as $mail) {
            $flags = substr($mail, 0, 4);
            $isunr = (strpos($flags, "U") !== false);
            if ($isunr)
            $count++;
        }
    }

    imap_close($mbox);
    return $count;
}
Run Code Online (Sandbox Code Playgroud)

用法:

$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'user@gmail.com';
$password = 'user_password';

$count = CountUnreadMail($hostname, $username, $password);
Run Code Online (Sandbox Code Playgroud)

我无法为此功能申请全部功劳.这是sdolgy对PHP的回答的略微编辑版本显示未读邮件数量.他的版本承担了POP邮件.此版本需要完整版$hostname.我使用自己的Gmail帐户对其进行了测试,并正确报告了我收件箱中未读邮件的数量.

PHP显示未读邮件数量有一些非常好的阅读材料.看看这个.

希望这可以帮助.

UPDATE

发件人:Gmail是否支持所有IMAP功能?

Gmail IMAP1是一个相当完整的IMAP实现,但目前不支持以下功能:

\Recent flags on messages.
Run Code Online (Sandbox Code Playgroud)

Verfied:Gmail的Buggy IMAP实施

Gmail无法处理标准IMAP标记,例如"\ Deleted","\已回答"和"\ Recent".

另请参阅: Jyoti Ranjan的答案(如下)可能的解决方案.

  • 我接受你的帖子作为答案,因为它有很多信息,如果我没有得到gmail错误信息,也许我不能以我的方式思考解决方案.因此,当有人读到这个问题时,他会首先阅读urs并了解gmail bug,然后他可能会在我的环境中看到我的解决方案,或者可以考虑其他问题来解决他的问题,所以Info更具有影响力.比解决方案解决方案可以很多:) (2认同)