Envío de email en PHP usando el servidor SMTP de Gmail

  • Por
  • PHP
Un caso práctico de uso de la clase PHPMailer en el que enviamos correo desde PHP usando el servidor SMTP de Gmail.
 
En el artículo anterior del taller de PHP explicamos algunos detalles básicos sobre la clase PHPMailer y vimos lo sencillo que era enviar un correo electrónico con características avanzadas, como adjuntar archivos. Pero hay un ejemplo que nos dejamos en el tintero que creo que merece la pena tratar de manera independiente: el envío de email desde PHP, pero usando un servidor SMTP distinto del que tengas configurado en tu php.ini.

Una de las curiosidades, o utilidades, de PHPMailer es la posibilidad de enviar email usando el servidor SMTP de Gmail. Puede servirte de utilidad cuando no tienes tu propio servidor de SMTP, aunque personalmente tengo mis reservas y por eso me refiero a ello más como una curiosidad que otra cosa.

No obstante, el ejemplo de envío de email usando los servidores de envío de Gmail es interesante porque ilustra una de las necesidades que podemos tener en algunos casos, como es el uso de un servidor SMTP que requiera autenticación.

Nota: Si no tienes servidor SMTP en local para envío de emails en PHP, existen diversos programas que te facilitan esa función como el software PostCastServer que ya comentamos en DesarrolloWeb.com hace años. La mayoría de los servidores de hosting (o al menos todos los que he utilizado) tienen un servidor de SMTP disponible que puedes usar desde PHP. Lo que sí me he encontrado en alguna ocasión es con un proveedor de hosting que requiere autenticación SMTP para enviar correos desde PHP. Para todos estos casos, ¡PHPMailer es un aliado excepcional!

La idea es bien simple, usar los datos de una cuenta de correo Gmail para enviar los mensajes, indicando en PHPMailer los datos de esa cuenta de Google que vas a usar.

Nota: En esta ocasión he simplificado algo el código del ejemplo, pues parte del código está comentado con detalle en el artículo de introducción a PHPMailer. El ejemplo que estoy comentando a continuación está basado en el código que encontramos en la descarga del PHPMailer, en el archivo test_smtp_gmail_basic.php de la carpeta "examples".

require_once('../class.phpmailer.php');
$mail = new PHPMailer();
//indico a la clase que use SMTP
$mail­>IsSMTP();
//permite modo debug para ver mensajes de las cosas que van ocurriendo
$mail­>SMTPDebug = 2;
//Debo de hacer autenticación SMTP
$mail­>SMTPAuth = true;
$mail­>SMTPSecure = "ssl";
//indico el servidor de Gmail para SMTP
$mail­>Host = "smtp.gmail.com";
//indico el puerto que usa Gmail
$mail­>Port = 465;
//indico un usuario / clave de un usuario de gmail
$mail­>Username = "tu_correo_electronico_gmail@gmail.com";
$mail­>Password = "tu clave";
$mail­>SetFrom('tu_correo_electronico_gmail@gmail.com', 'Nombre completo');
$mail­>AddReplyTo("tu_correo_electronico_gmail@gmail.com","Nombre completo");
$mail­>Subject = "Envío de email usando SMTP de Gmail";
$mail­>MsgHTML("Hola que tal, esto es el cuerpo del mensaje!");
//indico destinatario
$address = "destinatario@delcorreoe.com";
$mail­>AddAddress($address, "Nombre completo");
if(!$mail­>Send()) {
echo "Error al enviar: " . $mail­>ErrorInfo;
} else {
echo "Mensaje enviado!";
}

Este código está comentado, por lo que se puede entender bastante bien. Solo llamar la atención sobre el tema del "debug" del servicio SMTP $mail­>SMTPDebug = 2; Con esto le indicamos que nos muestre mensajes del proceso de comunicación con el servidor SMTP que estemos usando, así como posibles errores. Podríamos colocarle también como valor el número 1, para decirle que solo nos muestre mensajes de error encontrados. O bien, si no asignamos nada en la propiedad SMTPDebug, no nos mostrará ningún mensaje adicional a los que PHPMailer ya muestra de manera predeterminada.

