Подтвердить что ты не робот

Использование PHP, поиск в архивных почтовых сообщениях Gmail

(Первое программирование на PHP. Помогла ли вам немного больше.)

Цель:

Извлеките lastContactDate из заданного адреса электронной почты из моей учетной записи gmail. Надеясь ответить на вопрос: "Когда в последний раз я связался с [Лицом]"

Что я сделал до сих пор:

  • Подключен к gmail с помощью imap (только для входящих)
  • Схватил дату и время
  • Отпечатано имя пользователя и временная метка.

Что я не могу сделать:

  • Отправлять электронные письма для lastContactDate, которые были заархивированы (я парень inbox = 0)

Примечания:

  • Код грубый, но функциональный. Php действительно должен быть разделен на разные страницы, но это первая попытка. Заранее благодарю за любую помощь!
  • Любящее программирование, кстати. Я немного танцевал @edw519 больше, чем раз в последние два дня.

Исследования:

Используемый код:

    /* connect to gmail */
$gmailhostname = '{imap.gmail.com:993/imap/ssl}';
$gmailusername = "[email protected]";
$gmailpassword = "___";

    /* try to connect */
$conn = imap_open($gmailhostname,$gmailusername,$gmailpassword) or die('Cannot connect to Gmail: ' . imap_last_error());

$query = mysql_query("SELECT * FROM users");    
    while($row = mysql_fetch_array($query))
    {
        $findemail = $row["email"];

        /* grab emails */
        $emails = imap_search($conn,'FROM "'.$findemail.'"');

        /* if emails are returned, cycle through each... */
        if ($emails) { 
            /* begin output var */
            $output = '';             
            /* put the newest emails on top */
            rsort($emails);

            /* for 5 emails... */
            $emails = array_slice($emails,0,1);

            foreach ($emails as $email_number) {    
                /* get information specific to this email */
                $overview = imap_fetch_overview($conn,$email_number,0);
                $message = imap_fetchbody($conn,$email_number,2);

                /* output the email header information */
                /*
            $output.= '<div class="toggler '.($overview[0]->seen ? 'read' : 'unread').'">';
                $output.= '<span class="subject">'.$overview[0]->subject.'</span> ';
                $output.= '<span class="from">'.$overview[0]->from.'</span>';
            */
                $output.= '<span class="from">'.$overview[0]->from.'</span> ';
                $output.= '<span class="date">on '.$overview[0]->date.'</span> <br /><br />';
                mysql_query("UPDATE users SET lastContactDate = '".$overview[0]->date."' WHERE email = '".$findemail."'") or die(mysql_error());

                /* output the email body */
                /* $output.= '<div class="body">'.$message.'</div>'; */
            }
            echo $output;
        }
    } 
/* close the connection */
imap_close($conn);
?>
4b9b3361

Ответ 1

Проблема решена!

Здесь решение. Используя исходный код выше, мы только изменили местоположение, в котором находится наша программа. Вместо INBOX это:

    /* connect to gmail */
$gmailhostname = '{imap.gmail.com:993/imap/ssl}[Gmail]/All Mail';

В частности

[Gmail]/All Mail

Найден синтаксис здесь: http://php.net/manual/en/function.imap-delete.php

Но не было бы возможно без решения Ben epic ниже.. В значительной степени для этого бит:

    //You can find out what folders are available with this command:
print_r(imap_list($conn, $gmailhostname, '*'));

print_r перечислены все папки в моей учетной записи по имени. Мы заметили "All Mail", в моем случае - 22 000+, нашли образец кода на php.net с синтаксисом, подключили его и альта!

Благодаря mmmshuddup для очистки моего кода и особенно Ben для огромных усилий по исследованию и ведущих решений.

Это весело, как ад.

Ответ 2

Я никогда не использовал функции imap, но, просматривая руководство, проблема может заключаться в том, что ваша функция imap_search возвращает простые порядковые номера сообщений вместо UID, которые я предполагаю, уникальные идентификаторы сообщений?

Может быть, кто-то может помочь вам лучше, я просто снимаю несколько вещей, чтобы попробовать.

Попробуйте изменить функцию imap_search:

   $emails = imap_search($conn,'FROM "'.$findemail.'"', SE_UID);

И ваши функции выборки:

  $overview = imap_fetch_overview($conn,$email_number, FT_UID);
  $message = imap_fetchbody($conn,$email_number,2, FT_UID);

Если это не сработает, попробуйте только одно: вместо этого выберите fetch_overview:

$overview = imap_fetch_overview($conn,"1:{$email_number}",0);
// Or Maybe:
$overview = imap_fetch_overview($conn,"{$email_number}:{$email_number}",0);

Сообщается, что он должен захватывать сообщения от 1 до, независимо от того, какой тип $mail_number я верю, последовательность идентификаторов сообщений, а не уникальных идентификаторов сообщений. Не уверен, хотя.

Я не думаю, что rsort() будет работать с использованием UID-метода, поэтому вам придется искать другой способ сортировки, если вы использовали этот метод. Вам, вероятно, придется захватить массив всех соответствующих заголовков электронной почты и отсортировать их таким образом.

Извините, я не более полезен, никогда не использовал imap раньше, но удачи!

Изменить: страницы руководства очень странны для этого, но похоже, что функция imap_sort также имеет критерии поиска, поэтому теоретически вы можете сделать:

  $emails = imap_sort($conn, SORTARRIVAL, 0, SE_UID, 'FROM "'.$findemail.'"');
  // and then grab the first one:
  $emails = array_slice($emails,0,1);

  //And then further down use these two with the UID param
   $overview = imap_fetch_overview($conn,$email_number, FT_UID);
   $message = imap_fetchbody($conn,$email_number,2, FT_UID);

Если вы все еще не получаете сообщения из своего архива, вы можете посмотреть на этот ответ:

PHP imap_search не обнаруживает все сообщения в почтовом ящике gmail

Изменить снова

Ничего себе, это действительно больше, чем я думал.... Это превращается в самый длинный ответ когда-либо...

В зависимости от ваших требований, если вам только нужно найти сообщения в папке архива, я считаю, что вам нужно снова открыть соединение и подключиться к этой конкретной папке, прежде чем искать, например:

imap_reopen($conn, "{$gmailhostname}Archive") or die(implode(", ", imap_errors()));
//You can find out what folders are available with this command:
print_r(imap_list($conn, $gmailhostname, '*'));

Если вам нужно искать все папки... Это сложнее, чем я видел: Вам нужно либо прокрутить каждый почтовый ящик электронной почты, который вы хотите найти, либо найти способ его использования:

http://code.google.com/apis/gmail/imap/#x-gm-raw

Я думаю, вам нужен пользовательский обработчик imap или ZEND. Пользовательская команда IMAP в php

Это официальная информация, которую я мог найти.