Cakephp 3: Como enviar correo electrónico utilizando Gmail

Desde hace un par de días he venido luchando para configurar adecuadamente el envío de correo a través de Gmail pero cada intento me daba un error de certificados SSL que hizo que odiara la tecnología un poco más de lo usual.

Espero que esta guía ayude a aquellos que intenten realizar este tipo de tarea o a lo mejor resolver el error que yo tenía.

Lo primero es tener habilitado openssl en nuestro servidor, si utilizas Lampp (osea de Linux) este ya viene habilitado por defecto, si estas en Windows entonces debes ir a editar el archivo /xampp/php/php.ini y encontrar la linea con el texto: extension=php_openssl.dll, si ves un punto y coma (;) al inicio de esa línea quiere decir que esta comentado y no esta habilitado, debes eliminar ese punto y coma, guardar el archivo y reiniciar el servidor apache.

Lo segundo antes de ir al código es saber que Gmail posee una característica por defecto de no permitir el acceso a tu cuenta si la aplicación desde la que intentes conectarte no posee una conexión segura como un cerfiticado ssl, y lo mas probable es que en tu servidor local no contes con uno así que vamos a habilitar el acceso de aplicaciones inseguras.

Para habilitar dicha característica primero vas a entrar en tu cuenta de correo Gmail, en la esquina superior derecha vas a ver un cirtulo donde debería estar tu foto de perfil, haces clic ahí y luego en el botón Mi Cuenta.

cake_email_001

Luego clic en el enlace Acceso y Seguridad.

cake_email_002

Baja hasta ver la opción Permitir el acceso a aplicaciones menos seguras y haces clic en el botón para activarla.

cake_email_003

Entrando en materia de código lo primero que voy a hacer es una plantilla, esta plantilla será la base del mensaje en mi correo electrónico.

/src/Template/Email/html/correo_plantilla.ctp y le voy a poner algo sencillo:

Como verán tengo 3 variables que luego llenaré desde el controlador.

El siguiente es un controlador que se llama Usuarios y voy a utilizar la configuración de correo llamada configTransport, que es una configuración al vuelo.

/src/Controller/UsuariosController.php con el siguiente código:

Esto es lo básico que podrían tener para el envío de correo electrónico, NO DEJES DE LEER QUE TENGO UNAS NOTAS IMPORTANTES.

Como verán en el configTransport he comentado la opción de tls, eso es porque ahorita utilizo ssl, pero si quisieran usar tls entonces debería modificar estas opciones:

Ahí hemos cambiado el host, le quitamos el ssl://, el puerto y activamos tls.

Segunda nota por mencionar, si prueban el código en este momento a la mayoría podría ocurrirle el siguiente error:

stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed stream_socket_client(): Failed to enable crypto stream_socket_client(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error)

cake_email_004

Esto es porque Openssl en php 5.6 verifica cada conexión encriptada por defecto, pero al no contar con un certificado en nuestro servidor de desarrollo presentará el siguiente inconveniente es por eso que en el configTransport he dejado una opción comentada que se llama context, si la descomentamos evitarémos dicha verificación que al menos en nuestro desarrollo o hasta que tengamos un certificado ssl es conveniente para que funcione, para descomentarla quita el /* al inicio y el */ al final para que se vea así:

Ahora si intentas el correo debería enviarse sin problema.

cake_email_005

Si llegas a tener otro tipo de error como:

php_network_getaddresses: getaddrinfo failed: Fallo temporal en la resolución del nombre

Podría ser alguna restricción en tu red por parte de un router, firewall o proxy que deberías investigar por aparte.

 

Realmente espero que esta guía sea de ayuda para alguien porque el problema del ssl me tomo dos días encontrar como resolverlo y es algo que quiero compartir con todos.

En la web de Cakephp podes encontrar más información sobre el uso de Email.

Hasta luego gente!!

Tags:
One Comment

Deja un comentario