Использование IMAP () в PHP для подсчета последних непрочитанных писем
Я пытаюсь получить нет. последних непрочитанных писем из учетной записи gmail.Для этого я установил IMAP в своей системе Ubuntu и попробовал некоторые функции PHP iMAP. Вот что я пробовал до сих пор.
/* connect to gmail */
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = '[email protected]';
$password = 'user_password';
/* try to connect */
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error());
Теперь я излагаю все свои попытки. NB - Я пробовал каждую попытку, отправляя новые письма на тестовый идентификатор электронной почты
Попытка_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()
почтовый ящик 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);
Здесь вывод недавний: 0, в то время как я отправил 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: Повторное использование функции imap_search() с новым параметром
$recent_emails = imap_search($inbox,'NEW');
if ($recent_emails)
echo count($recent_emails);
else
echo "false return";
imap_close($inbox);
Вывод - ложный возврат
Так В Чем Же Я ОШИБАЮСЬ? Как я могу подсчитать количество последних непрочитанных писем?
2 answers
Похоже, эта функция работает:
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 = '[email protected]';
$password = 'user_password';
$count = CountUnreadMail($hostname, $username, $password);
Я не могу претендовать на полную заслугу за эту функцию. Это слегка отредактированная версия ответа sdolgy на PHP, отображающая количество непрочитанных писем. Его версия предполагала ПОП-почту. Для этой версии требуется полный $hostname
. Я протестировал его с помощью своей учетной записи gmail, и он правильно сообщил о количестве непрочитанных сообщений, которые были у меня в папке "Входящие".
PHP, отображающий количество непрочитанных писем, имеет некоторые довольно хороший материал для чтения. Проверить это.
Надеюсь, это поможет.
ОБНОВЛЕНИЕ
От: Поддерживает ли Gmail все функции IMAP?
Gmail IMAP1 является довольно полной реализацией IMAP, но следующие функции в настоящее время не поддерживаются:
\Recent flags on messages.
Проверено по адресу: Ошибочная реализация IMAP в Gmail
Gmail не обрабатывает стандартные флаги IMAP, такие как "\Удалено", "\Отвечено" и "\Недавний".
См. также: Ответ Джиоти Ранджана (ниже) для возможного решения.
Я решил эту проблему с помощью базы данных, вот как я это сделал.
1. Я сделал столбец в таблице пользователей, например, "email_max_uid" INT(11) НЕ РАВЕН НУЛЮ по умолчанию 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. Я поставил ссылку что заставляет пользователя входить в свою учетную запись gmail, не спрашивая свой идентификатор электронной почты и пароль
Когда пользователи входят в его учетную запись, email_max_uid is updated with count($emails)
- Теперь снова, когда пользователь посещает эту страницу, он следует описанному выше порядку, и на странице будет отображаться его номер последних писем.
*Мое решение для случая, когда пользователь может войти в свою учетную запись gmail только через это приложение, если он войдет в свою учетную запись извне, база данных не будет обновлена, так что неправильно будет показано количество почтовых отправлений.В моем проблемном случае пользователь даже не знает свой идентификатор gmail и пароль, предоставленные компанией, чтобы видеть только свою почту. Поэтому он не может войти в свою учетную запись извне. Вот почему это решение работает.
Вот как я решил эту проблему 3 дня назад.Извините за поздний ответ