Guía de PHPMailer: Configuración, Setup SMTP y Envío de Emails

On febrero 07, 2025
14min read
Dmitriy Shcherbakan Full Stack Developer @Railsware
Ivan Djuric, an author at Mailtrap
Ivan Djuric Technical Content Writer @Mailtrap

Cuando se trata de añadir funcionalidad de email a su app PHP, la clase PHPMailer es la opción ganadora.

En este artículo, describiré el proceso de instalar PHPMailer, configurar los ajustes SMTP y añadir la funcionalidad de envío de emails a su app, paso a paso.

Para ir directo a la acción, haga clic aquí.

Los snippets de código que proporciono en este artículo son para PHPMailer 6.9, que es compatible con PHP 5.5 y versiones superiores.

¿Listo para enviar tus emails?
Prueba Mailtrap Gratis

¿Qué es PHPMailer?

PHPMailer es la biblioteca clásica de open-source para enviar emails en PHP. Es compatible con la mayoría de frameworks PHP, como Laravel y Symfony y es utilizada por muchos proyectos de open-source como WordPress. También soporta múltiples formas de enviar mensajes de email, incluyendo la más confiable, envío directo a servidores SMTP, y función PHP mail(), Sendmail, y qmail.

Algunas de las características más importantes de PHPMailer incluyen:

  • Autenticación SMTP
  • Validación automática de direcciones de email
  • Protección contra ataques de inyección de encabezados
  • Soporte para protocolos TLS y SSL
  • Soporte para firma DKIM y S/MIME
  • Soporte para imágenes incrustadas
  • Soporte para añadir archivos adjuntos, incluyendo inline
  • Múltiples formatos, archivos adjuntos de tipo string y binarios
  • Emails multipart/alternative para clientes que no leen email HTML
  • Soporte para enviar emails con múltiples direcciones To, CC, BCC, y Reply-to

Cómo instalar PHPMailer

Para instalar PHPMailer, necesitará Composer, un gestor de dependencias para PHP, recomendado por los creadores de PHPMailer en GitHub.

Una vez instalado, añada esta línea a su archivo composer.json:

"phpmailer/phpmailer": "^6.9"

O ejecute el siguiente comando:

composer require phpmailer/phpmailer

Nota:

  • La carpeta vendor y el script vendor/autoload.php no son parte de PHPMailer. En su lugar, son generados por Composer.

Si no es fan de Composer, puede descargar los archivos de PHPMailer con código fuente manualmente y copiar el contenido de la carpeta en un directorio include_path especificado en su configuración PHP y cargar cada archivo de clase manualmente, así:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';

Añadir una clase Exception le ayudará a manejar errores y depurarlos. En PHP funciona de manera similar a otros lenguajes de programación. Entonces, sin ella, de haber un error en su código de envío de email, solo verá un mensaje diciendo que la clase Exception no fue encontrada, pero no se le proporcionará ningún detalle sobre cómo depurarlo.

También puede instalar PHPMailer solo con los archivos vitales. Los archivos PHP clave para incluir son src/PHPmailer.php y src/SMTP.php si está usando SMTP. También necesitará src/OAuth.php si está usando XOAUTH2 y las dependencias para los servicios con los que desea autenticarse. Y puede omitir la carpeta de idiomas si está bien con los errores sólo en inglés.

Para más información sobre la instalación de PHPMailer, puede consultar el manual oficial de instalación.

Configuración SMTP de PHPMailer

Enviar emails con PHPMailer está más optimizado cuando se combina con un servidor SMTP externo. Esto lo hace confiable y seguro, ya que puede ser encriptado (TLS/SSL), haciéndolo la opción ideal para su aplicación PHP.

Revise la configuración SMTP básica en el ejemplo a continuación:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Ajuste la ruta según sea necesario si no está usando Composer

$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->isSMTP();                                            // Enviar usando SMTP
    $mail->Host       = 'smtp.ejemplo.com';                     // Configura el servidor SMTP para enviar
    $mail->SMTPAuth   = true;                                   // Habilitar autenticación SMTP
    $mail->Username   = 'su_email@ejemplo.com';               // Usuario SMTP
    $mail->Password   = 'su_contraseña';                        // Contraseña SMTP
    $mail->SMTPSecure = 'tls'; // Habilitar encriptación TLS
    $mail->Port       = 587;                                    // Puerto TCP para conectar

