martes, 21 de agosto de 2012

Como enviar correos electrónicos con autentificación SMTP en PHP con la librería PHPMAILER

A medida que aumentan el número de aplicaciones web en internet, los desarrolladores somos cada vez más conscientes de la importancia de una comunicación entre la aplicación y el usuario a través del envío de correos electrónicos (no abusivos) por parte de dicha aplicación. Puede emplearse bien para recordar contraseñas, para enviar informes de pedidos, enviar facturas, notificaciones, campañas publicitarias, soporte, etc...

Además uno de los requisitos indispensables es que la aplicación web pueda enviar contenido a sus usuarios con la mejor presentación posible y ocupando el menor espacio.

En este caso vamos a centrarnos en aplicaciones web desarrolladas en PHP y utilizaremos la librería PHPMailer.



En el lenguaje PHP ya existe una función nativa para el envío de correo electrónico, el problema que presenta frente a la solución PHPMailer, es que no soporta Autentificación ni envío de contenido HTML.

Con la función Mail nativa de PHP, al no soportar Autentificación no podemos asegurar que el que envía el correo es quien dice ser, por lo que muchos servidores de correo catalogan dichos envíos como SPAM, de modo que pocos son los emails que llegan a su destino. Esto es un gran problema para nuestra aplicación, ya que como hemos mencionado es imprescindible notificar y captar la atención de los usuarios para que nuestra aplicación pueda tener éxito.

Otro punto importante que posibilita la librería PHPMailer es que permite el envío de contenido HTML lo cual proporciona una gran flexibilidad a la hora de crear los cuerpos del mensaje tanto en contenido como en diseño.

EJEMPLO DE ENVÍO DE CORREO ELECTRONICO CON LIBRERÍA PHPMAILER 5.2.1  

En primer lugar descargamos la librería de PHPMailer 5.2.1 de http://phpmailer.apache-extras.org.codespot.com/files/PHPMailer_5.2.1.zip y descomprimimos, añadiendo la carpeta “PHPMailer_5.2.1” descomprimida en nuestro proyecto. 

Una vez tenemos la librería descargada utilizaremos la siguiente función php que hace uso de dicha librería para enviar los correos electrónicos. La función está comentada con detalle para entender que se hace en cada parte:

 

function enviarEmailSMTP($origen,$nombreOrigen,$destino,$responderA,$longitudLinea,$tituloEmail,$cuerpoEmail,$servidor,$usuario,$contraseña,$seguridadSMTP,$puerto,$archivosAdjuntos)
{  
   
    require_once('./PHPMailer_5.2.1/class.phpmailer.php'); // Especificamos la utilización de la librería PHPMailer 5.2.1 contenida en el directorio actual
    $mail = new PHPMailer(true); //el parámetro 'true' significa que lanzará excepciones en los errores que se produzcan, las cuales deben ser capturadas

    $mail->IsSMTP(); //le decimos a la clase que utilice SMTP

    try {
      $mail->SMTPDebug  = 0; // activa la información SMTP de depuración (para pruebas)
      $mail->SMTPAuth   = true; //activa autenficicación SMTP
      $mail->SMTPSecure = $seguridadSMTP;                 // especifica la seguridad SMTP
      $mail->Host       = $servidor;      // especificamos la dirección del servidor de correo 
      $mail->Port       = $puerto;                   // puerto del servidor de correo
      $mail->Username   = $usuario;  // usuario del correo origen
      $mail->Password   = $contraseña;         //contraseña del correo origen
      $mail->AddAddress($destino, ''); // dirección de correo destino
      $mail->SetFrom($origen, $nombreOrigen); // especificamos el origen del correo
      $mail->Subject = $tituloEmail; // titulo del email
      $mail->MsgHTML($cuerpoEmail); // cuerpo del email
     
     
      for($i=0;$i<count($archivosAdjuntos);$i++) // recorremos vector de rutas de archivos y adjuntamos
      {
        $mail->AddAttachment($archivosAdjuntos[$i]);
      }
     
      $mail->Send();
     
      //Si llegamos a este punto quiere decir que no ha habido ninguna excepción por lo que el envio se realizó correctamente.
      return true;
     
    } catch (phpmailerException $e) {
        echo $e->errorMessage(); //Excepción de PHPMailer
    } catch (Exception $e) {
        echo $e->getMessage(); //Cualquier otra excepción
    }
}


Como podemos observar esta función utiliza una serie de parámetros de entrada, la mejor forma de ver que son cada parámetro es mediante un ejemplo de utilización comentado. El envío se realiza a través de una dirección de GMAIL por ssl:
$origen = "micorreo@gmail.com"; // correo del emisor
$nombreOrigen="Mi nombre"; // nombre del emisor
$destino = "destino@gmail.com"; // correo del destino
$responderA=$origen; // correos a los que queremos que respondan
$longitudLinea=50; //longitud de la linea del correo
$tituloEmail = "Titulo del email"; // titulo del correo
$cuerpoEmail = "Esto es el cuerpo del email, podría tener código HTML."; //cuerpo del correo
$servidor = "smtp.gmail.com"; //dirección del servidor de correo
$usuario = $origen; //usuario de autentificación
$contraseña = "password"; //contraseña de autentificación
$seguridadSMTP="ssl";  //seguridad SMTP
$puerto=465; //puerto del servicio de correo
$archivosAdjuntos=array('./imagenes/logo.png','./archivos/factura.pdf'); //vector de rutas de los archivos a adjuntar en el correo

enviarEmailSMTP($origen,$nombreOrigen,$destino,$responderA,$longitudLinea,$tituloEmail,$cuerpoEmail,$servidor,$usuario,$contraseña,$seguridadSMTP,$puerto,$archivosAdjuntos);


Finalmente mencionar que dependiendo del servidor de correo de la dirección origen los parámetros serán unos y otros.