¿Cómo envío correos con PHP por SMTP? (PHPMailer)

La gran mayoría de personas que programan en PHP, utilizan la función mail() para realizar envíos, ya sean simples o complejos. El problema está cuando intentan realizar envíos masivos con esta función. Esta es mucho más simple por su compatibilidad y facilidad de uso con MySQL, pero no esta preparada para grandes cantidades de envíos.
Por suerte, existen clases como PHPMailer, que nos permiten realizar estos mismos envíos por el puerto y smtp que queramos, creando una aplicación mucho más potente y con la posibilidad de tener un mejor control de los envíos al existir reportes de correo.
PHPMailer es una clase de PHP gratuita y la puedes descargar en: https://github.com/PHPMailer/PHPMailer

Algunas de las funciones que trae son:

  • Envíos a varios remitentes, con CC, CCO, etc.
  • Soporta 8bits, base64 y binarios
  • Autenticación por SMTP
  • Envíos con HTML
  • Envíos de emails con adjuntos
  • Inclusión de imágenes en el correo

Una vez que tenemos la clase en nuestro sitio, debemos iniciar la misma desde PHP, usando la función require y cargando la clase de PHP:

require("class.phpmailer.php");
$mail = new PHPMailer();

//Luego tenemos que iniciar la validación por SMTP:
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->Host = ""; // SMTP a utilizar. Por ej. smtp.elserver.com
$mail->Username = ""; // Correo completo a utilizar
$mail->Password = ""; // Contraseña
$mail->Port = 25; // Puerto a utilizar

//Con estas pocas líneas iniciamos una conexión con el SMTP. Lo que ahora deberíamos hacer, es configurar el mensaje a enviar, el //From, etc.
$mail->From = "info@elserver.com"; // Desde donde enviamos (Para mostrar)
$mail->FromName = "Nombre";

//Estas dos líneas, cumplirían la función de encabezado (En mail() usado de esta forma: “From: Nombre <correo@dominio.com>”) de //correo.
$mail->AddAddress("correo"); // Esta es la dirección a donde enviamos
$mail->IsHTML(true); // El correo se envía como HTML
$mail->Subject = “Titulo”; // Este es el titulo del email.
$body = “Hola mundo. Esta es la primer línea<br />”;
$body .= “Acá continuo el <strong>mensaje</strong>”;
$mail->Body = $body; // Mensaje a enviar
$exito = $mail->Send(); // Envía el correo.

//También podríamos agregar simples verificaciones para saber si se envió:
if($exito){
echo ‘El correo fue enviado correctamente.’;
}else{
echo ‘Hubo un inconveniente. Contacta a un administrador.’;
}

Adjuntos
Este script va a funcionar perfecto, pero está claro que no todos los clientes de correo o Webmails soportan HTML, por lo que podríamos querer mostrar un texto alternativo plano. Esto lo podemos hacer agregando la siguiente línea:

$mail->AltBody = "Hola mundo. Esta es la primer línean Acá continuo el mensaje”;

Como bien comente antes, PHPMailer tiene cantidades de funciones, entre ellas la posibilidad de enviar adjuntos. Los mismos se pueden agregar de la siguiente forma:

$mail->AddAttachment("imagenes/imagenadjunta.jpg", "nombre_a_mostrar.jpg");

El primer valor es el que se utiliza para elegir la ruta del archivo. El segundo, es para marcar el nombre del archivo a mostrar.
CC y BBC

También tenemos la posibilidad de agregar cuentas en copia oculta para cuando tenemos muchos remitentes con las siguientes líneas:

$mail->AddCC("cuenta@dominio.com");
$mail->AddBCC("cuenta@dominio.com");

Sistema completo
Para finalizar, dejo el sistema completo para que no haya confusiones:

<?php
require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->Host = ""; // SMTP a utilizar. Por ej. smtp.elserver.com
$mail->Username = ""; // Correo completo a utilizar
$mail->Password = ""; // Contraseña
$mail->Port = 25; // Puerto a utilizar
$mail->From = "info@elserver.com"; // Desde donde enviamos (Para mostrar)
$mail->FromName = "ELSERVER.COM";
$mail->AddAddress("correo"); // Esta es la dirección a donde enviamos
$mail->AddCC("cuenta@dominio.com"); // Copia
$mail->AddBCC("cuenta@dominio.com"); // Copia oculta
$mail->IsHTML(true); // El correo se envía como HTML
$mail->Subject = "Titulo"; // Este es el titulo del email.
$body = "Hola mundo. Esta es la primer línea<br />";
$body .= "Acá continuo el <strong>mensaje</strong>";
$mail->Body = $body; // Mensaje a enviar
$mail->AltBody = "Hola mundo. Esta es la primer línean Acá continuo el mensaje"; // Texto sin html
$mail->AddAttachment("imagenes/imagen.jpg", "imagen.jpg");
$exito = $mail->Send(); // Envía el correo.

if($exito){
echo "El correo fue enviado correctamente.";
}else{
echo "Hubo un inconveniente. Contacta a un administrador.";
}
?>