Nota: Mediante un script similar también podríamos enviar email desde PHP usando servidores SMTP de otros proveedores gratuitos como Hotmail (ahora Outlook.com) o el que tengas. Simplemente tienes que saber los datos de configuración de ese servicio (dirección de email, servidor de SMTP, usuario y clave, así como el puerto). Simplemente se trataría de indicar todos datos de esa cuenta de correo que pretendes usar.

Posibles problemas al usar otro servidor SMTP autenticado desde PHP

Este ejemplo de uso de PHPMailer puede acarrear diversos problemillas que quizás nos hagan perder alguna hora de trabajo. Nada que no se pueda resolver con un rato de pruebas y algo de calma, pero para simplificarte la vida te comento cómo me ha ido a mi.

Este ejemplo lo he conseguido hacer funcionar en dos ordenadores distintos. En mi ordenador con Linux, donde he instalado PHP siguiendo las indicaciones del artículo Instalar Lamp: Apache ­ MySQL ­ PHP, en Linux, ¡he corrido el script con éxito y me ha enviado el correo a la primera!

Pero claro, como todo en la vida no siempre te salen las cosas a la primera y en mi otro ordenador, con un sistema Windows con donde tengo instalado PHP por medio de Xampp, no he tenido la misma suerte. Sin embargo, la solución es bien sencilla.

Nota: Lo primero, claro está, es comprobar que tu cuenta Gmail está perfectamente especificada. Me refiero al nombre de usuario y la contraseña de Gmail, que debes haber indicado en el las propiedades $mail­>Username y $mail­>Password. Lo segundo es verificar el puerto, que en mi caso ha funcionado con el valor 465.

Desde el sistema Windows con Xampp recibo el siguiente mensaje de error "Unable to find the socket transport 'ssl' ­ did you forget to enable it when you configured PHP?"

La solución pasa por activar la extensión openssl de PHP, para lo que he descomentado en el php.ini la línea (quitado el punto y coma ";" al principio):

extension=php_openssl.dll

Después de esa pequeña configuración, y reiniciado el Apache (por supuesto), se puede enviar sin problemas el email desde mi Xampp instalado en Windows.

Conclusión sobre PHPMailer

Si alguna vez has intentado enviar un archivo adjunto en un email con PHP, habrás comprobado que no era algo inmediato. Si alguna vez has intentado usar un servidor SMTP desde PHP que requiera autenticación, probablemente te habrás vuelto loco al intentar configurar PHP. Si alguna vez quisiste enviar un correo en PHP usando un servidor SMTP no configurado en el php.ini, quizás te habrás dado de cara contra una pared.

Si quieres salvar todas esas barreras y seguro que muchas otras, tienes la opción de usar PHPMailer que funciona muy bien, simplifica tareas de envío de email avanzadas y te da soporte a muchas cosas que quizás no sabías hacer de otra manera.

Este artículo ha partido de la base que conocías las características fundamentales de PHPMailer, relatadas en una publicación anterior. Por lo que te recomendamos leer de nuevo dicho artículo si piensas que nos hemos dejado en el aire ciertas cosas. Pero en definitiva, creemos que PHPMailer es una clase importante a tener en cuenta.
 

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

Juan pablo

09/11/2013
Buen aporte pero necesito ayuda
Gracias por el aporte, lo probe pero me sale este error

Parse error: syntax error, unexpected '=' in C:AppServwwwEnvioCorreomail.php on line 7
adicional te informo que en el php.ini lo deje de la siguiente forma:
[mail function]
; For Win32 only.
SMTP = smtp.gmail.com
smtp_port = 465

; For Win32 only.
;sendmail_from = me@example.com

Jose

16/11/2013
gmail no recibe mis emails
Hola,<br />
he configurado el envío de email como has explicado, utilizando la clase PHPMailer y el servidor SMTP de Gmail.<br />
Se envían todos los emails, pero sin embargo las cuentas de gmail no los reciben (Yahoo y Hotmail sí).<br />
¿A qué se podría deber esto?<br />
Muchas gracias

Jose

