DEV Community

Andrés Morelos
Andrés Morelos

Posted on • Originally published at andresmorelos.Medium on

¿Cómo crear un reenviador de correos sencillo usando AWS SES y Serverless?

Hace poco adquirí mi dominio personal y comenzé utilizar amazon web services en su capa gratuita para alojar mi sitio web; pero, me faltaba algo, el poder recibir correos electronicos bajo mi dominio.

Amazon cuenta con varios servicios que pueden proveer una solución a este problema, pero, personalmente se me hace caro el utilizar Amazon workmail por lo que decidí crear un reenviador de correos sencillos que basicamente lo que haría es escuchar los correos recibidos por un email en especifico y reenviarlos a mi correo de gmail, así que ahora comparto mis descubrimiento y solución.

Simple email service

Este servicio proveido por amazon nos permite enviar correos como cualquier servicio de correos SMTP, pero, además nos permite recibir correos electronicos para definidas reglas y haciendo uso de acciones procesarlos para realizar lo que deseemos con ellos.

Para hacer uso de este servicio necesitaremos de un dominio verificado en el sitio, para verificar un dominio debemos realizar los pasos detallados a continuación.

  1. Iniciamos sesión en nuestra consola y nos dirigimos al servicio Simple email service.

  1. Dentro del servicio nos dirigimos al apartado dominios y escogemos la opción verificar nuevo dominio (Verify a new domain).

  1. En el popup escribimos el dominio a verificar y selecionamos verificar el dominio (Verify this domain).

  1. El sistema nos arrojará unos registros TXT y MX que debemos configurar en nuestros registros DNS, si estamos utilizando Route53 como nuestro proveedor de registros DNS el sistema nos da la opción de agregarlo automaticamente al mismo.

Y listo, cuando nuestros nuevos registros DNS se repliquen y Amazon puedan comprobar que el dominio nos pertenece quedará activo y verificado.

Constucción de nuestro reenviador

Iniciaremos creando un nuevo repositorio haciendo uso del CLI de serverless, basta con ejecutar el siguiente comando en nuestra terminal.

serverless create --template aws-nodejs --name simple-fowarder
Enter fullscreen mode Exit fullscreen mode

Este comando nos creará un nuevo repositorio con el template para crear funciones que serán liberadas en Amazon Web Services.

Para realizar nuestra solución vamos a necesitar varios recursos por parte de Amazon:

  1. Un bucket en S3 : en este la información del correo será almacenada con un identificar especial para cada uno.
  2. Una función Lambda : esta función nos permitirá procesar el correo entrante y decidir que realizar con él.
  3. Una receta de regla para el servicio SES: Esta regla nos permitirá definir las acciones que tendrá el servicio y el email que escuchará.
  4. Un rol IAM con permisos de Agregar, Obtener y eliminar datos del Bucket, y adicionalmente enviar correos desde ** SES.**

Adicionalmente nuestro Lambda necesitará de permisos para que la regla del servicio SES lo pueda invocar, nuestro archivo serverless quedaría más o menos así.

Nuetros archivo serverless en este momento posee:

  1. Bajo la propiedad iamRoleStatements establecemos los permisos necesarios para nuestro bucket y funcion lambda para agregar, obtener y eliminar datos de S3, además de poder enviar correos utilizando SES.
  2. Una función llamada processEmails la cual será la encargada de procesar el email entrante y reenviarlo.
  3. Un recurso de tipo Bucket bajo el nombre EmailsBucket en este bucket se almacenará la información de los emails entrantes a reenviar.
  4. Un recurso para las politicas del bucket bajo el nombre EmailsBucketPolicy la cual le da permisos al servicio SES de agregar los objetos de los correos.
  5. Un recurso que le otorga permisos al servicio SES para invocar nuestra función lambda bajo el nombre GiveSESPermissionToInvokeProcessEmailLambdaFunction
  6. Un recurso con la receta para el servicio SES bajo el nombre SesLambdaRule.

En este ultimo recurso cabe resaltar varias propiedades tal cómo lo son Actions donde podemos encontrar que estan referenciados los recursos del Bucket y la función Lambda, además de la propiedad Recipients , esta propiedad es crucial puesto que en ella se agrega el correo o grupo de correos del cual se escucharan los mensajes entrantes, en dado caso que este vacia la propiedad el servicio escuchará los mensajes entrantes de cualquier correo bajo nuestro dominio.

Si nos podemos dar cuenta estoy manejando las configuraciónes del servico utilizando archivos JSON localizados en una carpeta llamda config ubicada al mismo nivel que nuestro archivo serverless.yml cada stage poseera su propio archivo de configuración y sus valores de variables.

Este es un ejemplo de nuestro archivo de configuración

pero ahora pasemos a la creación de nuestra función Lambda que procesará los correos.

para ello necesitamos inicializar un npm para poder instalar la librería aws-sdk necesaria para poder obtener los datos del correo y reenviarlo, para hacerlo ejecutamos los comando

npm init -y
npm install aws-sdk --save
Enter fullscreen mode Exit fullscreen mode

En nuestro archivo handler.js debemos renombar la función exportada hello a processEmails ya que esta es la refenciada a ejecutarse cuando nuestro lambda se invoque en el archivo serverless.yml , luego de ello nos bastaria escribir el siguiente código.

Limitaciones

Amazon SES en su SandBox solo permite el envio de correos desde emails verificados, para verificar un correo podemos seguir los siguientes pasos:

  1. Nos dirigirmos nuevamente a la consola de AWS y buscamos el servicio SES.
  2. Seleccionamos la pestaña Correos electronicos (Email Addresses) y clickeamos la opcion Verificar una nueva dirección de correo(Verify a new email address).

  1. En el popup escribimos el correo a verificar y seleccionamos el botón de Verificar esta dirección de correo (verify this email adress).

  1. Nos dirigimos a la bandeja de entrada del correo a verificar, buscamos el correo recibido por parte de amazon y damos click en el enlace para verificar el mismo.

Listo con ello tenemos verificado el correo y podremos hacer uso de esta herramienta.

Para ver toda la implementación realizada visiten el siguiente repositorio.

AndresMorelos/aws-simple-email-forwarding

Top comments (0)