Feb 04

En el desarrollo de aplicaciones PHP es muy frecuente encontrarse con la necesidad de enviar algún tipo de email: bonitos en HTML a los usuarios, de debug, alertas, etc. Para enviar un correo electrónico en PHP disponemos de varias formas de hacerlo, lo más rápido es con las funciones incorporadas en el mismo lenguaje aunque también disponemos de una gran cantidad de clases y librerías ya hechas, como las PEAR Mail. Como siempre el uso de librerías externas con muchas líneas de código empeoran el rendimiento y mantenimiento de nuestro software. Pero las PEAR Mail son bastante ligeras y, en mi opinión, muy útiles en los casos en que queremos enviar emails “bonitos” con HTML enviando también la versión texto, con attachments, imágenes, vídeos, y demás, así nos olvidamos de tener que gestionar todo lo necesario manualmente (cabeceras, codificaciones, extensiones MIME, etc.). Aunque siempre se ha de valorar el uso que le vamos a dar de lo q ofrece y el número y tipo de emails q necesitamos enviar. A continuación detallo brevemente algunos métodos para enviar distintos tipos de email desde PHP.

Función mail()

Para enviar emails sencillos en modo texto el uso de la función mail() es sin lugar a dudas lo más cómodo. Su uso es el siguiente:

[php] mail(‘direccion@del.destinario.com’,’Asunto’,’Mensaje’); [/php]

Devuelve TRUE en caso de éxito y FALSE en caso contrario. También podemos pasarle cabeceras adicionales como cuarto parámetro, esto puede ser útil, por ejemplo, para enviar mensajes HTML usando mail() pero a la mínima q necesites enviar emails un poco más complejos es recomendable usar las PEAR.

Función error_log()

Para todos aquellos emails de debug o alertas internas de nuestro software podemos usar error_log(). Con esta función podemos hacer log a distintos destinos: el log del sistema, un archivo, la conexión de debug y también enviar por email. Por ejemplo para enviarnos por email información acerca de una exception q nos salta en nuestro código:

[php] try {
// código con posibles errores
} catch (Exception $e) {
$msg = ‘ERROR #’.$e->getCode().”\n”;
$msg .= $e->getMessage().”\n”;
$msg .= print_r($e->getTrace(),true);
@error_log($msg, 1, ‘direccion@del.destinario.com’);
} [/php]

Clase PEAR Mail_mime

Como comentaba esta es una de las clases existentes para el envío de emails con soporte de extensiones MIME, lo que permite enviar HTML con imágenes, vídeo, archivos adjuntos, etc. Este es un ejemplo sencillo de como enviar un email HTML con su versión texto y con un archivo adjunto:

[php] require_once ‘Mail.php’;
require_once ‘Mail/mime.php’;
$destinario = ‘direccion@del.destinario.com’;
$from = ‘direccion@del.from.com’;
$asunto = ‘Asunto del mensaje’;
$mensaje = ‘‘.$asunto.’‘.”\n”;
$mensaje .= ‘

Hola

‘;
$mime = new Mail_mime(“\n”);
$mime->setTXTBody(strip_tags($mensaje));
$mime->setHTMLBody($mensaje);
$mime->addAttachment(‘fichero_adjunto.zip’, ‘application/zip’);
$body = $mime->get();
$hdrs = array(‘From’ => $from, ‘Subject’ => $asunto);
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory(‘mail’);
$res = $mail->send($destinario, $hdrs, $body);
if (PEAR::isError($res)) echo ‘error enviando el email’; [/php]

Todos los métodos anteriormente descritos necesitan de un servidor de correo funcionando y las directivas de configuración del PHP correctamente fijadas. Si tienes un ISP un poco decente casi seguro q no tendrás ningún problema.

Una técnica alternativa a todos estos métodos y que no necesita de servidor de correo es usar sockets (función fsockopen()) para mandar nosotros mismos los mensajes desde nuestro código. Se trata de hacer desde PHP el trabajo q antes nos hacía el servidor. Esto, en general, no es recomendable ya q puede presentar serios problemas d rendimiento y gestión de errores (nunca funcionará mejor nuestro código PHP q un Qmail :) y la única ventaja destacable q presenta, a parte de no necesitar d un servidor d correo, es disponer de un mayor control de lo que pasa cuando se envía el email. Podemos por ejemplo saber en el momento si el servidor del destinatario del correo existe y nos acepta el mensaje, etc… Aunque con los métodos descritos y leyendo los mensajes devueltos por el servidor de correo también puedes saber si todo va bien… como consejo, si tienes un servidor de correo úsalo.

Tagged with:
preload preload preload