PEAR:Mail y PHPMailer
Hay muchas formas de relizar el envío de un mail en PHP, disponemos de una función muy simple llamada mail (incluso puede llegar a ser muy potente). Pero si deseamos manajer de una forma más clara o sencilla distintos parametros de un mail (archivos adjuntos, imágenes incrustadas, etc.), lo podemos hacer de una forma relativamente facil con PEAR:Mail o PHPMailer, ¿cuál elegir?.
Ambas clases llevan varios años en la “pelea”, los más puristas prefieren el package Mail de PEAR, mientras otros prefieren la simpleza de PHPMailer, solo de ti depende cuál usar, mientras, veeremos dos ejemplos, uno para cada clase, realizando la misma acción (el envio de un par de emails) utilizando el smtp autentificado de gmail.
PEAR:Mail
El proyecto PEAR es una iniciativa que lleva muchos años, desde el remoto 99, tiene como intención en crear un repositorio de componentes escritos en PHP. Promueve la reutilización de código en tareas comunes durante el desarrollo.
Es posible que el Package PEAR:Mail sea uno de los más usados de PEAR(según ElePHPant xD), su primer release estable data del 2002, mantiene dos ramas, una para PHP4 (1.11.x) y las superiores para PHP5 (>= 1.12.x). Como todo buen package de PEAR, tiene un par de depencias, específicamente PEAR_Installer y NET_SMTP.
Existen varias formas de instalar un packages pear, la más “bruta” sería descomprimir el package de PEAR:Mail y la de sus dependencias, mientras la más sotisficada sería usar el gestor de paquetes propio de pear (pear) o el más nuevo Pyrus.
pear install Mail-1.2.0
o
php pyrus.phar install pear/Mail-1.2.0
Si no disponemos del comando pear, en entornos like unix como GNU/Linux, podemos a través de apt, yum, etc. Mientras en otros entornos (Windows) podriamos ejecutar go-pear.php (php -q go-pear.php) que generalmente viene acompañado en la instalación por defecto de PHP (además verificar que el binario de PHP se encuentre en nuestra variable de entorno PATH).
Como ultima instancia, podemos descargar el ejemplo del articulo (más abajo en referencias), en el, viene una versión de PEAR, PEAR:Mail y otros packages que se colaron xD.
Finalmente el esperado ejemplo de PEAR:Mail
<?php // Example by deerme.org $pear = "/usr/share/php5/php/"; ini_set("include_path",ini_get("include_path").":$pear"); require_once("Mail.php"); require_once("Mail/mime.php"); // Data Mail $sender = "myuser@gmail.com"; $recipients = array("dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org"); $subject = "Etiam consectetur laoreet porttitor"; $text = 'Nam suscipit lorem vitae turpis tempor'; $html = '<html><body><p>Nam suscipit lorem vitae turpis tempor</p></body></html>'; // Config $crlf = "n"; $config = array( "host" => "ssl://smtp.gmail.com", "port" => "465" , "username" => "myuser@gmail.com" , "password" => "password" , "auth" => true ); $headers = array('From'=> $sender,'Return-Path'=>$sender,'Subject'=> $subject); // Instance Mail $xmail = new Mail_mime($crlf); $xmail->setTXTBody($text); $xmail->setHTMLBody($html); // Attachment $xmail->addAttachment("/tmp/pdf.pdf", "application/pdf", "", true); $xmail->addAttachment("/tmp/image.jpg", "image/jpeg", "", true); // Get Body and Headr $body = $xmail->get(); $headers = $xmail->headers($headers); // Using Mail Factory to Send $smail =& Mail::factory('smtp', $config ); // Using Mail Factory to send function => $smail =& Mail::factory('mail'); foreach( $recipients as $k => $recipient ) { $smail->send($recipient, $headers, $body); } /* real 0m50.718s user 0m0.164s sys 0m2.660s */ ?>
PHPMailer
PHPMailer es otra alternativa, es una clase un poco más sencilla, ya que incluye todas las dependencias y solo debemos incluir phpmailer en nuestros scripts utilizando nuestras favoritas sentencias include, require, include_once o require_once. Nacio en el año 2001 y actualmente mantiene dos versiones (al igual que su rival) para PHP4 y PHP5.
Mantiene un par de atributos y métodos bastante ovbios con los cuales podamos operar al objeto que realizará el envío de nuestros mails.
<? // Example by deerme.org require_once 'phpmailer/class.phpmailer.php'; // Data Mail $sender = "myuser@gmail.com"; $recipients = array("dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org","dummy1@dummy.org"); $subject = "Etiam consectetur laoreet porttitor"; $text = 'Nam suscipit lorem vitae turpis tempor'; $html = '<html><body><p>Nam suscipit lorem vitae turpis tempor</p></body></html>'; // Config $crlf = "n"; $config = array( "host" => "ssl://smtp.gmail.com", "port" => "465" , "username" => "myuser@gmail.com" , "password" => "password" , "auth" => true ); $xmail = new PHPMailer(); $xmail->SetLanguage("en","PhpMailer/language/"); $xmail->From = $sender; $xmail->Subject = $subject; $xmail->AddAttachment("/tmp/pdf.pdf", "pdf.pdf"); $xmail->AddEmbeddedImage ("/tmp/image.jpg","3f7392db67ca82d7cfce6e714296ea3d","image.jpg","base64","image/jpg"); $xmail->Body = $html; $xmail->IsHTML (true); $xmail->IsSMTP(); $xmail->Host = $config["host"]; $xmail->Port = $config["port"]; $xmail->SMTPAuth = $config["auth"]; $xmail->Username = $config["username"]; $xmail->Password = $config["password"]; foreach($recipients as $k => $recipient) { $xmail->AddAddress($recipient); $xmail->Send(); $xmail->ClearAddresses(); } /* real 0m44.871s user 0m0.092s sys 0m0.464s */ ?>
Resultados
Es un poco complicado garantizar la mismas condiciones para la ejecución de los ejemplos, ya que ambas utilizan a la red y otros factores (estado de la red, estado del servidor, etc.) y no tenía mucho tiempo para garantizar iguales condiciones reales, por lo tanto, vamos a realizar una simple comparación, en un servidor virtual, una ejecución despues de la otra (tratando de garantizar que la carga en el servidor sea baja) para realizar el envío de un correo de 20 destinarios utilizando el smtp cifrado de gmail (las comparaciones se han realizado con el comando time).
copiapo:/var/www/php/examples# time php mail.pearmail.php real 0m50.718s user 0m0.164s sys 0m2.660s copiapo:/var/www/php/examples# time php mail.phpmailer.php real 0m44.871s user 0m0.092s sys 0m0.464s
Con los datos de la prueba (una prueba muy simple) podemos comparar que el tiempo real de demora de cada proceso es más o menos similar, pero hay que notar que phpmailer tiene una diferencia de alrededor de 5.8 segundos (más rapida) que pear:mail (hay que decir que el tiempo real contiene todo el tiempo que demoro el proceso, incluso esos tiempos muertos de espera para abrir la conexión, etc.) Mientras los tiempos de user + sys, representan un poco mejor el peso real de consumo que le tomo a la cpu ejecutarlos.
Podemos apreciar que php:mailer obtiene un tiempo un poco más bajo (0.43s) vs a los 0.55s de phpmailer. Para concluir, ambas alternativas parecen muy similares (en definitva lo son, es realizar el envío de un mail xD) en muchos aspectos (tiempo de ejecución real, tiempo de consumo en cpu, tamaños de scripts, etc.) por lo tanto sea el bando que tomemos, ambas alternativas son buenas.