Я пытаюсь получить нет. из последних непрочитанных писем из учетной записи 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)
* Мое решение для случая, когда пользователь может войти в свою учетную запись gmail только через это приложение, если он войдет в свою учетную запись извне, база данных не будет обновлена, так что неправильный нет. почтовых рассылок будет показано. В моем проблемном случае пользователь даже не знает свой идентификатор и пароль gmail, предоставленные компанией, чтобы видеть только их письма. Поэтому он не может войти в свою учетную запись извне. Вот почему это решение работает.
Вот как я решил это 3 дня назад. Прошу прощения за поздний ответ