Una vez que tenga sus detalles y credenciales SMTP, todo lo que tiene que hacer es: reemplazar los marcadores de posición de este código con ellos, lo cual le mostraré cómo hacer en el siguiente capítulo.

Cómo enviar emails usando PHPMailer y SMTP

Para enviar emails usando PHPMailer, elegí el SMTP de Email API/SMTP de Mailtrap ya que ofrece altas tasas de entrega por diseño. Además, Mailtrap me permite probar los emails antes de enviarlos (describiré esto más adelante en el artículo) y es super fácil de configurar.

Así es como funciona:

  • Navegue a la ventana SMTP/API Settings bajo Sending Domains, donde encontrará las credenciales SMTP. Tenga en cuenta que el envío usando API no funciona con PHPMailer.
Captura de pantalla de Configuración SMTP/API de Mailtrap.
  • Copie y pegue las credenciales del Transactional Stream en su script PHP.

Y finalmente, así es como puede enviar un email de texto plano con sus credenciales SMTP de Mailtrap:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Ajuste según su método de instalación

$mail = new PHPMailer(true); // Habilitar excepciones

// Configuración SMTP
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io'; // Su servidor SMTP
$mail->SMTPAuth = true;
$mail->Username = 'su_usuario'; // Su usuario de Mailtrap
$mail->Password = 'su_contraseña'; // Su contraseña de Mailtrap
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

// Configuración de remitente y destinatario
$mail->setFrom('desde@ejemplo.com', 'Nombre Remitente');
$mail->addAddress('destinatario@ejemplo.com', 'Nombre Destinatario');

// Enviando email de texto plano
$mail->isHTML(false); // Establecer formato de email a texto plano
$mail->Subject = 'Su Asunto Aquí';
$mail->Body    = 'Este es el cuerpo del mensaje en texto plano';

// Enviar el email
if(!$mail->send()){
    echo 'El mensaje no pudo ser enviado. Error de Mailer: ' . $mail->ErrorInfo;
} else {
    echo 'El mensaje ha sido enviado';
}

Asegúrese de que su método isHTML esté configurado como false para enviar emails de texto plano.

Enviar emails HTML

Profundice en la personalización de email HTML en PHP consultando nuestro artículo dedicado.

Para enviar un email HTML, solo establezca la propiedad isHTML como (true), como en el ejemplo a continuación:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/composer/vendor/autoload.php'; // Asegúrese de que la ruta sea correcta

$mail = new PHPMailer(true); // Pasar `true` habilita las excepciones

try {
    $mail->isSMTP();
    $mail->Host = 'live.smtp.mailtrap.io'; // Su servidor SMTP
    $mail->SMTPAuth = true;
    $mail->Username = 'pegue el generado por Mailtrap'; // Su usuario de Mailtrap
    $mail->Password = 'pegue el generado por Mailtrap'; // Su contraseña de Mailtrap
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;

    // Configuración de remitente y destinatario
    $mail->setFrom('info@mailtrap.io', 'Mailtrap');
    $mail->addReplyTo('info@mailtrap.io', 'Mailtrap');
    $mail->addAddress('destinatario1@mailtrap.io', 'Tim'); // Destinatario principal
    // CC y BCC
    $mail->addCC('cc1@ejemplo.com', 'Elena');
    $mail->addBCC('bcc1@ejemplo.com', 'Alex');
    // Añadiendo más destinatarios BCC
    $mail->addBCC('bcc2@ejemplo.com', 'Anna');
    $mail->addBCC('bcc3@ejemplo.com', 'Mark');
    // Contenido del email
    $mail->isHTML(true); // Establecer formato de email a HTML
    $mail->Subject = "Pruebe SMTP de PHPMailer";
    $mail->Body = '<h1>Enviar Email HTML usando SMTP en PHP</h1><p>Este es un email de prueba que estoy enviando usando el servidor de correo SMTP con PHPMailer.</p>'; // Ejemplo de cuerpo HTML
    $mail->AltBody = 'Esta es la versión en texto plano del contenido del email';
    if(!$mail->send()) {
        echo 'El mensaje no pudo ser enviado.';
        echo 'Error de Mailer: ' . $mail->ErrorInfo;
    } else {
        echo 'El mensaje ha sido enviado';
    }
} catch (Exception $e) {
    echo "El mensaje no pudo ser enviado. Error de Mailer: {$mail->ErrorInfo}";
}
?>

