Leer correo con PHP

Leer correo con PHP

Suele ser muy común en una web el envío de correos electrónicos mediante la función mail de PHP, ahora bien puede ser que a veces necesitemos leer correos desde PHP, ya sea para crear una aplicación de webmail, o para mostrar al usuario sus correos recibidos, o cualquier otra funcionalidad que se nos ocurra.

Leer correo con PHP

Para lograr esto, tenemos dos formas de hacerlo:
1) Implementar el protocolo directamente a través de sockets.
Puede que sea la forma más laboriosa pero en algunos casos, puede ser útil. Como hemos dicho se trata de abrir un socket al servidor de correo y comunicarnos con él utilizando el protocolo requerido, donde los más comunes son POP3 e IMAP.

Por ejemplo, para crear el socket haríamos:

$server = "ip del servidor";
$user = "usuario de correo";
$pass = "contraseña del correo";
$connection = fsockopen($server, 110, $errno, $errstr, 30);
A destacar que aquí abrimos la conexión al puerto 110 (correspondiente a POP3).

Para logearnos en el servidor de correo, bastaría con hacer lo siguiente:
fputs($connection, "user $usern");
echo fgets($connection)."
"; fputs($connection, "pass $passn"); echo fgets($connection)."
";
Como podemos ver se trata de envíar un mensaje y esperar una respuesta.

Los mensajes que envíamos y el orden en que se envían los marca el protocolo a utilizar en este caso POP3, así que por ejemplo si queremos recibir el correo número 2 debemos enviar lo siguiente:
fputs($connection, "RETR 2n");
$total = 0;
$bloque = 1000;
while ($total < $tamano) {
    echo fread($connection, $bloque);
    $total = $total + $bloque;
}
Se envía el mensaje RETR 2, con lo cual el servidor de correo nos manda el mensaje número 2, y procedemos a leerlo. El tamaño del mensaje a leer, lo obtenemos mandadole previamente el mensaje LIST 2.

2) La forma más sencilla y recomendada, consiste en utilizar las funciones IMAP que nos proporciona PHP. Estas permiten conectar con POP3, IMAP y NNTP.
En este caso si queremos abrir una conexión POP3 como antes, tendremos que utilizar la función imap_open:
$mbox = imap_open ("{localhost:110/pop3}INBOX", "user_id", "password");

Para obtener el numero de mensajes se utiliza imap_check, y para leer la cabecera de un mensaje por si queremos ver quién lo ha enviado, se utiliza la función:
$cabecera = imap_headerinfo($mbox, numero_mensaje)
$from = $cabecera->from;
$subject = $cabecera->subject;
Para leer ya el mensaje en sí, utilizamos la función imap_fetchstructure, pasandole como parametros la conexión abierta ($mbox), y el número del mensaje.
De esta forma obtenemos todas las partes que contiene el mensaje de correo electrónico, pudiendo ser estas texto plano, html...

Otras funciones útiles son imap_delete, que nos permite eliminar un mensaje, e imap_expunge que hace efectivos los cambios, por ejemplo borra finalmente los mensajes marcados con delete.

A destacar que las funciones IMAP al conectar a una cuenta de POP3 no disponen de toda su funcionalidad, es decir no podemos marcar mensajes como leídos, ni manejar carpetas, ...

Comentarios

Comentario de fahren - 09 de Septiembre de 2011 - 19:41
interesante pero seria mas completo aun si se mencionara la correcta implementacion de algunas funcionalidades que no se han ilustrado sino solo mencionado, aunque debo admitir que el trabajo de leer emails, siguiendo este instructivo, esta casi en un 70% realizado.
Comentario de Nolava - 15 de Noviembre de 2011 - 22:31
para utilizar tu código se debe de tener instalado Imap de php verdad??
Comentario de javier - 24 de Abril de 2012 - 23:35
en esta parte no me funciona $mbox = imap_open ("{localhost:110/pop3}INBOX", "user_id", "password");
Comentario de Imaginanet - 25 de Abril de 2012 - 06:53
Hola. Es necesario tener Imap instalado, y sustituir el user_id, password y la ruta de conexion (localhost...) por sus valores correspondientes.
Comentario de Daniel - 09 de Junio de 2012 - 23:37
Tampoco me funciona el imap y cuando tecleo la función de phpinfo( ); me aparece que tengo instalada la biblioteca y presisamente me quiero conectar a un servidor por pop3
Ha habido un error en el envío
Comentario enviado. Será revisado por la moderación antes de ser publicado.

Deja tu comentario

Tu nombre:
Tu email:
Tu comentario: