PHPMailer potente y sencilla clase para envío de email desde PHP

  • Por
  • PHP
Clase destacada en el ecosistema de PHP que facilita enormemente el trabajo de envío de email desde PHP, sobre todo en correos electrónicos especialmente complejos.
 
El proceso para hacer envío de email desde PHP es muy sencillo. Se limita a una función llamada "mail()" que realiza el envío atendiendo a una serie de parámetros que le enviamos. Lo cierto es que no es fácil imaginar otro modo más sencillo de enviar email, pero ¿qué pasa cuando el email a enviar es más complejo que de costumbre?

En DesarrolloWeb.com hemos tratado en diversos artículos temas relacionados con el envío de emails desde PHP, ya que es uno de los temas más básicos y repetitivos en el mundo de las aplicaciones web. Por ejemplo te recomendamos la lectura del artículo Envío de email desde PHP o bien el artículo Envío de un formulario por email.

El problema viene cuando el email que tienes que crear tiene algunas características avanzadas, como adjuntar archivos o autenticación en el servidor de SMTP. En esos casos, la función mail() se nos queda corta y tenemos que recurrir a otros medios.

PHPMailer para enviar emails

PHPMailer es una clase creada específicamente para hacer sencillo el envío de emails que tienen características complejas, y la verdad es que es bastante útil y potente. Permite enviar email con archivos adjuntos, diferentes tipos de servidores SMTP (con o sin autenticación de usuario), a la vez que da soporte a otras características de la función mail() nativa de PHP, pero de una manera un poco más simple.

Está disponible con licencia de libre distribución y uso, código abierto y se puede obtener a través del enlace siguiente:

https://github.com/PHPMailer/PHPMailer

La verdad es que la clase resulta muy sencilla de entender y de usar. Para guiarte en su uso tienes la carpeta examples del proyecto, con un algunos ejemplos de uso que te servirán como plantilla para hacer envío de email de una manera rápida y simple.

Echa un vistazo al listado de ejemplos que podrás encontrar explicados en el index.htmlde la carpeta examples, del Zip de descarga. Allí encontrarás diversos códigos ya listos para enviar email de diversas características.

Envío de email básico con PHPMailer

Para darle un poco más de utilidad a este artículo, vamos a repasar alguno de los ejemplos de PHPMailer que están en la propia página de ejemplos de la documentación, o entre los archivos de descarga que obtienes al bajarte PHPMailer.

El código es bastante sencillo de entender, por lo que simplemente le voy a colocar algunos comentarios en español para que se pueda entender mejor.

//incluimos la clase PHPMailer
require_once('../class.phpmailer.php');

//instancio un objeto de la clase PHPMailer
$mail = new PHPMailer(); // defaults to using php "mail()"

//defino el cuerpo del mensaje en una variable $body
//se trae el contenido de un archivo de texto
//también podríamos hacer $body="contenido...";
$body = file_get_contents('contenido.html');
//Esta línea la he tenido que comentar
//porque si la pongo me deja el $body vacío
// $body = preg_replace('/[]/i','',$body);

//defino el email y nombre del remitente del mensaje
$mail­>SetFrom('email@remitente.com', 'Nombre completo');

//defino la dirección de email de "reply", a la que responder los mensajes
//Obs: es bueno dejar la misma dirección que el From, para no caer en spam
$mail­>AddReplyTo("email@remitente.com","Nombre Completo");
//Defino la dirección de correo a la que se envía el mensaje
$address = "email@destinatario.com";
//la añado a la clase, indicando el nombre de la persona destinatario
$mail­>AddAddress($address, "Nombre completo");

//Añado un asunto al mensaje
$mail­>Subject = "Envío de email con PHPMailer en PHP";

//Puedo definir un cuerpo alternativo del mensaje, que contenga solo texto
$mail­>AltBody = "Cuerpo alternativo del mensaje";

//inserto el texto del mensaje en formato HTML
$mail­>MsgHTML($body);

//asigno un archivo adjunto al mensaje
$mail­>AddAttachment("ruta/archivo_adjunto.gif");