Cómo enviar emails a múltiples destinatarios

Para enviar emails a múltiples destinatarios, puede usar el siguiente snippet de código:

<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = '1a2b3c4d5e6f7g'; //generado por Mailtrap
$mail->Password = '1a2b3c4d5e6f7g'; //generado por Mailtrap
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->SMTPKeepAlive = true; // agrégalo para mantener la conexión SMTP abierta después de cada email enviado
$mail->setFrom('lista@ejemplo.com', 'Gestor de lista');
$mail->Subject = "Nueva lista de email de Mailtrap";
$users = [
  ['email' => 'max@gmail.com', 'name' => 'Max'],
  ['email' => 'box@ejemplo.com', 'name' => 'Bob']
];
foreach ($users as $user) {
  $mail->addAddress($user['email'], $user['name']);
  $mail->Body = "<h2>¡Hola, {$user['name']}!</h2> <p>¿Cómo está?</p>";
  $mail->AltBody = "¡Hola, {$user['name']}! \n ¿Cómo está?";
  try {
      $mail->send();
      echo "Mensaje enviado a: ({$user['email']}) {$mail->ErrorInfo}\n";
  } catch (Exception $e) {
      echo "Error de Mailer ({$user['email']}) {$mail->ErrorInfo}\n";
  }
  $mail->clearAddresses();
}
$mail->smtpClose();

Enviar emails con archivos adjuntos

Para enviar emails con archivos adjuntos, puede:

  • Adjuntar un archivo desde su sistema de archivos

Si elige esta opción, asegúrese de guardar sus archivos en el mismo directorio que el script.

Para adjuntar un archivo, sólo especifique su ruta de archivo. También puede añadir un nombre de archivo, pero eso dependerá de usted, ya que el script usará el nombre real de su archivo:

$mail->addAttachment('path/to/facutra1.pdf', 'factura1.pdf');

Cuando llama a este script, PHPMailer adjunta el archivo ubicado en ruta/a/factura1.pdf al email. El segundo parámetro, factura1.pdf, es opcional y especifica el nombre del archivo. Para este ejemplo, usé .pdf, pero tenga en cuenta que también puede añadir otros tipos de archivos, como imágenes (.jpg o .png) por ejemplo.

Para añadir otro archivo, simplemente repita el comando:

$mail->addAttachment('ruta/a/calculo1.xlsx', 'calculo1.xlsx');
  • Añadir un archivo adjunto de tipo string

Al añadir un archivo adjunto de tipo string, adjunta datos sin tener que guardarlos primero como un archivo físico en su sistema. En otras palabras, los datos que adjunta se almacenan en una variable. Por ejemplo, esto le permite extraer un archivo de una base de datos, como BLOB (Binary Large Object), sin necesidad de guardarlo como archivo.

Para esto, puede usar el siguiente comando:

$mysql_data = $mysql_row['blob_data'];
$mail->addStringAttachment($mysql_data, 'datos_db.db');

Este ejemplo añade datos almacenados como BLOB desde una base de datos MySQL.

También puede usar una URL remota, así:

$mail->addStringAttachment(file_get_contents($url), 'mi_archivo.pdf');

Enviar emails con imágenes incrustadas

Para enviar emails con imágenes incrustadas, puede usar CID attachments:

$mail->addEmbeddedImage('ruta/a/archivo_de_imajen.jpg', 'image_cid');
$mail->isHTML(true);
$mail->Body = '<img src="cid:image_cid">';

Y así es como se ve en un snippet de código completo:

<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';

$mail = new PHPMailer(true); // Habilita excepciones

