我想要不。来自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发送新邮件尝试了每次尝试
Attempt_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的输出为“false return”;
尝试_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封新邮件
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";
//输出最近: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);
输出 - 错误返回
那我在哪里错了? 如何获取最近未读的电子邮件?
答案 0 :(得分: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;
}
<强>用法:强>
$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”, “\已回答”和“\最近”。
另请参阅: Jyoti Ranjan's answer(如下)了解可能的解决方案。
答案 1 :(得分:4)
我已经使用数据库解决了它,这就是我的方法。
1.我在users表中创建了一个列,用于ex-'email_max_uid'INT(11)NOT NULL默认为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)
*我的解决方案是针对用户只能通过此应用程序登录其gmail帐户的情况,如果他从外部登录到他的帐户,则数据库将不会更新,以便错误编号。将显示邮件计数。在我的问题情况下,用户甚至不知道他公司提供的gmail id和密码只看他们的邮件。所以他无法从外面登录他的帐户。这就是这个解决方案有效的原因。
这是我3天前解决的问题。迟到的回复