¿Cómo crear un reenviador de correos sencillo usando AWS SES y Serverless?
Tags: serverlessarchitectu, serverless, amazonwebservices, awssimpleemailservic
Published: 2023-08-30 18:08:41

---
title: ¿Cómo crear un reenviador de correos sencillo usando AWS SES y Serverless?
published: true
date: 2020-12-26 21:45:10 UTC
tags: serverlessarchitectu,serverless,amazonwebservices,awssimpleemailservic
canonical_url: 
---

![](https://cdn-images-1.medium.com/max/1024/1*XqgLX4IjvdtH4dpmcAtIgw.png)

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.

![](https://cdn-images-1.medium.com/max/1024/1*fLAX_xriXNp0ljhur018KA.png)

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

![](https://cdn-images-1.medium.com/max/1024/1*iks5hYIcLcE7tpMsY1LBcw.png)

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

![](https://cdn-images-1.medium.com/max/786/1*fc0GmREFPyik6ZDeWiQvgA.png)

4. 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.

![](https://cdn-images-1.medium.com/max/779/1*JbUBK6LTHPQh_GfhKVx09g.png)

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
```

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í.

{% gist https://gist.github.com/AndresMorelos/ed8b5422755c959895ed3ec323c0a710 %}

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

{% gist https://gist.github.com/AndresMorelos/53c485bd2f3a0c675d12ea607ac1b267 %}

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
```

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.

{% gist https://gist.github.com/AndresMorelos/c5ebfa34391545e70632bbff7ce30654 %}

### 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).

![](https://cdn-images-1.medium.com/max/1024/1*1FMKkFZHtclA8VC375PqUA.png)

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

![](https://cdn-images-1.medium.com/max/548/1*6zPONSchjo1P_R1olFW2fA.png)

4. 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](https://github.com/AndresMorelos/aws-simple-email-forwarding)