//envío el mensaje, comprobando si se envió correctamente
if(!$mail­>Send()) {
echo "Error al enviar el mensaje: " . $mail­>ErrorInfo;
} else {
echo "Mensaje enviado!!";
}

Como has podido comprobar, el contenido del script es bastante elemental, pues la complejidad se queda toda en el propio PHPMailer.

Pero observa qué sencillo es enviar un archivo adjunto en este correo electrónico, con una única línea de código, llamando al método "addAttachment()".

Los acentos en el correo electrónico y en los asuntos

Uno de los problemillas que he encontrado al usar el PHPMailer es que los acentos en el asunto me salen con caracteres raros, en vez de visualizarse correctamente. Estoy usando en mi archivo .php el juego de caracteres UTF8 y para asegurarnos que en el asunto y/o cuerpo del mensaje se vean correctamente los caracteres latinos, debe indicarse a PHPMailer qué juego de caracteres utilizo. Se puede proceder indicando este par de valores en atributos de la clase PHPMailer.

$mail­>CharSet = "UTF­8";
$mail­>Encoding = "quoted­printable";

Con esto experimentarás que los acentos y otros caracteres especiales del idioma español se muestran correctamente.

Conclusión a la introducción a PHPMailer y siguientes pasos

La clase PHPMailer es muy interesante, un imprescindible para simplificar muchas de las tareas de gestión del correo electrónico desde PHP. Merece la pena echarle un vistazo en profundidad y comprobar lo sencillo que resuelve algunas de las necesidades más solicitadas en lo relativo al envío de email con PHP, como el uso de archivos adjuntos.

En el siguiente artículo continuaremos trabajando con PHPMailer, tomando algunos detalles interesantes sobre el envío de email desde PHP con SMTP autenticado y usando los servidores de GMail.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Antonio

30/10/2013
Archivos adjuntos
Hola Miguel.

Gracias por tu tiempo de antemano.

Me podrías decir qué ruta debo poner a la hora de adjuntar un archivo.

Con una ruta absoluta tipo http://www... no consigo adjuntar nada.

Saludos

carlos

10/2/2014
Como enviar mails automaticamente con PHP
Como puedo enviar mails automaticamente con PHP, es decir quiero se envie un mail de mi servidor a un correo especifico todos los dias a las 9pm. Gracias.

Deiby

21/2/2014
Enviar correo a las 9 pm
Saludos en ese caso tendrías que tener un hilo que se ejecute en el servidor y verifique la hora. No estoy seguro si php permite levantar hilos(threads) de no poderse tendrías que tener una app local en una maquina que haga tal tarea

Osvaldo

01/4/2014
Enviar correos automáticos
Buen día, puedes utilizar la herramienta cronjobs para realizar tareas de forma programadas.
Saludos.

Erik

07/5/2014
CronJobs
si estas usando Linux tendras que usar crontab
y mezclar los Bash
si necesitas mas información dime..

Gerdo

11/8/2014
Relacionado al envio de correos con PHPMailer en PHP
Gracias, muchas gracias por la explicación ya llevaba un buen tiempo queriendo entender el código de otras páginas pero no entendía, pero con usted todo se aclaró y pude crear el envido de correos anexando un archivo, por fin vi la luz al final del camino.

braulio

21/8/2014
envio
como puedo enviar los datos insertados desde php tengo llamar los datos no se como hacerlo necesito ayuda

La verdad

27/8/2014
mal post
0

iObed

