Blog
AWS SDK para Python (Boto3) – SES
- Publicado por: Jhonny
- Categoría: Blog
Integrar Amazon SES en nuestra plataforma
Crear y enviar emails de ejemplo
SES
Simple Email Service es un servicio de envío de emails basado en la nube diseñado para facilitar el envío de correos electrónicos y notificaciones de nuestras aplicaciones.
Configuración
Debemos iniciar sesion en nuestra cuenta de AWS e ir al servicio “Simple Email Service” y allí agregar un dominio para utilizarlo. Cabe resaltar que debemos tener acceso al gestor de nuestro dominio para añadir un nuevo DNS Record y de esa manera AWS verifique somos propietarios del dominio.
Nota: El Record es un TXT que con un hash que nos proveerá AWS.
Envio de correos electrónicos
Al utilizar SES para enviar correos electrónicos tenemos varias funciones que podemos utilizar. Entre ellas está send_email. Esta función compone un email e inmediatamente lo empuja a una cola para enviarlo, la cual es increíblemente rápida. Existen condiciones para que el envío del mensaje sea exitoso, entre ellas tenemos las siguientes:
- El mensaje debe ser enviado desde una dirección de email verificada por AWS (Debes añadir el DNS Record a tu dominio para verificarla), de lo contrario recibiras un error llamado “Email address not verified”.
- El tamaño máximo del mensaje es de 10 MB
- El mensaje debe incluir al menos una dirección de correo electrónico para enviar el mensaje, puede ser To Bcc o CC.
- El mensaje no debe incluir más de 50 recipientes, es el límite de AWS. Si queremos enviar a más de 50 recipientes debemos enviar el mismo email de 50 en 50.
- Ahora que sabemos todas las condiciones, procedamos a la sintaxis de boto3 para poner en práctica la función send_email.
import boto3 client = boto3.client('ses', aws_access_key_id="TU_ACCESS_KEY_ID", aws_secret_access_key="TU_SECRET_ACCESS_KEY", region_name="TU_REGION_NAME") client.send_email( Source="tuemail@unipython.com", Destination={ # Lista de emails a los cuales sera enviado el correo electrónico 'ToAddresses': ['ejemplo@unipython.com'], # En caso de que queramos enviar una copia oculta, podemos añadir este parámetro. 'BccAddresses': ['bcc@unipython.com'] }, Message={ 'Subject': { # Titulo del correo electronico a enviar 'Data': 'AWS SDK para Python (Boto3)', 'Charset': 'UTF-8' }, 'Body': { 'Text': { # Cuerpo del correo electrónico 'Data': "Esto es un ejemplo de mensaje utilizando Boto3.", 'Charset': 'UTF-8' } } } )
Con el anterior bloque de código, podemos enviar satisfactoriamente un correo electrónico. Pero… ¿y si queremos enviar un correo electrónico utilizando un template con html? Para realizarlo es necesario utilizar la función send_raw_email que nos provee boto3.
Dicha función es más flexible en cuanto a customizacion que send_email, debido a que puedes especificar los headers del mensaje tanto como el contenido. Es bastante útil, por ejemplo, cuando quieres enviar un mensaje con texto, html e incluso adjuntar un archivo esta función es lo que debes utilizar.
Aunque es más flexible que send_email, también contiene los mismos requerimientos que debemos tomar en cuenta al momento de enviar mensajes.
A pesar de que podemos customizar los headers del mensaje, al utilizar esta operación, Amazon SES automáticamente aplica su propio Message-ID y Date headers. Entonces, si queremos enviar esos headers con nuestros propios valores, Amazon SES los sobreescribirá.
Luego de saber los requerimientos aca esta la sintaxis que debemos manejar para poder realizar envíos de mensajes modificando nuestros Headers para poder incluir html y archivos adjuntos.
import boto3 client = boto3.client('ses', aws_access_key_id="TU_ACCESS_KEY_ID", aws_secret_access_key="TU_SECRET_ACCESS_KEY", region_name="TU_REGION_NAME") source = "tuemail@unipython.com" to = ['ejemplo@unipython.com'] subject = 'AWS SDK para Python (Boto3)' content = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p style="color: red">Esto es un ejemplo de mensaje utilizando Boto3.</p> </body> </html> """ message_dict = { 'Data': # el correo que enviara el mensaje 'From: ' + source + '\n' # Se utiliza ",".join(to) para que de como resultado una lista de emails separadas por comas (string) 'To: ' + ",".join(to) + '\n' # Titulo del correo electrónico 'Subject: ' + subject + '\n' 'MIME-Version: 1.0\n' # Contenido HTML 'Content-Type: text/html;\n\n' + content} client.send_raw_email( Destinations=to, RawMessage=message_dict, Source=source, )
Aunque también hay otras formas de enviar correos con templates utilizando boto3, esta es la forma más sencilla. Ahora, adjuntamos un archivo a nuestro correo electrónico para hacerlo más útil!
import os from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication import boto3 client = boto3.client('ses', aws_access_key_id="TU_ACCESS_KEY_ID", aws_secret_access_key="TU_AWS_SECRET_ACCESS_KEY", region_name="TU_REGION_NAME") source = "tuemail@unipython.com" to = ['ejemplo@unipython.com'] subject = 'AWS SDK para Python (Boto3)' content = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p style="color: red">Esto es un ejemplo de mensaje utilizando Boto3.</p> </body> </html> """ multipart_content_subtype = 'alternative' msg = MIMEMultipart(multipart_content_subtype) msg['Subject'] = subject msg['From'] = source msg['To'] = ",".join(to) archivos = ["/path/to/file"] part = MIMEText(content, 'html') msg.attach(part) # Añadir archivos al correo electrónico for archivo in archivos: with open(archivo, 'rb') as f: part = MIMEApplication(f.read()) part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(archivo)) msg.attach(part) client.send_raw_email( Source=source, Destinations=to, RawMessage={'Data': msg.as_string()} )
Con este ultimo ejemplo, hemos terminado la parte de SES y estas listo para integrarlo en tu plataforma! Felicidades!