Como enviar correos con PHP usando SMTP


Hace muchos años, enviar un email era muy sencillo, pero con el crecimiento del spam ahora debes de tener muchas precauciones para evitar que los correos que envías terminen en la bandeja de spam o correo no deseado.

La apuesta más segura es utilizar un servidor SMTP de una empresa dedicada a envío de emails, de esta forma te evitas el trabajo de mantener una buena reputación en tu servidor y hacer todo lo necesario para tus correos puedan llegar a la bandeja de entrada.

Obtener un servidor SMTP gratis.

NOTA: En este articulo vamos a utilizar un servidor SMTP especifico, pero la parte de envío de emails funciona con cualquier servidor SMTP que tu elijas.

Usar un servidor SMTP cuesta dinero, pero con sendgrid puedes enviar gratis hasta 100 emails al día, lo cual puede ser suficiente para no tener que pagar al menos mientras inicias tu emprendimiento.

Si aun así 100 emails te parecen poco puedes utilizar el servido SMTP de tu preferencia y puedes saltar a la siguiente sección.

Este articulo no está patrocinado por sendgrid y no obtengo ningún beneficio si tu abres una cuenta, tú puedes usar el servidor que tu elijas y lo que explico en el artículo más adelante te servirá para cualquiera que tu elijas.

Cuando crees tú cuenta en sendgrid, necesitas crear un api key para enviar los correos por smtp. Para hacerlo ingresas en tu cuenta y luego vas al menú Email API, luego haces clic en Integration Guide y seleccionas la opción SMTP Relay, como se muestra en la siguiente imagen:

Configurar sendgrid para envio de correos con php

Ahora solo le das un nombre y presionas el botón Create Key, vas a necesitar copiar los datos de conexión: Server, Ports, username y password, porque los vas a necesitar para iniciar sesión cuando envíes los correos desde PHP más adelante. Después de copiarlos solo debes terminar los pasos siguientes.

Datos de inicio de sesión para enviar correos con sendgrid y php

Adicionalmente vas a necesitar verificar el email desde donde planeas enviar los correos. Esto lo haces desde el menú Settings y luego en Sender Authentication. Al final del articulo explico un poco más esta parte, en la sección Tu email llega con una alerta de SPAM

Como enviar correos con PHP y SMTP.

Para enviar correos vamos a usar la librería de PHP phpmailer y la instalaremos usando composer. Para que no queden dudas, vamos a iniciar un proyecto desde cero.

Primero crea una carpeta en tu servidor de desarrollo, si no tienes uno puedes configurar un servidor rápidamente usando WAMP. También vas a necesitar composer, si aún no lo tienes puedes leer esta guía sobre composer ahí explico cómo se instala y como se usa.

Ahora abre una ventana de consola y navega esta la carpeta que creaste y escribe este comando:

composer require phpmailer/phpmailer
Instalar phpmailer usando composer

Ahora crea un archivo como este, para comenzar a enviar correos:

<?php
// Impotar algunas clases de phpmailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

// Cargar phpmailer via composer
require 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
    //Si el correo no te llega, quita el comentario
    //de la linea de abajo, para mas información
    //$mail->SMTPDebug = SMTP::DEBUG_SERVER;
    $mail->isSMTP();
    $mail->Host       = 'smtp.sendgrid.net';
    $mail->SMTPAuth   = true;
    $mail->Username   = '******';
    $mail->Password   = '******';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port       = 587;

    //Destinatarios
    $mail->setFrom('[email protected]');
    $mail->addAddress('[email protected]');

    // Contenido
    $mail->isHTML(true);                          
    $mail->Subject = 'Soy un correo';
    $mail->Body    = 'Este es mi primer correo enviado desde <b>PHP</b>';
    $mail->AltBody = 'Version en texto plano del correo (No HTML, no formato)';

    $mail->send();
    echo 'El correo fue enviado';
} catch (Exception $e) {
    echo "Ocurrio un error: {$mail->ErrorInfo}";
}

Antes de que pruebes el programa, debes hacer unos cambios en el archivo anterior:

  • Si usas un servidor SMTP diferente de sendgrid, debes ingresar su dirección en la variable $mail->Host
  • Ingresa tu usuario de SMTP en la variable $mail->Username
  • Ingresa tu clave de SMTP en la variable $mail->Password
  • Quizá necesites cambiar el puerto en la variable $mail->Port