12/9/2014
No me funcionó
No encuentro el error. El usuario llena un formulario de registro, al darle guardar (AJAX) el script que ejecuta AJAX debe enviar un correo al usuario =(

Dani

30/9/2014
Creo que hay errores
En el código pone en repetidas veces $mail> .... no sería $mail-> con el guión medio entre la variable y el ">"?

Alexandra

06/11/2014
Armar email sin enviar
Buenas tardes,

Yo quisiera saber como hago para que al darle enviar solo me arme el correo y me lo muestre sin enviarlo. para yo poder hacer un cambio si lo deseo. estoy utilizando Outlook.

Gracias de antemano.

luis

05/12/2014
Error en funcion
Me aparece esto Call to undefined function SetFrom()

Javier Garrido

06/2/2015
error
Me da error en estas dos lineas de código

//Añado un asunto al mensaje
$mail­>Subject = "Envío de email con PHPMailer en PHP";

//Puedo definir un cuerpo alternativo del mensaje, que contenga solo texto
$mail­>AltBody = "Cuerpo alternativo del mensaje";

Villakoki

11/6/2015
UTF8
Con respecto al codigo añadir que hay que poner $mail-> ...=...
y sobre la codificación poner $mail->CharSet="UTF-8"; sino no funciona correctamente la codificacion.

Abner

19/7/2015
No funciona
Me da error en
$mail­>Subject = "Envío de email con PHPMailer en PHP";
//Puedo definir un cuerpo alternativo del mensaje, que contenga solo texto
$mail­>AltBody = "Cuerpo alternativo del mensaje";

y no encuentra la funcion SetFrom

Bryan

23/7/2015
Error al enviar mail
Buenos días, he seguido los ejemplos de los archivos sendmail.phps y mail.phps, pero, me aparece un error diciendo que no se ha podido crear la instancia de la función de correo : "Coul not instantiate mail function".

jcrisdro

02/9/2015
Error al enviar mail
Buen dia
Para el caso de errores de instanciar la funcion del mail revisen la parametrización de sus servidores de correo (sendmail o postfix)

"Error al enviar mail
Buenos días, he seguido los ejemplos de los archivos sendmail.phps y mail.phps, pero, me aparece un error diciendo que no se ha podido crear la instancia de la función de correo : "Coul not instantiate mail function".

Pedro

25/3/2016
Error
Hola he seguido el articulo paso a paso.
He intentado tanto con este tutorial como con otros, además también lo he intentado con swiftmailer y aunque parece que todo está correcto, al ejecutarlo siempre aparece el mismo mensaje:
"La página localhost no funciona

La página localhost no puede procesar esta solicitud ahora.
500"

Estoy bajo ubuntu y he instalado lamp.
SI alguien sabe porque aparece este error y puede ayudarme lo agradecería.
Un saludo.

raul

15/7/2016
mal
0

raul

15/7/2016
no funciona
borren el post ........... esta malo

Miguel

12/11/2016
No funciona el correo a dominios fuera de mi servidor
Hola, tenía una web que manda correos de confirmación a usuarios alojada en un servidor Windows 2008. La he pasado a un Windows server 2012 r2 standart con Plesk 12.5 y ahora la función mail() solo manda correos a los dominios que tengo alojados en el mismo servidor, al resto no pero no marca ningún error.

Un saludo

CLR

18/11/2016
Call to undefined function SetFrom()
Prueba borrando esa linea y escribirla de nuevo de forma que escribiendo $mail-> y dandole a Ctrol+barra espaciadora un par de veces, ya te aparecen los métodos o propiedades que soporta el objeto. En este caso el método aparece con letra minúscula y no con mayúscula.
Espero que os sirva de ayuda!

David

02/3/2017
copia oculta
Hola quisiera saber si se puede enviar una copia oculta y como seria eh buscado pero no encuentro la forma o realmente si se pueda, espero puedan ayudarme ya que fue de una gran ayuda solo me falta saber eso !!Gracias¡¡¡

rocknroll

26/4/2017
phpmailer es para ¿área contacto de un sitio web?
lo que quiero hacer es enviar correos del público en general hacia 2 correos por medio del rellenado de formulario en mi sitio web, no sé si eso se hace con phpmailer, gracias de antemano por responderme... gracias

Victor

18/9/2017
La función send no me funciona y errores en tu sintaxis
Escucha cuando escribes >, ¿no estas cometiendo un error? Realmente sería ->. ¿Y por qué el send no me funciona? ¿Me puedes aportar alguna idea?