19/11/2013
porqué no llegan los mensajes a gmail
Hola buenas,<br />
<br />
muchas gracias por este artículo.<br />
Yo tengo configurado PHPMailer desde hace tiempo, para enviar emails.<br />
El tema es que siempre he tenido problemas. Al principio la cuenta gmail que utilizaba se cerraba al considerar, Google (o gmail) que estaba haciendo spam (no lo hacía en absoluto).<br />
Algo cambié en el script para que no pasara eso. Pero ahora tengo otro problema, y es que aunque se envían todos los emails, las cuentas de gmail no reciben ninguno.<br />
No tengo ni idea de cual es el problema ni de cómo resolverlo.<br />
He preguntado en el foro de gmail pero sin respuesta.<br />
¿Quizás sea recomendable pasarse a otro proveedor de correo?<br />
<br />
Gracias!!

ssima

23/12/2013
Esta característica
Esta característica realmente se centra en las características básicas de la phpMailer. Gracias por compartir el maravilloso artículo sobre el tema que usted. Fue útil como un tutorial que nos ayuda en el PHP. Por favor, siga metiendo más sobre las cosas en el PHP .
<a href="http://www.bestlaptopstickers.com">laptop stickers for hp</a>

Rafa montoya

20/3/2014
gracias Por todo
De verdad gracias por todo, son de gran aporte a la sociedad de todo el mundo

DeimerJ91

30/7/2015
Pregunta sobre envió de mensajes con php
gracias por ese aporte aclare muchas dudas que tenia, pero aun tengo una y te agradezco que puedas responderme, estoy diseñando una web para promocionar mi trabajo, y necesito un formulario para que me puedan contactar, mi duda es acerca del servido SMTP, es la primera vez que voy a hacer un formulario como este, manejo php hace tiempo y se como programarlo y gracias a tus vídeos y artículos ahora tengo mas idea de como es el proceso.
mi pregunta es, si a la hora de subir los archivos de mi web al hosting donde va a quedar, no tengo que configurar nada mas? es decir, puedo programar el formulario localmente como he visto que lo haces usando postcast y no habrá problema cuando lo suba al hosting?
espero tu respuesta pronta gracias de antemano

Javier

15/1/2016
Felicitaciones
Excelente todos tus aportes, muchisimas gracias

Felipe Zuluaga

25/8/2016
Problema al enviar
Cordial saludo.
Gracias por tu aporte, pero aun no me funciona el envio de mesanjes, tengo mi pagina montada en un servidor centos.
el problema que me esta presentando es que no me sale ningun error, solo no hace nada, puse un echo antes del if y me imprime y puse otro despues pero no imprime nada, al entrar al if termina el proceso y no muestra nada mas
agradezco su ayuda

Diego Reyes

23/11/2016
Correo del que se envia
Disculpa tengo una duda, ya logre hacer que se envie mi formulario, el problema es que lo recibo de una especie de correo creado que dice phpmailer@discountasp.net y quisiera cambiarlo obviamente al correo que me interesa, como tengo pocos conocimientos de php... quisiera saber si alguna linea del codigo me sirve para eso? muchas gracias de antemano

Miguel

06/2/2017
mandar desde mysqul
Una cuestión que creo que sería interesante: como sería el código si en lugar de mandar a una dirección específica de correo, lo mandamos desde una tabla en mysql?

Saludos,

Luis Francos

21/2/2017
Ayuda !!! Por favor
Hola! Soy nuevo en estos menesteres y estoy tratando de envair un correo pero no jala.
Por favor ayuda me sale el siguiente error:

( ! ) Parse error: syntax error, unexpected ‘=’ in C:wamp64www- Enviar_con_phpmailerenvio_ce_via_SMTP_desarrolloweb.php on line 15

Lo que tengo en la línea 15:

$mail­>SMTPDebug = 2;

El archivo “envio_ce_via_SMTP_desarrolloweb.php” se encuentra en la misma carpeta que la carpeta “phpmailer” y sucede lo mismo si lo pongo dentro de la misma carpeta “phpmailer”

Espero me puedan ayudar

Gracias !!!

Luis Francos

21/2/2017
Ayuda !!! No funciona el ejemplo
0