$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = 'pegue uno generado por Mailtrap';
$mail->Password = 'pegue uno generado por Mailtrap';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('desde@ejemplo.com', 'Nombre y Apellido');
$mail->addReplyTo('paraquien@ejemplo.com', 'John Doe');
$mail->addAddress('destinatario@ejemplo.com', 'Nombre del Destinatario'); // Especifique el destinatario
$mail->isHTML(true);
$mail->Subject = "Pruebe SMTP de PHPMailer";
$mail->addEmbeddedImage('ruta/a/archivo_de_imajen.jpg', 'image_cid'); // Especifique la ruta de su imagen y un CID
$mail->Body = 'Cuerpo del email en HTML'; // Use el CID como atributo src en su etiqueta img
$mail->AltBody = 'Esta es la versión en texto plano del contenido del email';
if(!$mail->send()){
    echo 'No se pudo enviar el mensaje.';
    echo 'Error del Mailer: ' . $mail->ErrorInfo;
}else{
    echo 'El mensaje ha sido enviado';
}

El resultado “El mensaje ha sido enviado” le informa que su código se está ejecutando correctamente. Para verificar el resultado de la entrega y los detalles, vaya a su inbox de Mailtrap: sus mensajes llegarán allí en segundos.

Pruebe SMTP de PHPMailer

Envío asincrónico de emails

A diferencia de Node.js, que soporta operaciones asincrónicas, PHPMailer es sincrónico por diseño. Sin embargo, puede usar la función exec() para llamar a un script PHP para enviar email en segundo plano.

Primero, instale el PHP CLI (Command Line Interface) y luego use el siguiente script sendEmail.php:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/vendor/autoload.php'; // Ajuste la ruta según sea necesario

$mail = new PHPMailer(true);

// Configuración SMTP
$mail->isSMTP();
$mail->Host = 'smtp.ejemplo.com'; // Especifique servidores SMTP
$mail->SMTPAuth = true; // Habilite autenticación SMTP
$mail->Username = 'usuario@ejemplo.com'; // Usuario SMTP
$mail->Password = 'secreto'; // Contraseña SMTP
$mail->SMTPSecure = 'tls'; // Habilite encriptación TLS, también se acepta `ssl`
$mail->Port = 587; // Puerto TCP para conectar

// Configuración del Email
$mail->setFrom('desde@ejemplo.com', 'Remitente');
$mail->addAddress('destinatario@ejemplo.com', 'Nombre Destinatario'); // Agregue un destinatario
$mail->isHTML(true); // Establezca formato de email a HTML
$mail->Subject = 'Aquí está el asunto';
$mail->Body    = 'Este es el cuerpo del mensaje HTML <b>en negrita!</b>';
$mail->AltBody = 'Este es el cuerpo en texto plano para clientes de email que no aceptan HTML';

try {
    $mail->send();
    echo 'El mensaje ha sido enviado';
} catch (Exception $e) {
    echo "No se pudo enviar el mensaje. Error del Mailer: {$mail->ErrorInfo}";
}

Para ejecutar el script, use el siguiente comando:

exec("php /path/to/sendEmail.php > /dev/null &");

Notas:

  • Asegúrese de que la ruta al ejecutable PHP CLI (php) esté correctamente especificada.
    • En algunos casos y entornos, podría tener que usar la ruta completa al binario CLI (por ejemplo, /usr/bin/php).
  • Revise la configuración PHP de su servidor para asegurarse de que funciones como exec() no estén deshabilitadas, como suele ocurrir en entornos de shared hosting por razones de seguridad.
    • La directiva que controla esto es la directiva disable_functions en php.ini.

Cómo enviar emails masivos

Para enviar emails a muchos destinatarios simultáneamente en PHPMailer, uso las credenciales del Bulk Stream de Mailtrap.

Puede encontrarlas después de iniciar sesión en su cuenta de Mailtrap y navegar a Sending Domainspestaña SMTP/API Settings. A la derecha, debería ver las credenciales del Transactional Stream.

Luego, simplemente inserte las credenciales en el siguiente script para enviar email masivo:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Ruta al archivo autoload de Composer

$mail = new PHPMailer(true);

