mirar - Usando PHP, cómo buscar a través de correos electrónicos archivados de Gmail
dónde están los correos archivados en el gmail (2)
¡Problema resuelto!
Aquí está la solución. Usando el código original de arriba, solo modificamos la ubicación en la que busca nuestro programa. En lugar de INBOX, es:
/* connect to gmail */
$gmailhostname = ''{imap.gmail.com:993/imap/ssl}[Gmail]/All Mail'';
Específicamente
[Gmail]/All Mail
Encuentra la sintaxis aquí: http://php.net/manual/en/function.imap-delete.php
Pero no hubiera sido posible sin la solución épica de Ben a continuación ... En gran parte para este bit:
//You can find out what folders are available with this command:
print_r(imap_list($conn, $gmailhostname, ''*''));
print_r enumeró todas las carpetas en mi cuenta por nombre. Vimos "All Mail", en mi caso, más de 22,000, encontramos un fragmento de código de muestra en php.net con la sintaxis, lo conecté y viola.
Gracias a mmmshuddup por limpiar mi código y especialmente a Ben por el enorme esfuerzo de investigación y las soluciones líderes.
Esto es divertido como el infierno.
( Programación por primera vez en PHP. Recibí ayuda. Necesito un poco más. )
Gol:
Extraiga el lastContactDate de una dirección de correo electrónico dada de mi cuenta de gmail. Esperando responder a la pregunta, "¿Cuándo fue la última vez que contacté con [Persona]?"
Lo que he hecho hasta ahora:
- Conectado a gmail usando imap (solo bandeja de entrada)
- Agarró la fecha y la hora
- Impreso el nombre de la persona y la marca de tiempo.
Lo que no puedo hacer:
- Recorrer los correos electrónicos de lastContactDate que se han archivado (soy un buzón de entrada = 0 hombres)
Notas:
- El código es rudo, pero funcional. El php debería estar realmente separado en diferentes páginas, pero este es el primer intento. ¡Gracias de antemano por cualquier ayuda!
- Programación amorosa, por cierto. Hice un poco de baile @ edw519 más de una vez en los últimos dos días.
Investigación:
- Creo que jugar con los parámetros para imap_open e imap_search es probablemente mi mejor apuesta, pero no estoy seguro.
- He estado usando estas dos páginas en gran medida:
- http://php.net/manual/en/function.imap-open.php
- http://php.net/manual/en/function.imap-search.php
Código utilizado hasta ahora:
/* 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);
?>
Nunca he usado las funciones imap, pero mirando el manual, el problema podría ser que su función imap_search está devolviendo números de secuencia de mensajes simples en lugar de UIDs, ¿cuáles son los identificadores únicos de los mensajes?
Tal vez alguien pueda ayudarte mejor. Solo estoy probando algunas cosas para intentarlo.
Intenta cambiar tu función imap_search a esto:
$emails = imap_search($conn,''FROM "''.$findemail.''"'', SE_UID);
Y sus funciones de recuperación para estos:
$overview = imap_fetch_overview($conn,$email_number, FT_UID);
$message = imap_fetchbody($conn,$email_number,2, FT_UID);
Si eso no funciona, otra cosa que puedes intentar es establecer fetch_overview en uno de estos en su lugar:
$overview = imap_fetch_overview($conn,"1:{$email_number}",0);
// Or Maybe:
$overview = imap_fetch_overview($conn,"{$email_number}:{$email_number}",0);
Lo que le dice que tome los mensajes de 1 a, sea lo que sea $ email_number, creo, una secuencia de identificadores de mensajes en lugar de identificadores únicos de mensajes. Aunque no estoy seguro.
No creo que rsort () funcione con el método UID, por lo que tendrías que encontrar una forma diferente de ordenarlos, si usas ese método. Probablemente tendría que tomar una serie de todos los encabezados de los correos electrónicos coincidentes, y ordenar de esa manera.
Lo siento, no soy más útil, nunca he usado imap antes, pero ¡buena suerte!
Edición: Las páginas del manual son muy extrañas para esto, pero parece que la función imap_sort también tiene criterios de búsqueda, por lo que en teoría, podría hacer:
$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);
Si aún no recibe mensajes de su archivo, puede mirar esta respuesta:
PHP imap_search no detecta todos los mensajes en la bandeja de entrada de gmail
Editar de nuevo
Realmente hay más de esto de lo que pensé ... Esto se está convirtiendo en la respuesta más larga ...
Dependiendo de cuáles sean sus requisitos, si solo necesita encontrar mensajes en la carpeta de archivos, creo que necesita volver a abrir la conexión y conectarse a esa carpeta específica antes de buscar, algo como:
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, ''*''));
Si necesita buscar en todas sus carpetas ... Eso es más difícil de lo que he visto: necesita hacer un ciclo en cada bandeja de entrada de correo electrónico que desea buscar, o encontrar una manera de usar esto:
http://code.google.com/apis/gmail/imap/#x-gm-raw
Creo que necesitarías un controlador de imap personalizado o ZEND. Comando IMAP personalizado en php
Esa es oficialmente toda la información que pude encontrar.