PHP permite enviar correos electrónicos de distintas formas, pero cuando una aplicación necesita utilizar un servidor SMTP autenticado, una de las opciones más habituales es hacerlo mediante PHPMailer.
PHPMailer simplifica tareas como la autenticación SMTP, el cifrado de la conexión, los mensajes HTML, los adjuntos o el tratamiento de errores.
En este ejemplo veremos cómo instalarlo mediante Composer y configurar un envío SMTP básico sin utilizar código heredado de versiones antiguas de la librería.
¿Por qué enviar correo mediante SMTP?
PHP dispone de la función mail(), pero su funcionamiento depende de la configuración del servidor donde se ejecuta la aplicación y de que exista un sistema de correo correctamente preparado para entregar los mensajes.
En muchos proyectos resulta más práctico conectarse directamente a un servidor SMTP conocido y autenticarse con las credenciales o mecanismo autorizado por el proveedor.
Esto permite controlar de forma explícita qué servidor realiza el envío y detectar mejor posibles errores durante la conexión.
Sin embargo, utilizar SMTP no garantiza que el mensaje llegue a la bandeja de entrada. La entregabilidad también depende de la configuración del dominio, SPF, DKIM, DMARC, reputación del remitente y políticas antispam del destinatario.
Instalar PHPMailer con Composer
La forma recomendada de incorporar PHPMailer actualmente es mediante Composer.
Desde el directorio del proyecto ejecutamos:
composer require phpmailer/phpmailer
Composer descargará la librería y gestionará sus dependencias.
Después podemos cargarla utilizando el autoloader:
require __DIR__ . '/vendor/autoload.php';
Esto sustituye a métodos antiguos basados en descargar manualmente PHPMailer, copiar sus clases al servidor e incluir archivos como class.phpmailer.php.
Ejemplo de envío SMTP con PHPMailer
Un ejemplo básico podría ser el siguiente:
<?php
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\PHPMailer;
require __DIR__ . '/vendor/autoload.php';
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = getenv('SMTP_HOST');
$mail->SMTPAuth = true;
$mail->Username = getenv('SMTP_USER');
$mail->Password = getenv('SMTP_PASS');
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->CharSet = 'UTF-8';
$mail->setFrom(
getenv('SMTP_FROM'),
'Mi aplicación'
);
$mail->addAddress(
'destinatario@ejemplo.com',
'Destinatario'
);
$mail->isHTML(true);
$mail->Subject = 'Mensaje enviado por SMTP';
$mail->Body = '
<h2>Hola</h2>
<p>Este mensaje se ha enviado desde PHP mediante SMTP.</p>
';
$mail->AltBody =
'Este mensaje se ha enviado desde PHP mediante SMTP.';
$mail->send();
echo 'Mensaje enviado correctamente';
} catch (Exception $e) {
error_log($mail->ErrorInfo);
echo 'No se ha podido enviar el mensaje';
}
Los valores de SMTP_HOST, SMTP_USER, SMTP_PASS y SMTP_FROM deben corresponder a los datos proporcionados por nuestro servicio de correo.
En este ejemplo los obtenemos mediante variables de entorno en lugar de escribir las credenciales directamente dentro del código.
Host, usuario y contraseña SMTP
El servidor SMTP depende del proveedor utilizado.
El parámetro:
$mail->Host
indica el nombre del servidor al que PHPMailer debe conectarse.
Username identifica la cuenta utilizada para autenticarse y Password contiene la credencial necesaria cuando el proveedor admite este mecanismo.
No es recomendable dejar una contraseña directamente escrita en un archivo PHP:
$mail->Password = 'mi-contraseña-real';
especialmente si el proyecto utiliza Git u otro sistema de control de versiones.
Las credenciales deberían almacenarse fuera del código fuente mediante variables de entorno, un gestor de secretos o el mecanismo de configuración seguro utilizado por la aplicación.
Puerto 587 con STARTTLS o 465 con SMTPS
Dos configuraciones habituales para SMTP cifrado son STARTTLS sobre el puerto 587 y TLS implícito o SMTPS sobre el puerto 465.
Con STARTTLS podemos utilizar:
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587;
Si el proveedor requiere SMTPS:
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465;
PHPMailer documenta ambas configuraciones en sus ejemplos SMTP.
No debemos elegir un puerto arbitrariamente. Hay que utilizar el servidor, puerto y método de cifrado especificados por nuestro proveedor de correo.
Remitente y dirección de respuesta
El remitente se configura mediante:
$mail->setFrom('web@ejemplo.com', 'Mi web');
Hay proveedores que solo permiten utilizar como remitente la propia cuenta autenticada o alguno de sus alias autorizados.
Un error frecuente en los formularios de contacto consiste en utilizar como From la dirección introducida por el visitante.
Por ejemplo, no deberíamos hacer directamente:
$mail->setFrom($_POST['email']);
Esto puede provocar problemas de autenticación y políticas SPF.
Una opción más adecuada es utilizar como remitente una dirección autorizada de nuestro dominio y colocar el correo del usuario como dirección de respuesta:
$mail->setFrom('web@ejemplo.com', 'Formulario web');
$mail->addReplyTo($emailUsuario);
_x000D_ Así el mensaje sale desde una identidad autorizada, pero al pulsar Responder podremos dirigir la contestación al usuario._x000D_
Mensajes HTML y versión de texto
Si enviamos contenido HTML podemos indicarlo con:
$mail->isHTML(true);
y asignar el contenido a:
$mail->Body
_x000D_ También resulta conveniente proporcionar una versión en texto mediante:_x000D_
$mail->AltBody
_x000D_ De esta forma el mensaje dispone de una alternativa para clientes o situaciones donde el HTML no se procese._x000D_
Qué ocurre con Gmail o Microsoft 365
No todos los proveedores permiten actualmente autenticarse simplemente con usuario y contraseña.
Google admite escenarios con OAuth y, en determinadas cuentas con verificación en dos pasos, contraseñas de aplicación. PHPMailer mantiene ejemplos específicos tanto para SMTP tradicional como para OAuth.
En Microsoft 365 también debemos revisar la configuración antes de utilizar SMTP AUTH. Microsoft recomienda utilizar autenticación moderna mediante OAuth y permite controlar SMTP AUTH por organización y por buzón.
Además, Microsoft ha anunciado la retirada progresiva de la autenticación básica para SMTP AUTH. Según el calendario actualizado en enero de 2026, a finales de diciembre de 2026 quedará deshabilitada por defecto en los tenants existentes, aunque durante esa fase un administrador podrá volver a habilitarla cuando sea necesario.
Por eso, para nuevas integraciones con Microsoft 365 no conviene diseñar una solución que dependa a largo plazo únicamente de usuario y contraseña.
Cómo diagnosticar errores SMTP
_x000D_ PHPMailer permite activar información de depuración durante el desarrollo:_x000D_
use PHPMailer\PHPMailer\SMTP; $mail->SMTPDebug = SMTP::DEBUG_SERVER;
Esto muestra la conversación entre la aplicación y el servidor SMTP y puede ayudar a detectar problemas de conexión, autenticación o cifrado.
No deberíamos dejar este nivel de depuración visible en producción, porque puede revelar información técnica que no queremos mostrar a los usuarios.
PHPMailer dispone además de una guía específica de resolución de problemas SMTP.
SMTP autenticado no garantiza la entregabilidad
Conseguir que PHPMailer devuelva un envío correcto significa que el servidor SMTP ha aceptado el mensaje. No significa necesariamente que el correo vaya a acabar en la bandeja de entrada del destinatario.
Si los mensajes llegan a spam o son rechazados, tendremos que revisar también la configuración del dominio y del servicio de correo.
SPF, DKIM y DMARC, la reputación del dominio y de la IP de envío, el contenido del mensaje y la política del servidor receptor influyen en el resultado.
Por tanto, el envío mediante PHP y SMTP es solo una parte del sistema de correo.
Una base sencilla para enviar correos desde PHP
Para la mayoría de proyectos no es necesario programar manualmente toda la comunicación SMTP.
PHPMailer proporciona una capa mantenida específicamente para esta tarea y permite trabajar con autenticación, cifrado, mensajes HTML y diferentes mecanismos de autenticación.
La configuración concreta debe adaptarse al proveedor utilizado y, especialmente en servicios como Microsoft 365 o Gmail, conviene comprobar qué mecanismos modernos de autenticación están disponibles antes de desarrollar la integración.