try {
    //Configuración del servidor
    $mail->isSMTP();
    $mail->Host       = 'bulk.smtp.mailtrap.io'; // Establezca el servidor SMTP para enviar
    $mail->SMTPAuth   = true;               // Habilite autenticación SMTP
    $mail->Username   = 'su_usuario_smtp'; // Usuario SMTP
    $mail->Password   = 'su_contraseña_smtp'; // Contraseña SMTP
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Habilite encriptación TLS
    $mail->Port       = 587; // Puerto TCP para conectar

    // Dirección del remitente y responder a
    $mail->setFrom('desde@ejemplo.com', 'Remitente');
    $mail->addReplyTo('responder@ejemplo.com', 'Remitente');

    // Contenido
    $mail->isHTML(true); // Establezca formato de email a HTML
    
    // Lista de destinatarios
    $recipients = [
        ['email' => 'persona1@ejemplo.com', 'name' => 'Persona Uno'],
        ['email' => 'persona2@ejemplo.com', 'name' => 'Persona Dos'],
        // AAgregue más destinatarios según sea necesario
    ];

    foreach ($recipients as $recipient) {
        $mail->addAddress($recipient['email'], $recipient['name']); // Agregue un destinatario

        // Personalice el mensaje
        $mail->Subject = 'Aquí está el asunto';
        $mail->Body    = 'Este es el cuerpo del mensaje HTML <b>en negrita!</b>';
        $mail->AltBody = 'Este es el cuerpo en texto plano para clientes de email que no aceptan HTML';

        $mail->send();
        $mail->clearAddresses(); // Limpie las direcciones para la siguiente iteración
    }

    echo 'Los mensajes han sido enviados';
} catch (Exception $e) {
    echo "No se pudo enviar el mensaje. Error del Mailer: {$mail->ErrorInfo}";
}

Este script le permite enviar emails a múltiples destinatarios sin abrir y cerrar la conexión SMTP para cada email, lo cual es mucho más eficiente que crear una nueva instancia de PHPMailer para cada email, por ejemplo.

Sin embargo, si planea enviar un gran volumen de emails, podría querer usar un sistema de fila de trabajos como RabbitMQ, Beanstalkd, Redis u otros.

Con fines explicativos, le mostraré cómo hacerlo con RabbitMQ.

Pero primero, instalemos una librería PHP para ello vía Composer:

composer require php-amqplib/php-amqplib

Luego, el script productor de trabajos publicará emails en una fila de RabbitMQ:

require 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'usuario', 'contraseña');
$channel = $connection->channel();

$channel->queue_declare('emailQueue', false, true, false, false);

$emailData = [
    'email' => 'destinatario@ejemplo.com',
    'subject' => 'Email de Prueba',
    'body' => 'Este es el cuerpo del email de prueba.'
];

$msg = new AMQPMessage(json_encode($emailData), ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'emailQueue');

echo " [x] Enviado 'Trabajo de Email'\n";

$channel->close();
$connection->close();

Y por último, el script trabajador consumirá los mensajes de la fila y enviará emails:

require 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTPException;

$connection = new AMQPStreamConnection('localhost', 5672, 'usuario', 'contraseña');
$channel = $connection->channel();

$channel->queue_declare('emailQueue', false, true, false, false);

echo " [*] Esperando mensajes. Para salir presione CTRL+C\n";

$logFile = 'email_log.txt'; // Ruta a su archivo de registro

$callback = function ($msg) use ($logFile) {
    echo " [x] Recibido ", $msg->body, "\n";
    $emailData = json_decode($msg->body, true);

    $mail = new PHPMailer(true);
    try {
        // Configurar ajustes SMTP
        $mail->isSMTP();
        // Su configuración SMTP aquí

        $mail->setFrom('desde@ejemplo.com', 'Remitente');
        $mail->addAddress($emailData['email']); // Email del destinatario desde los datos del trabajo

        $mail->isHTML(true); // Formato de email a HTML
        $mail->Subject = $emailData['subject'];
        $mail->Body    = $emailData['body'];

        $mail->send();
        echo "Email enviado a {$emailData['email']}\n";
        
        // Registre el envío exitoso de email
        file_put_contents($logFile, "Email enviado exitosamente a {$emailData['email']} en " . date('Y-m-d H:i:s') . "\n", FILE_APPEND);
    } catch (Exception $e) {
        echo "No se pudo enviar el email. Error del Mailer: {$mail->ErrorInfo}\n";
        // Registre errores generales
        file_put_contents($logFile, "Falló el envío de email a {$emailData['email']} en " . date('Y-m-d H:i:s') . ". Error: {$mail->ErrorInfo}\n", FILE_APPEND);
    } catch (SMTPException $e) {
        echo "Error SMTP: {$mail->ErrorInfo}\n";
        // Registre errores específicos de SMTP
        file_put_contents($logFile, "Error SMTP al enviar email a {$emailData['email']} en " . date('Y-m-d H:i:s') . ". Error: {$mail->ErrorInfo}\n", FILE_APPEND);
    }

    $msg->ack();
};

