Использование PHP, Как искать в архивированных письмах Gmail - PullRequest
23 голосов
/ 18 ноября 2011

( Первое программирование на PHP. Нужна была помощь. Нужно немного больше. )

Цель:

Извлечь lastContactDate с указанного адреса электронной почты с моегоучетная запись Gmail.Надеясь ответить на вопрос: «Когда я в последний раз связывался с [Персоном]»

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

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

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

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

Примечания:

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

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

Код, используемый до сих пор:

    /* connect to gmail */
$gmailhostname = '{imap.gmail.com:993/imap/ssl}';
$gmailusername = "___@gmail.com";
$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);
?>

Ответы [ 2 ]

12 голосов
/ 18 ноября 2011

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

Вот решение. Используя приведенный выше исходный код, мы только изменили местоположение, в котором наша программа выполняет поиск. Вместо 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

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

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

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

Спасибо mmmshuddup за очистку моего кода и особенно Бена за огромные исследовательские усилия и передовые решения.

Это чертовски весело.

6 голосов
/ 18 ноября 2011

Я никогда не использовал функции 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 до, как мне кажется, $ email_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

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

...