Использование 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);

Вывод - ложный возврат

Так В Чем Же Я ОШИБАЮСЬ? Как я могу подсчитать количество последних непрочитанных писем?

Author: Jyoti Ranjan, 2011-09-09

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, такие как "\Удалено", "\Отвечено" и "\Недавний".

См. также: Ответ Джиоти Ранджана (ниже) для возможного решения.

 5
Author: Herbert, 2017-05-23 12:18:12

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

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)

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

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

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

 4
Author: Jyoti Ranjan, 2011-09-16 09:33:32