Todos los parámetros anteriores te los puede dar el servidor SMTP que utilices.

Luego en el código está la parte de los destinatarios, primero con la función $mail->setFrom() defines desde que dirección de email se enviaran los correos. No puedes colocar cualquier dirección, debe ser alguna que ya hayas validado con tu servidor SMTP, de otra forma tus correos se irán directo a la bandeja de spam.

Después usamos la función $mail->addAddress(), aquí defines a que dirección se enviara el correo electrónico. La dirección puede ser cualquiera, pero si mandas correos a personas que no te hayan dado su consentimiento, podrían marcarte como spam y eso daña tu reputación.

Si deseas enviar el mismo correo a varias personas, puedes llamar esta función más de una vez.

Más adelante en el código, defines el mensaje del correo: En la variable $mail->Subject ingresas el asunto, en $mail->Body ingresas el texto del correo, este puede llevar formato con etiquetas HTML y finalmente en la variable $mail->AltBody puedes ingresar opcionalmente una versión de tu correo en texto plano, en caso de que la persona que lee el correo no admite formato HTML, lo cual sería muy difícil que ocurra.

Como enviar emails con datos adjuntos.

Puedes enviar correos con archivos adjuntos, para hacerlo solo debes usar la función $mail->addAttachment() enviando como parámetro la ruta del archivo que deseas enviar. Por ejemplo, para adjuntar un archivo de texto que está en la misma carpeta que tu programa, puedes usar un código como este:

$mail->addAttachment('archivo.txt');  
Enviar emails con php y con un archivo adjunto

Si deseas enviar más de un archivo adjunto puedes llamar a la función $mail->addAttachment() más de una vez.

Si el archivo que deseas adjuntar no está en la misma carpeta, entonces deberás indicar la ruta completa o la ruta relativa.

Como enviar emails con imágenes.

Como ya has visto, podemos enviar correos con formato HTML, entonces para enviar una imagen dentro del correo podemos usar la etiqueta IMG. Lo único que debes de considerar es que necesitas especificar la ruta completa y la imagen debe estar alojada en un servidor público (accesible desde cualquier lugar por medio de Internet.)

Por ejemplo, no puedes enviar una imagen de esta forma:

$mail->Body    = 'Mira esta imagen <img src="foto.jpg">';

Sino que debes escribir la ruta completa:

$mail->Body    = 'Mira esta imagen <img src="https:/codigonaranja.com/foto.jpg">';

Como corregir algunos problemas

A continuación, detallo algunos problemas que puedas tener y como resolverlos.

El email nunca llega a su destino.

En este caso debe haber algún problema con la configuración que tienes, posiblemente está mal el usuario, clave o estas enviando correos desde una dirección de email no autorizada. Pero para tener una idea más clara del problema, puedes activar el modo DEBUG, busca esta línea de código:

//$mail->SMTPDebug = SMTP::DEBUG_SERVER;

Y eliminas los signos // para desactivar el comentario, luego ejecutas el código de nuevo y verás que te muestra muchos mensajes, entre esos mensajes debe estar el error que está impidiendo que envíes los emails.

Tu email llega con una alerta de SPAM

Si tu correo llega al destinatario, pero se va directo a la bandeja de SPAM o se recibe con una alerta como esta:

Lo que necesitas es validar tu dominio, el proceso dependerá de tu servidor SMTP, puedes contactarlo para que te guie sobre cómo hacerlo.

Pero si usas sendgrid, ingresa en tu cuenta y has clic en Settings y luego en Sender Authentication, después haces clic en lo botones Authenticate Your Domain y Verify a Single Sender y sigues los pasos en cada botón. Si tienes alguna duda en alguno de los pasos, puedes contactarte con el soporte técnico de sendgrid y ellos te ayudarán.

Conclusiones

Enviar emails desde PHP es muy sencillo, el truco está en encontrar un proveedor de SMTP que se ajuste a tus necesidades.

Ahora déjame saber que proveedor de SMTP utilizas, por favor escribe un comentario y dime cual servicio de SMTP usas tu.