Programación

SMTP autenticado con Gmail, para programadores (Swiftmailer, Laravel, Zend,…)

Enviar correo de forma autentificada (SMTP autenticada), desde nuestra aplicación web, a través de una cuenta de Gmail, no es tan sencillo como poner los datos de usuario, la contraseña y los datos del servidor, sobre todo si tienes la seguridad en el nivel normal, o con autentificación en dos pasos. Estos días tan un cambio de seguridad en los servidores, he tenido que ayudar a algunos clientes a configurar sus aplicaciones, y la más complicada y sobre todo por la cantidad de información basura que hay en Internet, es la de Gmail.

Configuración básica del SMTP

Nada nuevo en esta cuestión. Es como configurar, una cuenta en un programa de correo. Necesitamos lo que Gmail nos solicita, G Suite o Gmail:

  • Usuario (miusuario@gmail.com)
  • Contraseña (mypassword)
  • Protocolo (tls, ssl,…)
  • Puerto (587)
  • Servidor SMTP

Programación. Ejemplo con Swiftmailer

Aunque ponemos el ejemplo con Swiftmailer, es valido para cualquier framework, como Laravel, Zend, Symfony, pues muchos de ellos están apoyados en el uso de swiftmailer.

En primer lugar animar al uso de la gestión de errores, algo muy olvidado y obviado en la programación, que se hace necesario cuando estamos realizando tareas, que pueden ser subceptibles de error, ya que interactuamos con software de terceros, con conexiones remotas, sockets, etc.

try{ 
     require_once '/PATH/library/SwiftMailer/swift_required.php'; 
     
     //Creamos la instancia con la configuración 
     $transport = Swift_SmtpTransport::newInstance() 
        ->setHost('smtp.gmail.com')
        ->setEncryption('tls')
        ->setPort(587)
        ->setUsername('micuenta@gmail.com')
        ->setPassword('jshsnah#2qQ21');

    //Creamos la instancia del envío
    $mailer = Swift_Mailer::newInstance($transport);
   
    //Creamos el mensaje
    $mail = Swift_Message::newInstance()
        ->setSubject('Es una prueba de envío')
        ->setFrom(array('micuenta@gmail.com' => 'Abdelkarim Mateos'))
        ->setTo('direccion@correo.es')
        ->setBody('Este es el cuerpo de mi mensaje', 'text/html');

    //Enviamos el correo
    $mailer->send($mail);

} catch(Exception $e) {
    echo ("Error al enviar mensaje: " + $e->getMessage());
}

Con toda probabilidad obtendremos un mensaje de error como el de mas abajo

[04-Feb-2017 08:36:07 UTC] PHP Fatal error:  Uncaught exception 'Swift_TransportException' with message 'Expected response code 250 but got code "535", with message "535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8  https://support.google.com/mail/?p=BadCredentials k43sm49143108wrc.46 - gsmtp
"' in /home/staybarn/library/SwiftMailer/classes/Swift/Transport/AbstractSmtpTransport.php:383
Stack trace:
#0 /home/staybarn/library/SwiftMailer/classes/Swift/Transport/AbstractSmtpTransport.php(281): Swift_Transport_AbstractSmtpTransport->_assertResponseCode('535-5.7.8 Usern...', Array)
#1 /home/staybarn/library/SwiftMailer/classes/Swift/Transport/EsmtpTransport.php(270): Swift_Transport_AbstractSmtpTransport->executeCommand('RSET\r\n', Array, Array)
#2 /home/staybarn/library/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php(55): Swift_Transport_EsmtpTransport->executeCommand('RSET\r\n', Array)
#3 /home/staybarn/library/SwiftMailer/classes/Swift/Transport/Esmtp/AuthHandler.php(176): Swift_Transport_Esmtp_Auth_XOAuth2Au in /home/staybarn/library/SwiftMailer/classes/Swift/Transport/AbstractSmtpTransport.php on line 383

