Artículo original de julio de 2003. Actualizado en mayo de 2026 por David Carrero. El artículo original referenciaba PHPMailer v1.x con instalación manual de archivos PHP y ejemplos con hotpop.com, un servicio de correo gratuito que desapareció hace años. La versión actual de PHPMailer es la 6.x, se instala con Composer y usa TLS/STARTTLS por defecto.
¿Por qué no basta con mail() de PHP?
La función mail() de PHP existe desde la versión 3 y hace lo mínimo: entrega un mensaje al servidor de correo configurado en el sistema. No soporta adjuntos de forma nativa, no hace autenticación SMTP, no gestiona listas de destinatarios, no tiene reintentos ni logging. Para aplicaciones reales, se queda corta.
PHPMailer lleva resolviendo ese problema desde 2001. Hoy es la biblioteca de envío de email más usada en PHP (más de 500 millones de descargas vía Packagist), mantiene compatibilidad con PHP 5.5+ y soporta SMTP con autenticación, TLS/SSL, HTML, adjuntos, cuerpo alternativo en texto plano, firma DKIM y mucho más.
Instalación con Composer (recomendado)
El artículo original de 2003 requería descargar manualmente dos archivos PHP. Hoy la instalación son dos líneas:
composer require phpmailer/phpmailer
Si no tienes Composer en tu proyecto todavía:
curl -sS https://getcomposer.org/installer | php php composer.phar require phpmailer/phpmailer
Esto descarga PHPMailer y sus dependencias en vendor/ y actualiza composer.json. En tu script solo necesitas el autoloader:
<?php require 'vendor/autoload.php'; use PHPMailerPHPMailerPHPMailer; use PHPMailerPHPMailerSMTP; use PHPMailerPHPMailerException;
Ejemplo sencillo: enviar con SMTP autenticado
Este ejemplo envía un email en texto plano usando cualquier servidor SMTP con autenticación. Funciona con Gmail, Outlook, Mailgun, Postmark o tu propio servidor:
<?php
require 'vendor/autoload.php';
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerSMTP;
use PHPMailerPHPMailerException;
$mail = new PHPMailer(true); // true activa las excepciones
try {
// Configuración SMTP
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com'; // o tu servidor SMTP
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'tu_contraseña_de_aplicación';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // puerto 587
$mail->Port = 587;
$mail->CharSet = 'UTF-8';
// Remitente y destinatarios
$mail->setFrom('[email protected]', 'Tu Nombre');
$mail->addAddress('[email protected]', 'Nombre Destinatario');
$mail->addReplyTo('[email protected]', 'Soporte');
// Contenido
$mail->Subject = 'Mensaje de prueba con PHPMailer 6';
$mail->Body = 'Este es el cuerpo del mensaje en texto plano.';
$mail->send();
echo 'Mensaje enviado correctamente';
} catch (Exception $e) {
echo "Error al enviar: {$mail->ErrorInfo}";
}
?>
Con Gmail debes usar una contraseña de aplicación (no tu contraseña normal). Ve a tu cuenta de Google ? Seguridad ? Verificación en dos pasos ? Contraseñas de aplicaciones.
Ejemplo con HTML y adjunto
<?php
require 'vendor/autoload.php';
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.tuservidor.com';
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'contraseña_smtp';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // SSL, puerto 465
$mail->Port = 465;
$mail->CharSet = 'UTF-8';
$mail->setFrom('[email protected]', 'Mi Aplicación');
$mail->addAddress('[email protected]');
// Varios destinatarios
$mail->addCC('[email protected]');
$mail->addBCC('[email protected]'); // copia oculta
// Adjunto
$mail->addAttachment('/ruta/al/fichero/factura.pdf', 'Factura_2026.pdf');
// Mensaje HTML con alternativa en texto plano
$mail->isHTML(true);
$mail->Subject = 'Tu factura del mes de mayo';
$mail->Body = '<h1>Hola</h1><p>Adjuntamos tu factura de mayo. Gracias por confiar en nosotros.</p>';
$mail->AltBody = 'Adjuntamos tu factura de mayo. Gracias por confiar en nosotros.';
$mail->send();
echo 'Email enviado con adjunto';
} catch (Exception $e) {
echo "Error: {$mail->ErrorInfo}";
}
?>
Enviar a múltiples destinatarios desde una lista
<?php
// Envío a una lista de usuarios desde BBDD
$destinatarios = $pdo->query("SELECT email, nombre FROM suscriptores WHERE activo = 1")->fetchAll();
$mail = new PHPMailer(true);
$mail->isSMTP();
// ... configuración SMTP ...
$mail->isHTML(true);
$mail->Subject = 'Nuestra newsletter de mayo';
foreach ($destinatarios as $dest) {
try {
$mail->clearAddresses(); // Limpiar destinatarios del envío anterior
$mail->addAddress($dest['email'], $dest['nombre']);
$mail->Body = "<p>Hola {$dest['nombre']}, ...</p>";
$mail->AltBody = "Hola {$dest['nombre']}, ...";
$mail->send();
} catch (Exception $e) {
error_log("Fallo enviando a {$dest['email']}: {$mail->ErrorInfo}");
}
}
?>
Si tienes listas muy grandes, usa un servicio especializado como Mailgun, Brevo (antes Sendinblue) o Amazon SES. PHPMailer tiene drivers nativos para esos servicios.
Depurar la conexión SMTP
Cuando algo no funciona, activa el modo debug:
<?php $mail->SMTPDebug = SMTP::DEBUG_SERVER; // Muestra toda la comunicación SMTP // SMTP::DEBUG_OFF ? sin output (producción) // SMTP::DEBUG_CLIENT ? solo mensajes del cliente // SMTP::DEBUG_SERVER ? todo (cliente + servidor) útil para diagnosticar ?>
Propiedades principales de PHPMailer 6
Propiedad | Descripción | Valor por defecto |
| Servidor SMTP (varios separados por «;») | localhost |
| Puerto SMTP (587 STARTTLS, 465 SSL, 25 sin cifrar) | 25 |
| Requiere autenticación SMTP | false |
|
| '' |
| Codificación del mensaje | iso-8859-1 |
| Timeout de conexión SMTP en segundos | 300 |
| Ancho de línea del cuerpo en caracteres (0 = sin límite) | 0 |
Métodos principales
Método | Descripción |
| Añade un destinatario |
| Añade destinatario en copia |
| Añade destinatario en copia oculta |
| Añade dirección de respuesta |
| Adjunta un fichero |
| Activa el cuerpo en HTML |
| Limpia destinatarios (para envíos en bucle) |
| Envía el mensaje, lanza |
Para integrar PHPMailer en un formulario de contacto completo con validación, consulta Cómo interactuar con MySQL usando PHP 8 y PDO. Si montas tu propio servidor en Linux, el artículo Montar una web con Apache, PHP 8 y PostgreSQL en Linux te ayuda con la configuración del servidor SMTP.
Imagen: Pexels / luis gomes
