Использование IMAP () в PHP для получения последних непрочитанных сообщений электронной почты

Я пытаюсь получить нет. из последних непрочитанных писем из учетной записи gmail. Для этого я установил IMAP в своей системе Ubuntu и попробовал некоторые функции 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()); 

Теперь я заявляю все свои попытки. NB. Я пробовал каждую попытку, отправляя новые письма на идентификатор тестового письма

Attempt_1: Использование imap_search ()

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

Теперь Output of Attempt_1 является «ложным возвратом»;

Attempt_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); 

Здесь вывод: Недавнее: 0, в то время как я отправил 2 новых письма этому id

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

Выход – ложное возвращение

Итак, где я НЕПРАВИЛЬНО? Как я могу подсчитать количество последних непрочитанных сообщений?

Кажется, что эта функция работает:

 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 Отображение непрочитанного количества писем . Его версия предполагала почту POP. Эта версия требует полного $hostname . Я протестировал его с помощью собственной учетной записи gmail и правильно сообщил количество непрочитанных сообщений, которые у меня были в моем почтовом ящике.

PHP Отображение непрочитанных почтовых рассылок имеет довольно хороший материал для чтения. Проверьте это.

Надеюсь это поможет.

ОБНОВИТЬ

От: поддерживает ли Gmail все функции IMAP?

Gmail IMAP1 – довольно полная реализация IMAP, но в настоящее время не поддерживаются следующие функции:

 \Recent flags on messages. 

Подтверждено: Реализация IMAP Gmail в Buggy

Gmail не обрабатывает стандартные флаги IMAP, такие как «\ Deleted», «\ Answered» и «\ Recent».

См. Также: ответ Jyoti Ranjan (ниже) для возможного решения.

Я решил это с помощью базы данных. Вот как я это сделал.

1.I сделал столбец в таблице пользователей, для ex-mail_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. Я установил ссылку, которая заставляет пользователя войти в свою учетную запись gmail, не спрашивая его идентификатор и пароль электронной почты. Когда пользователи входят в свою учетную запись, email_max_uid is updated with count($emails)

  1. Теперь, когда пользователи посещают эту страницу, это следует за вышеуказанным режимом, а его нет. последних писем будет отображаться на странице.

* Мое решение для случая, когда пользователь может войти в свою учетную запись gmail только через это приложение, если он войдет в свою учетную запись извне, база данных не будет обновлена, так что неправильный нет. почтовых рассылок будет показано. В моем проблемном случае пользователь даже не знает свой идентификатор и пароль gmail, предоставленные компанией, чтобы видеть только их письма. Поэтому он не может войти в свою учетную запись извне. Вот почему это решение работает.

Вот как я решил это 3 дня назад. Прошу прощения за поздний ответ