PHPMailer, o el email sin complicaciones…

Si te dedicas al diseño web, antes o después tendrás que enfrentarte con el siguiente marrón: “email en HTML”.

Para un proyectillo que tenía entre manos (un mini-gestor de listas de correo) me ha tocado revisitar el tema. En principio, pensaba usar algún proyecto OpenSource de los miles que hay por ahí, pero ninguno me servía porque:

  • Eran increíblemente complejos de usar
  • Eran increíblemente complejos de instalar
  • Eran increíblemente feos
  • Todas las anteriores

Con lo cual, he acabado fabricándome mi propio gestor de listas de correo, con soporte para plantillas, base de datos de destinatarios, y archivo de los emails enviados (y de paso con un poquito de AJAX : )

Mailer001

Investigando gestores de listas OpenSource me he encontrado con PHPMailer, una clase PHP que se encarga de gestionar todo lo que convierte al envío de emails en HTML en una pesadilla, para dejarte pensar en cosas más interesantes (como, por ejemplo, el contenido de tus boletines de noticias : )

A modo de ejemplo, aquí va el código para enviar los mails en HTML de mi gestor:

<?php
    require("phpmailer/class.phpmailer.php");
    $mail = new PHPMailer();
    $mail->IsSMTP();
    $mail->Host = "mail.flumo.com";
    $mail->Username = "usuario";
    $mail->Password = "password";
    $mail->SMTPAuth = true;
    $mail->CharSet = "UTF-8";
    $mail->From = "info@flumo.com";
    $mail->FromName = "Flumo.com";
    $mail->IsHTML(true);
    $mail->Subject = $_POST['subject'];
    $mail->AltBody = $_POST['header']."\n\n".$_POST['body'];
    $mail->AddEmbeddedImage('logo.gif','my-logo');
    $mail->AddEmbeddedImage('bg.gif','my-bg');
    /* Destinatarios */
    $mail->AddAddress('info@flumo.com','Lista de correo de Flumo.com');
    if($_POST['database'] == 1){
        $usuarios = $db->get_results("SELECT * FROM usuarios");
        foreach($usuarios as $usuario){
            $mail->AddBCC($usuario->email,$usuario->name);
        }
    }
    if($_POST['destinatarios']){
        $to = explode(",",$_POST['destinatarios']);
        foreach($to as $tos){
            $mail->AddBCC($tos);
        }
    }
    /* Plantilla */
    $template = file_get_contents('templates/flumo.tpl','r');
    $display = str_replace("%%header%%",$_POST['header'],$template);
    $display = str_replace("%%body%%",$_POST['body'],$display);
    /* Imagenes */
    $display = str_replace("logo.gif","cid:my-logo",$display);
    $display = str_replace("bg.gif","cid:my-bg",$display);
    $mail->Body = $display;
    /* Envio del mensaje */
    if(!$mail->Send()) {
        echo "El mensaje no pudo ser enviado.";
        echo "Error: " . $mail->ErrorInfo;
    } else {
        echo "El mensaje ha sido enviado.";
    }
?>

En el código hay un par de cosillas que usan ezSQL, pero de esa otra maravilla ya hablaremos otro día…

El resultado, una cosilla así:

Mailer002

Si tu próximo proyecto tiene algo que ver con email y usas PHP, te debes a tí mism@ echarle un vistazo a PHPMailer.

Update: Un artículo bastante bueno en cristiano sobre PHPMailer en programacion.com

13 thoughts on “PHPMailer, o el email sin complicaciones…

  1. El código del gestor de listas de correo es para un cliente, es privado, o se le puede meter mano ? :)

    Un saludo…

  2. Si soy capaz de encontrarlo entre las montañas de cosas de mi disco duro, lo pondré por aquí para descargarlo…

  3. me hace gracia porque precísamente me he sentido completamente identificado contigo. Necesitaba un gestor de newsletters con funcionalidades básicas, xhtml y diseño medianamente bueno.

    He llegado a las mismas conclusiones de planteamiento, perdí el tiempo buscando alguno hecho y también con la función mail. hasta que me decidí con phpmailer. Que pena que no leí este artículo antes.

    Me llama la atención como envías el mail (con bcc).

  4. Carlos, si miras la documentación de PHPMailer verás que hay un atributo ‘ConfirmReadingTo’ que sirve justo para lo que quieres.

    La documentación es nuestra amiga… ;D

  5. ¿Cuantas direcciones se pueden añadir a AddBCC?, ¿podrían ser 25.000?. Yo hago que el usuario, debidamente autorizado, cree el correo dinámicamente, o sea, elige el número de destinatarios, que envío también como AddBCC, el asunto, archivo adjunto y texto para el body en un textarea, ¿que puedo hacer para que el usuario introduzca también imágenes, pero que no vayan como ficheros adjuntos, sino como si enviara una página web?, no se si me explico, pero me urge, es muy importante para mi.

    ¡Gracias!, Un Saludo, Fernando

  6. Holas… pues creo que no encontraste el codigo completo no? :( haber si le das otra buscadita pues… estoy seguro que muchos te lo agradeceran ;)

    Saludos…

  7. Si requieren el uso de caracteres especiales (acentos, por ejemplo) agregar lo siguiente al código:

    $mail->CharSet = "UTF-8";  
    $mail->Encoding = "quoted-printable";

    De esta manera se pueden obtener acentos tanto en el asunto del mensaje como en el cuerpo ($body).

  8. He estado revisando el asunto del Phpmailer.. me interesa un resto porque estoy haciendo una pagina en flash… pero… lo único que no he logrado entender es el asunto del class.phpmailer.php y class.smtp.php… no entiendo ni donde conseguirlos, ni como instalarlos en mi public_html… ayuda?

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>