El problema viene cuando el email que tienes que crear tiene algunas características avanzadas. ¿Cómo adjuntamos
archivos a un email? ¿Cómo incluomos imágenes? ¿Cómo usamos servidores SMTP distintos de los configurados en
php.ini? Todas estas cosas las puedes conseguir también en PHP si usas la clase PHPMailer que vamos a ver en este
artículo. Gracias a PHPMailer podrás de una manera sencilla hacer cosas como adjuntar archivos o realizar la autenticación
en el servidor de SMTP. En esos casos, la función mail() se nos queda corta y tenemos que recurrir a otros medios.
PHPMailer para enviar emails
PHPMailer es una clase creada específicamente para hacer sencillo el envío de emails que tienen características
complejas, y la verdad es que es bastante útil y potente. Permite enviar email con archivos adjuntos, diferentes tipos de
servidores SMTP (con o sin autenticación de usuario), a la vez que da soporte a otras características soportadas por la
función mail() nativa de PHP, pero de una manera un poco más simple.
Está disponible con licencia de libre distribución y uso, código abierto y se puede obtener a través del enlace siguiente:
Instalar PHPMailer
Puedes descargar el paquete completo y realizar el include de manera tradicional, o sino mediante Composer. Para instalar phpMailer con Composer:
composer require phpmailer/phpmailer
Una vez instalado composer tienes disponible el sistema de autoload de clases, por lo que solamente tendrías que hacer el include.
// Usar el sistema de autoload de composer require 'vendor/autoload.php';
Y luego solo tienes que crear los objetos de la clase. Especificando los espacios de nombres donde están ubicadas.
// Use de los espacios de nombres (namespaces) de PHPMailer // Los use se colocan en la parte superior del script de PHP // Estos son los use de las claes más importantes que puedes necesitar con PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; // Una vez declarados los namespaces simplemente tenemos que instanciar las clases por su nombre $mail = new PHPMailer(true);
Envío de email básico con PHPMailer
Vamos a poner un ejemplo de PHPMailer que esta en la propia página de ejemplos de la documentación, o entre los archivos de descarga que obtienes al bajarte PHPMailer.
<?php
// Incluimos la clase
require_once('../class.phpmailer.php');
// Dirección de correo a la que se envía el mensaje
$address = "email_destino@dominio.com";
$asunto = "Envío de email con PHPMailer en PHP";
// Instancio un objeto
$mail = new PHPMailer(); // defaults to using php "mail()"
// Estoy usando en mi archivo .php el juego de caracteres UTF8 y para asegurarnos que en el asunto
// y/o cuerpo del mensaje se vean correctamente los caracteres latinos,
// debe indicarse a PHPMailer qué juego de caracteres utilizo.
$mail->CharSet = "UTF-8";
$mail->Encoding = "quoted-printable";
// Defino el cuerpo del mensaje en una variable $body
$body = file_get_contents('contenido.html');
// Defino el email y nombre del remitente del mensaje
$mail->SetFrom('email@dominio.com', 'Nombre email');
// Defino la dirección de email de "reply", a la que responder los mensajes
// Dejamos la misma dirección que el From para no caer en spam
$mail->AddReplyTo('email@dominio.com', 'Nombre email');
// Añado el destinatario
$mail->AddAddress($address, "Nombre destino");
// Añado el asunto al mail
$mail->Subject = $asunto;
// Puedo definir un cuerpo alternativo del mensaje, que contenga solo texto
$mail->AltBody = "Cuerpo alternativo del mensaje";
//inserto el texto del mensaje en formato HTML
$mail->MsgHTML($body);
//asigno un archivo adjunto al mensaje
$mail->AddAttachment("archivo.doc");
// Envío el mensaje y compruebo que haya sido correcto
if(!$mail->Send()) {
echo "Error al enviar el mensaje: " . $mail->ErrorInfo;
} else {
echo "Mensaje enviado!!";
}
?>
Siguiente paso
Hay un ejemplo que nos dejamos en el tintero que creo que merece la pena tratar de manera independiente: el envío de email desde PHP, pero usando un servidor SMTP distinto del que tengas configurado en tu php.ini.
No obstante, el ejemplo de envío de email usando los servidores de envío de Gmail es interesante porque ilustra una de las necesidades que podemos tener en algunos casos, como es el uso de un servidor SMTP que requiera autenticación.
La idea es bien simple, usar los datos de una cuenta de correo Gmail para enviar los mensajes, indicando en PHPMailer los datos de esa cuenta de Google que vas a usar.
require_once('../class.phpmailer.php');
$mail = new PHPMailer();
//indico a la clase que use SMTP
$mail>IsSMTP();
//permite modo debug para ver mensajes de las cosas que van ocurriendo
$mail>SMTPDebug = 2;
//Debo de hacer autenticación SMTP
$mail>SMTPAuth = true;
$mail>SMTPSecure = "ssl";
//indico el servidor de Gmail para SMTP
$mail>Host = "smtp.gmail.com";
//indico el puerto que usa Gmail
$mail>Port = 465;
//indico un usuario / clave de un usuario de gmail
$mail>Username = "tu_correo_electronico_gmail@gmail.com";
$mail>Password = "tu clave";
$mail>SetFrom('tu_correo_electronico_gmail@gmail.com', 'Nombre completo');
$mail>AddReplyTo("tu_correo_electronico_gmail@gmail.com","Nombre completo");
$mail>Subject = "Envío de email usando SMTP de Gmail";
$mail>MsgHTML("Hola que tal, esto es el cuerpo del mensaje!");
//indico destinatario
$address = "destinatario@delcorreoe.com";
$mail>AddAddress($address, "Nombre completo");
if(!$mail>Send()) {
echo "Error al enviar: " . $mail>ErrorInfo;
} else {
echo "Mensaje enviado!";
}
Solo llamar la atención sobre el tema del «debug» del servicio SMTP $mail>SMTPDebug = 2; Con esto le indicamos que nos muestre mensajes del proceso de comunicación con el servidor SMTP que estemos usando, así como posibles errores. Podríamos colocarle también como valor el número 1, para decirle que solo nos muestre mensajes de error encontrados. O bien, si no asignamos nada en la propiedad SMTPDebug, no nos mostrará ningún mensaje adicional a los que PHPMailer ya muestra de manera predeterminada.
Mediante un script similar también podríamos enviar email desde PHP usando servidores SMTP de otros proveedores gratuitos como Hotmail (ahora Outlook.com) o el que tengas. Simplemente tienes que saber los datos de configuración de ese servicio (dirección de email, servidor de SMTP, usuario y clave, así como el puerto). Simplemente se trataría de indicar todos datos de esa cuenta de correo que pretendes usar.