$channel->basic_qos(null, 1, null);
$channel->basic_consume('emailQueue', '', false, false, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();

Tips

  • Reemplace valores placeholder como localhost, 5672, usuario, contraseña, y emailQueue con sus detalles reales de RabbitMQ y nombre de fila.
  • También considere un administrador de procesos como, por ejemplo, Supervisor para asegurarse de que su script trabajador siempre esté ejecutándose y se reinicie automáticamente cuando falle.
  • El script trabajador necesita sus detalles específicos de configuración SMTP; en este caso, son sus credenciales del Bulk Stream.

Debugging de PHPMailer

Si experimenta algunos problemas al enviar emails a través de un servidor SMTP, el comando SMTPDebug le ayudará a explorar esos errores y descubrir qué es lo que debería ser arreglado.

Habilite la depuración SMTP y establezca el nivel de debug en su script de la siguiente manera:

$mail->SMTPDebug = 2;
  • nivel 1 = cliente; le mostrará mensajes enviados por el cliente
  • nivel 2 = cliente y servidor; agregará mensajes del servidor, es la configuración recomendada
  • nivel 3 = cliente, servidor y conexión; agregará detalles sobre la información inicial, que podría ser útil para descubrir fallos de STARTTLS
  • nivel 4 = información de bajo nivel

Ejemplo 1. Hostname SMTP inválido

2018-12-12 14:51:32	Connection: opening to mailtrap.io:587, timeout=10, options=array()
2018-12-12 14:51:42	Connection failed. Error #2: stream_socket_client(): unable to connect to mailtrap.io:587 (Operation timed out) [/Users/xxxx/Downloads/PHPMailer/src/SMTP.php line 326]
2018-12-12 14:51:42	SMTP ERROR: Failed to connect to server: Operation timed out (60)
2018-12-12 14:51:42	SMTP connect() failed.

Para este ejemplo, ingresé un hostname inválido: mailtrap.io en lugar de live.smtp.mailtrap.io. e instantáneamente recibí un mensaje de que había ocurrido un error en la primera etapa de comunicación con el servidor.

Ejemplo 2. Credenciales inválidas

2018-12-12 14:49:26	Connection: opening to live.smtp.mailtrap.io:587, timeout=300, options=array()
2018-12-12 14:49:26	Connection: opened
2018-12-12 14:49:26	SMTP INBOUND: "220 mailtrap.io ESMTP ready"
2018-12-12 14:49:26	SERVER -> CLIENT: 220 mailtrap.io ESMTP ready
...
2018-12-12 14:49:30	SMTP INBOUND: "535 5.7.0 Invalid login or password"
2018-12-12 14:49:30	SERVER -> CLIENT: 535 5.7.0 Invalid login or password
2018-12-12 14:49:30	SMTP ERROR: Username command failed: 535 5.7.0 Invalid login or password
2018-12-12 14:49:30	SMTP Error: Could not authenticate.
2018-12-12 14:49:30	CLIENT -> SERVER: QUIT
2018-12-12 14:49:30	SMTP INBOUND: "221 2.0.0 Bye"
2018-12-12 14:49:30	SERVER -> CLIENT: 221 2.0.0 Bye
2018-12-12 14:49:30	Connection: closed
2018-12-12 14:49:30	SMTP connect() failed.
Mailer Error: SMTP connect() failed.

Aquí, demuestro dónde ocurre el error: ahora el SMTP, su hostname y puerto son válidos pero no se encontró una combinación de login y contraseña, así que debe verificar y modificar sus credenciales.

Hay un par de artículos detallados en GitHub sobre debugging y troubleshooting, consúltelos cuando necesite profundizar en estos temas. Y si está viendo el famoso SMTP Error: Could not connect to SMTP host, hay una sección dedicada para resolver este problema.

Pruebe sus emails y el envío de emails en un entorno de staging

Enviar sus emails sin probarlos previamente sería como ir de viaje sin revisar si ha empacado todo. Imagínese encontrarse en la terminal del aeropuerto solo para darse cuenta de que olvidó su pasaporte en el check-in. 🛂

Algo así puede suceder con sus emails si no los prueba antes de enviarlos. Por ejemplo, podrían estar saltándose las bandejas de entrada o siendo marcados como spam, su HTML podría no estar renderizándose correctamente en todos los clientes de email, sus variables de personalización podrían estar desalineadas, etc.

Afortunadamente, lo hemos cubierto con la solución holística de Email Testing de Mailtrap.

Email Testing de Mailtrap le permite capturar el tráfico en entornos de staging y desarrollo para luego previsualizar y analizar su HTML/CSS antes de enviarlos.

Función HTML Check de Email Testing de Mailtrap

También está el Spam Report, que puede ayudarle a resolver potenciales problemas de email deliverability si mantiene su puntaje de spam por debajo de 5.

Función de Análisis de Spam de Email Testing de Mailtrap

Dicho esto, permítame mostrarle cómo funciona.

Para probar sus emails con un servidor SMTP falso, diríjase a Email TestingInboxesSMTP Settings y seleccione PHPMailer en la lista de Integrations.

Credenciales SMTP de Email Testing de Mailtrap

Luego, simplemente pegue la configuración en su script de PHPMailer, que debería verse algo así:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$phpmailer = new PHPMailer(true); // Cree una nueva instancia de PHPMailer

try {
    // Configuración SMTP para Mailtrap
    $phpmailer->isSMTP(); // Configure mailer para usar SMTP
    $phpmailer->Host = 'sandbox.smtp.mailtrap.io'; // Especifique servidores SMTP principal y de respaldo
    $phpmailer->SMTPAuth = true; // Habilite autenticación SMTP
    $phpmailer->Username = '1234567891234'; // Usuario SMTP
    $phpmailer->Password = '1234567891234'; // Contraseña SMTP
    $phpmailer->Port = 587; // Puerto TCP para conectar

    // Configuración del contenido del email
    $phpmailer->setFrom('su_email@ejemplo.com', 'Remitente');
    $phpmailer->addAddress('destinatario@ejemplo.com', 'Joe User'); // Agregue un destinatario
    $phpmailer->isHTML(true); // Establezca el formato de email a HTML
    $phpmailer->Subject = 'Aquí está el asunto';
    $phpmailer->Body    = 'Este es el cuerpo del mensaje HTML <b>en negrita!</b>';
    $phpmailer->AltBody = 'Este es el cuerpo en texto plano para clientes de email que no aceptan HTML';

    $phpmailer->send(); // Envíe el email
    echo 'El mensaje ha sido enviado';
} catch (Exception $e) {
    echo "No se pudo enviar el mensaje. Error del Mailer: {$phpmailer->ErrorInfo}";
}
?>

Pro tip:

  • También puede usar las credenciales SMTP de Mailtrap para probar emails con PHPMailer en localhost y obtener funcionalidad extra.

Para concluir

En este tutorial, he cubierto los casos de uso de PHPMailer más comunes, desde crear HTML emails con imágenes y adjuntos, hasta enviarlos con o sin SMTP, ¡y más!

Esperamos que pueda usar este artículo como su guía de referencia para agregar la funcionalidad de email a su aplicación.

Sin embargo, si está buscando otros casos de uso, eche un vistazo a la “carpeta de ejemplos” dentro de la documentación de PHPMailer en Github, o revise nuestro blog, donde puede encontrar artículos como:

Además, si es un estudiante visual, ¡asegúrese de revisar nuestro canal de YouTube y vea cómo enviar emails usando PHP!

Article by Dmitriy Shcherbakan Full Stack Developer @Railsware
Ivan Djuric, an author at Mailtrap
Article by Ivan Djuric Technical Content Writer @Mailtrap

I’m a Technical Content Writer with 5 years of background covering email-related topics in tight collaboration with software engineers and email marketers. I just love to research and share actionable insights with you about email sending, testing, deliverability improvements, and more. Happy to be your guide in the world of emails!