Использование IMAP () в PHP для подсчета количества последних непрочитанных писем - PullRequest
4 голосов
/ 09 сентября 2011

Я пытаюсь получить нет.недавних непрочитанных писем из учетной записи 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);

Теперь вывод Attempt_1 - «ложное возвращение»;

Попытка_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 новых письма на этот идентификатор

Попытка_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 () с параметром NEW

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

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

Итак, гдеЯ ошибся?Как я могу узнать количество последних непрочитанных писем?

Ответы [ 2 ]

5 голосов
/ 11 сентября 2011

Эта функция работает:

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.

Проверено по адресу: Ошибка реализации Gmail в IMAP

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

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

4 голосов
/ 16 сентября 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...