Bien el enlace del error no esta precisamente actualizado así que os proponemos los pasos a seguir para solventar esta situación producida por el nivel de seguridad de la cuenta. Muchos proponen, la salida fácil e insegura de desactivar la verificación en dos pasos de la cuenta relajando el nivel de seguridad.

SMTP autenticado: dar permisos a nuestra aplicación para trabajar con el SMTP de Gmail

Estando autentificados en nuestra cuenta de Google, deberemos acceder a Contraseñas de aplicación y allí seleccionar Otra (nombre personalizado), lo que generará una ventana que nos mostrara una contraseña que es la que deberemos usar en nuestra aplicación.

Usando esa contraseña de aplicación, mientras esta no sea revocada, la aplicación funcionará perfectamente, teniendo nuestra cuenta las máximas garantías de seguridad, como la autentificación en dos pasos.

Alternativa para comprobar la conectividad

(Añadido 20/2/2017) Una variación al código me fue necesaria, tras unas modificaciones en un servidor, en el que el código propuesto en la parte anterior del artículo, no me mostraba error, pero no funcionaba el código como debía. Así que la solución pasaba por una captura doble de las excepciones

try{
$transport = Swift_SmtpTransport::newInstance('smtp.servidor.com', '465', 'ssl');
$transport->setUsername('username@servidor.com');
$transport->setPassword('supersecret');
$mailer = \Swift_Mailer::newInstance($transport);
$mailer->getTransport()->start();
return 'ok'; // o echo 'ok'.PHP_EOL; dependiendo de lo que queramos o como lo usemos
} catch (Swift_TransportException $e) {
return $e->getMessage();
} catch (Exception $e) {
return $e->getMessage();
}

SMTP autenticado versus SMTP autentificado

El domingo 7 de mayo de 2017, decidí editar esta entrada, modificar su slug, y modificar los textos, tras observar que las palabras autentificado, autentificiar, no parecían entre las cadenas de búsqueda de Google. Ni siquiera las de Bing. Ya el colmo fue leer a algún influencer que habia escrito una entrada en su blog sobre su inexactitud, la de escribir autentificado en lugar de autentificar.

Para despejar la duda, os dejo el enlace de la Wikilengua en Español, autenticar/autentificar


Imagen de portada Designed by Freepik y retocada por Abdelkarim Mateos

Comparte este artículo

Artículo Antiguo
Este artículo tiene más de 2 años. Es muy probable que su contenido este anticuado, aunque pueda ser de utilidad, es conveniente que revises otras informaciones al respecto. Si lo encuentras útil o crees que puede ser actualizado, deja tu comentario con la actualización para poder editarlo y que pueda ser útil a los demás.

Comparte este articulo en

Abkrim

Yo solo se que no se nada, y que me paso la vida aprendiendo

Entradas recientes

Fatal error: Allowed memory size of 268435456 bytes exhausted en WordPress. Otro post más… pero diferente

No es la primera vez que me encuentro con el agotamiento de la memoria en…

5 meses hace

Problemas de Acceso con Centos 7, Almalinux 8, Ubuntu 20.04, y Debian 10/11: Un Enigma Firewall CSF

Descubre cómo solucionar problemas de acceso a servidores con Centos 7, Almalinux 8, Ubuntu 20.04…

9 meses hace

MySQL no inicia debido a errores en la base de datos interna de MySQL

Uno de los mensajes más alarmantes que puedes encontrarte es aquel que indica que tu…

11 meses hace

Actualización de seguridad 6.2.1 para WordPress y la importancia de los backups confiables

La seguridad de nuestro sitio web es de vital importancia en el mundo digital actual.…

12 meses hace

El mito de los ficheros SVG inseguros en las subidas de ficheros

Los ficheros SVG son archivos gráficos vectoriales escalables ampliamente utilizados en diseño web. Aunque no…

12 meses hace

Solución de problemas de errores 500 en Castris Hosting: una guía para usuarios de cPanel

En este artículo, te guiamos en la solución de problemas de errores 500 en Castris…

12 meses hace