Envío de correos desde PHP con Zend_Mail

Zend Framework Logo Zend Framework Logo

Cualquiera que haya participado en el desarrollo de una aplicación web seguro que se ha encontrado en la situación de tener que enviar un correo electrónico.

  • Un usuario decide cambiar su contraseña de inicio de sesión en el sistema y se le envía la nueva contraseña por correo electrónico.
  • Un comprador en un sitio de comercio electrónico finaliza con éxito una transacción y recibe un correo con el resumen de su compra.
  • Un sistema que incluye la trazabilidad de determinados eventos avisa a un usuario del cambio de estado de un evento en el que está implicado.

Sea cual sea el caso, el correo electrónico suele ser la forma más fácil de avisar a un usuario, ya que hoy en día todo el mundo tiene al menos una cuenta de email.

Si nuestra aplicación se está desarrollando en PHP es fácil que conozcamos la PHPMailer, una clase muy usada para el envío de correos electrónicos.

En este artículo vamos a hablar de otra alternativa, Zend_Mail, que es el componente para envío de correos incluido en Zend Framework, y que como la mayoría de sus componentes puede usarse de forma independiente.

Lo primero que debemos hacer es descargar Zend Framework de la página oficial.

El paquete descargado incluye una carpeta library que contiene al propio Zend Framework. De ahí nos harán falta los archivos Zend/Mail.php, Zend/Mime.php, Zend/Exception.php, Zend/Loader.php, Zend/Registry.php, Zend/Validate.php, la carpeta Zend/Mail con todo su contenido, la carpeta Zend/Validate con todo su contenido y la carpeta Zend/Mime con todo su contenido.

Todos estos archivos deberán ser incluidos (include, require) en el punto en el que vayan a ser usados, o en su defecto deberemos implementar un sistema de autoloading de las clases definidas en esos archivos. Este paso nos lo podemos ahorrar si estamos desarrollando una aplicación Zend Framework, ya que este se encargará de hacer todo el trabajo de carga de clases por nosotros.

Una vez hecho esto podemos entrar en el funcionamiento de Zend_Mail.

Lo primero que hay que hacer es instanciar un objeto Zend_Mail al que le pasaremos todos los datos que componen el correo, como el cuerpo, el asunto o los diferentes destinatarios.

$mail = new Zend_Mail("UTF-8"); //Usaremos codificación UTF-8 para el mensaje
$mail->setFrom("calat1@calat.com", "Calat Sistemas y Comunicaciones") //Cuenta de correo del remitente y nombre del remitente amostrar
     ->setSubject("Este es el asutno del mensaje") //Asunto
     ->setBodyHtml("<div><h1>Este es el cuerpo</h1><p>Lorem Ipsum</p></div>") //Cuerpo del mensaje indicando que será HTML y no texto plano. Usaríamos setBodyText() para texto plano
     ->addTo("calat2@calat.com") //Añadimos un destinatario
     ->addTo("calat3@calat.com") //Añadimos otro destinatario
     ->addCc("copy@calat.com") //Añadimos un destinatario en copia
     ->addBcc("blind@calat"); //Añadimos un destinatario en copia oculta
Como curiosidad, sólo decir que en Zend Framework se suele hacer uso en casi todas las clases del encadenamiento de métodos, de forma que cualquier método que no deba devolver un valor, devuelve el mismo objeto que lo llamó por defecto, de ahí que en el ejemplo todos los métodos sean invocados seguidos uno detrás de otro.

Una vez definido el objeto y establecidas todas las propiedades del correo sólo nos queda enviarlo.

Es importante enviarlo dentro de un try / catch, ya que si el envío falla por alguna razón, Zend_Mail lanzará una excepción del tipo Zend_Exception.

try {
    $mail->send();
} catch (Zend_Exception $e) {
    echo $e->getMessage();
}

Esto enviará el correo usando por defecto la función mail() de PHP, por lo que el sistema local deberá ser capaz de acceder a un servidor de correo, por ejemplo teniendo un SMTP en la máquina local. Si no fuera este nuestro caso y queremos especificar el servidor de correo que debe ser usado tendremos que hacer un par de cambios en el código.

El objeto Zend_Mail no hay que tocarlo, pero tendremos que definir un objeto Zend_Mail_Transport_Smtp en el que indicaremos los datos de conexión con el servidor SMTP.

$mail = new Zend_Mail("UTF-8");

...

$transport = new Zend_Mail_Transport_Smtp(
    "smtp.domain.com", 
    array(
        "auth"           => "login",
        "port"           => 25,
        "username"  => "nombre-de-usuario-del-SMTP"
        "password"  => "la-contraseña"
    )
);

try {
    $mail->send($transport);
} catch (Zend_Exception $e) {
    echo $e->getMessage();
}

Como se ve en el ejemplo, le pasamos el objeto transport como parámetro al método send de Zend_Mail, y él sólo ya sabrá cómo conectar con el servidor SMTP.

Es importante seguir manteniendo el try / catch al hacer el envío, ya que si no fuera capaz de alcanzar el servidor o alguno de los datos de login fuera incorrecto, se lanzaría una excepción.

Lo último que nos podría hacer falta es adjuntar uno o varios archivos en el correo. Para ellos necesitaremos encapsular cada uno de ellos en un objeto Zend_Mime_Part

$mail = new Zend_Mail("UTF-8");

...

//Leemos el contenido del archivo a adjuntar y lo encapsulamos en un objeto Zend_Mime_Part
$mime = new Zend_Mime_Part(file_get_fontents("/path/to/file.pdf"));
$mime->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$mime->encoding    = Zend_Mime::ENCODING_BASE64;
$mime->filename    = pathinfo("/path/to/file.pdf", PATHINFO_BASENAME);

//Adjuntar el archivo al correo
$mail->addAttachment($mime);

En el ejemplo definimos el archivo como un adjunto normal, para que en el correo nos aparezca la opción de descargarlo, y lo codificamos en base64. Además le decimos que el nombre que debe aparecer para dicho archivo es su nombre real.

Este mismo proceso tendrá que ser repetido tantas veces como archivos queramos adjuntar, y siempre antes de llamar al método send de Zend_Mail.

Con esto queda explicado el funcionamiento básico de Zend_Mail, una de las mejores formas de enviar correos desde una aplicación PHP.

1 Comments

  1. no adjunta mi archivo es un .xls mi codigo esta asi
    $mime = new Zend_Mime_Part(file_get_contents(“queso.xls”));
    $mime->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
    $mime->encoding = Zend_Mime::ENCODING_BASE64;
    $mime->filename = pathinfo(“queso.xls”, PATHINFO_BASENAME);
    $mailsivemax->addAttachment($mime);

Anímate a compartir con nosotros tus inquietudes y experiencias.

A %d blogueros les gusta esto: