GNU/Linux, Open Source, Cloud Computing, DevOps y más...

Usar GMail gratis con tu propio dominio gracias a Amazon SES + Lambda

22 comentarios

Una de las principales necesidades que tiene un pequeño negocio o una startup que está empezando es disponer de un sistema de correo fiable con un dominio propio que nos diferencie a nosotros mismos y a nuestro sitio web corporativo en Internet. Aunque hay muchos planes de hosting que ofrecen cuentas de correo gratuitas e incluso podríamos montar nuestro propio servidor de correo, es probable que ya estemos acostumbrados a servicios de correo como GMail y nos gustaría seguir utilizándolo para gestionar el correo de nuestro propio dominio sin tener que recurrir a soluciones de pago como G Suite (antes Google Apps), que aunque son económicas para las prestaciones que ofrecen, suponen un coste adicional que nuestro incipiente proyecto no se puede permitir.

Si es tu caso te alegrará saber que gracias a la capa gratuita que ofrece AWS en algunos de sus servicios como Amazon SES y Lambda, podemos montar sin coste un sistema de correo que se integre perfectamente con nuestra cuenta gratuita de GMail, y que al mismo tiempo permita enviar y recibir correo desde múltiples cuentas de nuestro propio dominio.

El procedimiento que indico a continuación no es exclusivo para cuentas de GMail. Cualquier otro servicio de correo que ofrezca la posibilidad de enviar correo eligiendo el nombre y la dirección que queremos que aparezca en el remitente nos servirá. Para la recepción de correo de nuestro dominio ni siquiera hace falta ninguna característica adicional, por lo que cualquier servicio de correo, ya sea Office 365 Outlook, Yahoo o iCloud Mail servirá.

IMPORTANTE: Consulta los límites de la capa gratuita de AWS y los costes en los que incurrirás si superas éstos, pues aunque son bastante amplios para el propósito que aquí se indica, podrían suponerte un perjuicio económico que no tenías previsto. Recuerda que si llevas a cabo este procedimiento lo haces bajo tu entera responsabilidad.

1. Crear nueva zona DNS para nuestro dominio en Amazon Route 53

El primer paso será crear una zona DNS pública (Public Hosted Zone) para nuestro dominio en Amazon Route 53 si todavía no disponemos de ella. Para ello accederemos a través de la consola de AWS al servicio Route 53 -> Hosted zones -> Create Hosted Zone. Podemos aprovechar este paso para añadir algunas entradas DNS que necesitemos, como registros A que apunten a nuestro sitio web, o en el caso del correo, un registro SPF como medida de seguridad para evitar que usurpen nuestras direcciones de correo o que nuestros destinatarios consideren nuestro correo como spam.

Zona DNS pública básica recién creada en Amazon Route 53

Zona DNS pública básica recién creada en Amazon Route 53

Ejemplo zona DNS registro SPF

Ejemplo de zona DNS con registro SPF

2. Verificar nuestro dominio en Amazon SES

Abriremos otra pestaña en nuestro navegador y accederemos de nuevo a través de la consola de AWS al servicio Amazon SES. Desde la opción Domains del menú verificaremos nuestro dominio, lo cual provocará que se añadan nuevas entradas DNS en nuestra zona de Route 53 como se puede ver en las siguientes imágenes:

Verificación de dominio en Amazon SES

Verificación de dominio en Amazon SES

Resultado verificación de dominio en Amazon SES

Resultado tras verificación de dominio en Amazon SES

Nuevos registros DNS añadidos a nuestra zona

Nuevos registros DNS añadidos a nuestra zona

IMPORTANTE: Las zonas DNS de Route 53 tienen un coste de 0.50 USD/mes por dominio. Si no quieres incurrir en este gasto puedes, llegados a este punto, replicar todos los registros DNS que aparecen en la última captura de pantalla en el panel de control de zonas DNS de tu proveedor actual con el que registraste el dominio. Si prefieres utilizar el servicio Route 53 tendrás que actualizar los servidores DNS de tu dominio para poner los de Amazon (registros NS de la última captura) y no los de tu proveedor de dominios.

3. Crear función Lambda para redirigir el correo entrante a nuestra cuenta de GMail

Este punto incluye dos pasos. En el primero de ellos crearemos una función Lambda abriendo en una nueva pestaña del navegador la página principal del servicio Lambda de Amazon, y haciendo clic en Create a Lambda function. Seleccionaremos una función en blanco (Blank Function) y nos saltaremos el paso de configurar disparadores (Configure triggers). En las capturas de pantalla de más abajo se pueden ver las opciones que en necesario rellenar en el formulario de creación de la nueva función Lambda.

El código fuente en Node.js de la función Lambda se basa en este repositorio de GitHub: https://github.com/arithmetric/aws-lambda-ses-forwarder. Resumo a continuación los únicos cambios que he realizado en dicho código para ilustrar mi ejemplo y que he probado que funcionan satisfactoriamente:

var defaultConfig = {
 fromEmail: "info@example.com",
 subjectPrefix: "",
 emailBucket: "example-com-mailbox",
 //emailKeyPrefix: "emailsPrefix/",
 emailKeyPrefix: "",
 forwardMapping: {
 "info@example.com": [
 "example@gmail.com"
 ]
 }
};

El segundo paso consiste en modificar las políticas de seguridad asociadas al rol IAM que se genera automáticamente al crear nuestra función Lambda, ya que necesitamos añadirles dos nuevas políticas: una para que se permita acceder al bucket de S3 que crearemos posteriormente para almacenar nuestros mensajes de correo, y otra para poder acceder a los recursos del servicio Amazon SES. Para ello, una vez creada la función Lambda abriremos en una nueva pestaña del navegador el servicio IAM y haremos clic en las siguientes opciones: Roles -> example-com-forwarding -> Policy Name AWSLambdaBasicExecutionRole-99b88501-cad9-4f48-ba03-75b13f98dae0 -> Edit Policy. En esta última página añadiremos el código JSON que aparece señalado en azul en las siguientes capturas de pantalla:

Configuración función Lambda para reenvío de correo

Configuración función Lambda para reenvío de correo

Edición de política IAM

Edición de política IAM

Resumen política IAM

Resumen política IAM

4. Crear nueva regla de recepción de correo en Amazon SES

De nuevo desde la página principal del servicio Amazon SES haremos clic en la opción del menú Rule Sets y a continuación en el botón Create a Receipt Rule, lo cual iniciará un procedimiento de 4 pasos muy simples que culminará con la creación de una nueva regla de recepción de correo para nuestro dominio. El primero de estos pasos será crear uno o varios destinatarios de correo. Aquí podremos introducir una única dirección de correo de nuestro dominio, o directamente el nombre del dominio sin más, lo cual nos permitirá recibir correo para cualquier dirección.

Creación de regla de recepción en Amazon SES - paso 0

Creación de regla de recepción en Amazon SES - paso 0

Creación de receptores - paso 1

Creación de receptores - paso 1

 

A continuación crearemos 2 acciones que se ejecutarán cada vez que Amazon SES reciba un correo para nuestro dominio: almacenar el correo en un bucket S3 y ejecutar nuestra función Lambda para que sea redirigido a nuestra cuenta de GMail:

Creación de acciones de regla de recepción Amazon SES

Creación de acciones para nuestra regla de recepción

Creación de nuevo bucket S3

Creación de nuevo bucket S3

Creación de nueva acción función Lambda

Creación de nueva acción basada en nuestra función Lambda

Tras realizar estos pasos la regla de recepción de correo ha quedado completamente configurada, pero quizás no haya sido activada y sea necesario volver hacia atrás y activarla. Por tanto, una vez configurada y activa si enviamos un email a la cuenta o cuentas de nuestro dominio que hayamos creado (en nuestro ejemplo cualquier dirección de nuestro dominio, por ejemplo info@example.com), veremos como se almacena el mensaje en el bucket de S3 que acabamos de crear:

Regla de recepción de Amazon SES configurada

Regla de recepción de Amazon SES configurada

Listado de mensajes de correo electrónico almacenados en S3

Listado de mensajes de correo electrónico almacenados en S3

5. Verificación de nuestra dirección de GMail y creación de usuario SMTP

Para que Amazon SES acepte correo saliente procedente de nuestra cuenta de GMail es necesario verificarla y además crear un usuario SMTP:

Verificación de direcciones de correo de nuestro dominio

Verificación de direcciones de correo de nuestro dominio

Datos de configuración correo saliente SMTP

Datos de configuración correo saliente SMTP

Creación de credenciales de usuario SMTP

Creación de credenciales de usuario SMTP

En un primer momento nuestro recién configurado servicio de Amazon SES será puesto en cuarentena (sandbox) por parte de Amazon como medida de protección ante posibles abusos y envíos de spam. Para sacarlo de la cuarentena y permitir el envío normal de correo es necesario que abramos un ticket de soporte a Amazon para solicitarlo, o si no veremos como nuestros correos enviados rebotan con el siguiente mensaje de error:

554 Message rejected: Email address is not verified. The following identities failed the check in region EU-WEST-1: myexample@gmail.com

A continuación se muestra la página desde la que podemos solicitar que se nos saque de la cuarentena y un ejemplo del mensaje de solicitud. En nuestro ejemplo solicitamos unos límites más altos porque también vamos a utilizar el servicio de Amazon SES para el envío de una newsletter semanal a nuestros suscriptores:

Aviso cuarentena (sandbox) y botón para solicitar aumento del límite de envíos

Aviso cuarentena (sandbox) y botón para solicitar aumento del límite de envíos

Ejemplo de mensaje de solicitud de aumento del límite de envíos soporte Amazon

Ejemplo de mensaje de solicitud de aumento del límite de envíos soporte Amazon

6. Configuración de GMail para envío de correo con la dirección de nuestro dominio

Llegamos a la recta final. Ya sólo queda configurar GMail para enviar correo poniendo la dirección de nuestro dominio como remitente. Para recibir correo no hay que hacer nada, pues de eso se encarga el servicio SES y no precisa de ninguna configuración adicional. Entre las dos capturas de pantalla siguientes hay un paso intermedio que consiste en introducir los datos de configuración SMTP que obtuvimos en el paso 5:

Añadir otra dirección de correo a GMail

Añadir otra dirección de correo a GMail

Código de verificación nueva dirección

Código de verificación nueva dirección

7. Depuración de errores y estadísticas de envío

Por último, si las cosas no han ido bien y no conseguimos que nuestros correos se redirijan correctamente podemos obtener información de depuración de errores y mensajes de log de nuestra función Lambda gracias al servicio CloudWatch. También podemos obtener estadísticas de envío y recepción de correo por parte del servicio SES (ver imagen apartado 5) y estadísticas de funcionamiento de nuestra función Lambda:

Depuración mensajes de log en CloudWatch

Depuración mensajes de log en CloudWatch

Estadísticas de redirección de correos función Lambda

Estadísticas de redirección de correos función Lambda



 

Sobre el autor

Daniel López Azaña
Arquitecto de soluciones Cloud

Emprendedor, generador de ideas y mente inquieta. Apasionado de las nuevas tecnologías, especialmente de los sistemas Linux y del software libre. Me gusta escribir además sobre actualidad tecnológica, Cloud Computing, DevOps, seguridad, desarrollo web y programación, SEO, ciencia, innovación, emprendimiento, etc.

DanielUsar GMail gratis con tu propio dominio gracias a Amazon SES + Lambda

Artículos relacionados

22 comentarios

Unirte a la conversación
  • Manuel Asuar - 11/09/2017 responder

    Hola Daniel,
    He decido hacer una prueba con mi dominio y la cuenta de gmail.
    Ya está todo verificado y recibo los email en el S3 pero no puedo hacer un test desde la cuenta de gmail , me dice que no reconoce la dirección para esos servidores, y tampoco me funciona el lambda.
    He usado los servidores de US Virginia, tendría algo que ver?
    Gracias por tu tiempo.
    P.D.: Volveré a realizar los pasos, están muy claritos.

    Daniel - 11/09/2017 responder

    Hola Manuel, no debería tener nada que ver que la región que hayas elegido sea la de N. Virigina u otra. Si quieres copiame los mensajes de error que te aparezcan en CloudWatch para examinarlos y tratar de ver qué está pasando. ¿O no hay ningún log disponible? Si ese es el caso entonces lo más probable es que la regla de recepción de Amazon SES no tenga bien configurada la acción de ejecutar la función Lambda, sólo la de guardar el mensaje en S3. Asegúrate de que en Amazon SES -> Email Receiving -> Rule Sets -> View Active Rule Set -> Rule Name, en el apartado de Actions aparezca una acción S3 y otra Lambda, que ésta última tenga bien seleccionada en el desplegable la función que hayas creado para el reenvío de correos y que el tipo de invocación sea Event. Con esto al menos se te deberían mostrar mensajes de error en CloudWatch cada vez que llegue un nuevo correo para poder así depurar el problema.

  • Manuel Asuar - 12/09/2017 responder

    Buenas Daniel,
    he leido los mensajes de error del CloudWatch y me faltaba permitir enviar el mensaje leido, en el JSON, jeje.. ya funciona, gracias.
    Ahora el problema lo tengo en eNviar desde la cueta gmail como domio, el error es :
    554 Message rejected: Email address is not verified. The following identities failed the check in region US-EAST-1:
    Un saludo.

    Daniel - 12/09/2017 responder

    Me alegro de que ya te funcione. Ese error que comentas y lo que hay que hacer para solucionarlo están explicados en el punto 5.

  • alejandro - 13/10/2017 responder

    Hola Daniel, excelente aporte. Estoy buscando una solucion para superar el limite de envios diarios de gmail. Por lo que veo SES no proporciona una cuenta sino que termina siendo un routeador robusto de los mails o estoy equivocado? Saludos y gracias!

    Daniel - 13/10/2017 responder

    Hola Alejandro. Efectivamente, aunque sí permite usar distintas cuentas de envío y recepción, no proporciona una cuenta de correo equivalente a una de GMail, sino que está más enfocado al envío masivo de correo tipo newsletter o similar, o a la recepción de correo con el fin de efectuar algún tipo de procesamiento automático basado en reglas sobre el mismo. Si lo que quieres es algo similar a GMail o Google Suite, Amazon también proporciona un servicio equivalente: Amazon WorkMail.

    alejandro - 13/10/2017 responder

    Genial muchas gracias por tu ayuda.

  • Hector - 16/10/2017 responder

    Hola, gracias por la información tan completa, he realizado todos los pasos pero no logro que los mensajes queden en S3 y mucho menos que haga el reenvio a Gmail, es necesario tener el dominio completamente aparcado en Route53? Lo tengo asociado en un hosting común, dónde lo veo para navegar y subir archivos. Tendría que eliminar todos los registros de ese dns? es la duda que se me presenta con los servicios de Amazon si son compatibles. Gracias

  • Daniel - 19/10/2017 responder

    Hola Héctor. No es imprescindible usar los DNS de Amazon, pero para hacerlo funcionar al principio sí es necesario crear la zona correspondiente a tu dominio en Route53, de modo que se creen los registros requeridos por Amazon SES tal y como explico en el punto 2 de este mismo artículo. Una vez que ya todo funcione puedes replicar manualmente esos mismos registros que aparecen señalados en rojo a tu proveedor de DNS y prescindir de la zona de Route53.

  • Fernando - 02/01/2018 responder

    Hola buenos dias daniel ,tengo una duda con aws realmente me sirve nesesito aprox 15 cuentas de correo puedo usarlas solo con una cuenta de gmail que otra herramienta tiene aws para cubrir esa nesesidad que tengo
    saludos.

    Daniel - 02/01/2018 responder

    Sí, no hay problema en usar este método para gestionar una única dirección de email, 2, 3 ó 15 distintas desde la misma cuenta de GMail. También lo puedes usar para gestionar varias direcciones de email desde varias cuentas de GMail distintas, por ejemplo en el caso de empresas con varios empleados o colaboradores usando el mismo dominio. AWS tiene su propio servicio de correo que se llama WorkMail, pero entonces no podrías usar GMail directamente y tendrías que recurrir a métodos indirectos como este u otros, y entonces no tendría mucho sentido usar WorkMail.

  • Claudio - 03/02/2018 responder

    Hola Daniel primero que nada gracias por tomarte el tiempo de realizar el tutorial, estoy tratando de configurar los mails de mi dominio a travez de los servicios de amazon, pero no tengo muy claro el tema de los dns records, me interesa que siga redireccionado todo a mi hosting salvo la gestion de mail, de ser asi tengo que colocar los NS records de mi hosting y en el hosting los SOA y MX apuntar a amazon? Saludos

    Daniel - 18/02/2018 responder

    Efectivamente Claudio, si lo único que quieres gestionar con Amazon es el correo, entonces tienes que mantener toda la configuración DNS que te ofrezca tu proveedor de hosting, incluidos los registros de tipo NS y SOA, y tan sólo sustituir los registros MX por otros que apunten a Amazon.

  • César González - 10/03/2018 responder

    Hola Daniel.
    Tengo una cuenta en aws y tengo un servidor EC2 con windows server funcionando. Este servidor lo uso como una de mis capas de servicio (Modelo DataSnap), este tiene una REST para enviar correos de recuperación de claves y cambio de ellas, las cuales quiero enviar desde mi correo corporativo el cual ya tengo (info@midominio.com), la inquietud es que no he sabido como configurar mi hosting para que pueda recibir el registro txt que me pide esta aplicacion (SES), Uso Mydomain.com como gestor de dominio.

    Daniel - 12/03/2018 responder

    Hola César, los registros TXT no se reciben, se añaden al dominio como otro registro cualquiera de tipo A, CNAME, MX. En el panel de control del gestor de tu dominio debería haber un apartado “Zonas DNS” o similar que te permita gestionar las zonas DNS de tu dominio, que normalmente sólo será una y en la que estarán todos los registros DNS que tenga configurados ya por defecto tu dominio. Debería haber un botón de añadir o crear un nuevo registro DNS que te permita seleccionar su tipo (A, CNAME, MX, TXT, NS, SOA…) y un par clave/valor donde la clave sería el nombre que queremos asignar a esa entrada DNS y el valor suele ser una dirección IP u otro nombre DNS, y en el caso de los registros TXT una cadena de texto que puede ir o no entrecomillada.

  • Porfirio Ángel Díaz Sánchez - 12/03/2018 responder

    Qué tal Daniel, configuré el Simple Email Service para recibir correos en Gmail, pero tengo algunos problemas para enviar y recibir archivos con adjuntos.

    Hice algunas pruebas y puedo enviar adjuntos de hasta aproximadamente 7 megabytes, no sé si este límite se pueda incrementar, al menos a que sea igual al de gmail (25 megas)

    Y al recibir mensajes con adjuntos en ocasiones no puedo verlos en la interfaz de gmail, pero en el bucket del s3 sí se reciben.

    Ojalá puedas echarme la mano

    Daniel - 12/03/2018 responder

    Es cierto, yo también me he encontrado con esa limitación. Se produce un error Javascript (recordemos que la función Lambda que procesa los mensajes para su reenvío está escrita para NodeJS) cuando el tamaño del mensaje es superior a 10 MB. Como los adjuntos del email se codifican en Base64, esto equivale aproximadamente a un tamaño de adjunto de unos 6,8 MB aproximadamente. Cuando el mensaje supera ese tamaño la función Lambda no puede procesarlo y deja un error en el log de Amazon CloudWatch y el mensaje no se reenvía. Lo lamento, pero no he encontrado aún una solución para este problema. He visto algún código similar en Python que parece no tener esa limitación, y también algún otro enfoque que se basa en sustituir el fichero o ficheros adjuntos codificados en Base64 por un link en el cuerpo del mensaje hacia los ficheros adjuntos almacenados en el bucket de S3, pero no he conseguido aún una forma definitiva de salvar la mencionada limitación. Por tanto, de momento conviene tener la precaución de no enviar ficheros adjuntos muy grandes.

    Porfirio Ángel Díaz Sánchez - 12/03/2018 responder

    De momento estoy haciendo eso, tratar de no enviar adjuntos tan grandes.

    Sobre mi otro problema, cuando desde algún correo por ejemplo de hotmail envío algún adjunto al email que tengo asociado al amazon web services, y dicho correo tiene adjuntos, el correo no me llega a Gmail (y al bucket de s3 sí me llega), pero si no lleva adjuntos sí lo recibo.

    Daniel - 12/03/2018 responder

    No he detectado ningún problema relativo a los correos con ficheros adjuntos salvo el comentado anteriormente, por lo que si el adjunto de esos correos es inferior a esos 6,8 MB que mencionaba antes no sé qué problema se puede estar produciendo. Te recomiendo consultar los logs de Amazon CloudWatch, ya que ahí encontrarás la traza completa de lo que sucede con cada email y los posibles mensajes de error que se produzcan.

  • Wilson - 17/04/2018 responder

    Hola Daniel, excelente articulo, al principio me dio algunos problemas la configuracion pero ya logre que me funcionara, tengo un problema que no he podido resolver, como puede bajar o transferir los correos que recibo en S3 bucket a mi cuenta gmail u a los usuarios de las cuentas.

    Jorge García - 29/11/2018 responder

    Tengo exactamente la misma duda.

  • Daniel - 29/11/2018 responder

    Wilson, Jorge, el reenvío de correos desde el bucket de S3 al buzón de GMail se hace a través de la función Lambda tal y como se explica en los puntos 3 y 4. Saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

 

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.