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

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

Цель:

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

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

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

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

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

Заметки:

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

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

  • Я думаю, что возиться с параметрами для imap_open и imap_search – это, наверное, мой лучший выбор, но не уверен.
  • Очень сильно использовал эти две страницы:
  • http://php.net/manual/en/function.imap-open.php
  • http://php.net/manual/en/function.imap-search.php

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

/* 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); ?> 

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

Задача решена!

Вот решение. Используя исходный код выше, мы только изменили местоположение, в котором находится наша программа. Вместо 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 перечислены все папки в моей учетной записи по имени. Мы заметили «All Mail», в моем случае – 22 000+, нашли образец кода на php.net с синтаксисом, подключили его и альта!

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

Это весело, черт возьми.

Я никогда не использовал функции 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 раньше, но удачи!

Редактировать: страницы man очень странные для этого, но похоже, что функция 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

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