【问题标题】:Using IMAP () in PHP to get recent unread emails count在 PHP 中使用 IMAP() 获取最近的未读电子邮件计数
【发布时间】:2011-11-13 20:28:21
【问题描述】:

我试图拒绝。来自 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());

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

尝试_1:使用 imap_search()

$recent_emails = imap_search($inbox,'RECENT');
if ($recent_emails)
   echo count($recent_emails);
else
   echo "false return";
imap_close($inbox);

现在 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);

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

尝试_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";

//输出最近的:0

尝试_4:再次使用带有参数 NEW 的使用 imap_search()

$recent_emails = imap_search($inbox,'NEW');
if ($recent_emails)
   echo count($recent_emails);
else
   echo "false return";
imap_close($inbox);

输出 - 错误返回

那么我哪里错了? 如何获取最近的未读邮件数?

【问题讨论】:

  • 抱歉,您花了这么长时间才得到答复。他们通常来得更快。这是一个经过深思熟虑且格式正确的问题。 +1
  • 是的,自从我发帖以来,我一直在急切地等待答案,感谢您对此的评论,我非常需要解决方案。

标签: php ubuntu imap gmail-imap


【解决方案1】:

这个功能似乎有效:

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;
}

用法:

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

$count = CountUnreadMail($hostname, $username, $password);

我不能为此功能申请全部功劳。这是 sdolgy 对PHP Displaying unread mail count 的回答的略微编辑版本。他的版本假定 POP 邮件。此版本需要完整的$hostname。我用自己的 gmail 帐户对其进行了测试,它正确地报告了我收件箱中的未读邮件数量。

PHP Displaying unread mail count 有一些不错的阅读材料。看看吧。

希望这会有所帮助。

更新

发件人:Does Gmail support all IMAP features?

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

\Recent flags on messages.

验证于:Gmail's Buggy IMAP Implementation

Gmail 不处理标准 IMAP 标志,例如“\Deleted”, “\Answered”和“\Recent”。

另请参阅:Jyoti Ranjan's answer(下)了解可能的解决方案。

【讨论】:

  • 感谢 Herbert 的回复,我要求拒绝。最近未读邮件的数量,表示没有。上次登录后的新邮件。我认为您的代码将给出否决。未读邮件,但我一定会尝试此代码并让您知道。
  • 很抱歉造成误解。我刚刚让一个朋友给我发了一封电子邮件,并在$headers 变量上使用了var_dump 来查看发生了什么。不幸的是,发送的唯一标志是 U(未读)。没有什么可以表明它是否是最近的。我也像你一样使用了imap_status,并且设置了 UNSEEN,但不是 RECENT。
  • 显然,使用 gmail 是不可能的。在答案中查看我的更新。
  • 感谢 Herbert 的信息,至少我现在不是在黑暗中,会尝试一些其他方法来完成我的工作
  • 我接受了你的帖子作为答案,因为它有很多信息,如果我没有得到 gmail 错误信息,我可能无法以我的方式思考解决方案。因此,当有人阅读这个问题时,他会先阅读 urs 并了解 gmail 错误,然后他可能会在我的环境中看到我的解决方案,或者可以想其他办法来解决他的问题,所以 Info 更小。比解决方案,因为解决方案可以很多:)
【解决方案2】:

我已经用数据库解决了,我就是这样解决的。

1.我在用户表中创建了一个列,例如'email_max_uid' INT(11) NOT NULL default 0

2.当用户首先加载此页面时,我使用我的 sql 查询检索了该特定用户的“email_max_uid”的值 3.自动连接到他的gmail帐户并获得未读邮件和邮件总数

$inbox = imap_open('{imap.gmail.com:993/imap/ssl}INBOX','user's email id','user's password') or die('Cannot connect to Gmail: ' . imap_last_error());
        $unread_emails = imap_search($inbox,'UNSEEN');
        $emails = imap_search($inbox,'ALL', SE_UID);

4.那么

if ('email_max_uid') = 0
        $recent_mails_count = count($unread_emails);
    else
        $recent_mails_count = max($emails) - Array['email_max_uid'];

5.显示最近的邮件数

echo count($recent_mails_count);

6.我放了一个链接,使用户无需询问他的电子邮件 ID 和密码即可登录到他的 gmail 帐户 当用户登录他的帐户时,email_max_uid is updated with count($emails)

  1. 现在,当用户再次访问该页面时,它遵循上述程序和他的号码。最近的电子邮件将显示在页面上。

*我的解决方案是针对用户只能通过此应用程序登录他的gmail帐户的情况,如果他从外部登录他的帐户,则不会更新数据库,因此不会出现错误。将显示邮件计数。在我的问题案例中,用户甚至不知道公司提供的他的 gmail id 和密码,只能查看他们的邮件。所以他不能从外面登录到他的这个帐户。这就是此解决方案有效的原因。

这是我三天前解决的方法。抱歉回复晚了

【讨论】:

  • +1 很高兴你解决了这个问题。这样的东西可能会派上用场(考虑到 GMail 的缺点)。
  • 嗯,我只是使用了PHP的基本概念,并根据我的要求解决了。希望 gmail 能删除它的 bug,以便使用更多的 IMAP()。
猜你喜欢
  • 2015-04-25
  • 2021-01-09
  • 2018-06-13
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多