( Первое программирование на PHP. Была какая-то помощь. Нужно немного больше. )
Цель:
Извлеките lastContactDate из заданного адреса электронной почты из моей учетной записи gmail. Надеясь ответить на вопрос: «Когда я в последний раз связался с [Лицом]»,
Что я сделал до сих пор:
Что я не могу сделать:
Заметки:
Исследование:
Используемый код:
/* 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); ?>
Задача решена!
Вот решение. Используя исходный код выше, мы только изменили местоположение, в котором находится наша программа. Вместо 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
Это официальная информация, которую я мог найти.