C贸mo enviar un correo electr贸nico con boto y SES

    Introducci贸n

    Pr谩cticamente todas las aplicaciones y sitios web basados 鈥嬧媏n el usuario necesitan enviar un correo electr贸nico al usuario en alg煤n momento, por lo que eventualmente tendr谩 que lidiar con el alegre mundo del correo electr贸nico program谩tico. Est谩n apareciendo bastantes servicios para ayudarlo con esto, pero dado que cada aplicaci贸n tiene sus propios requisitos 煤nicos, pocos de estos servicios hacen el trabajo adecuadamente.

    Entonces, habiendo enfrentado el problema varias veces (y en algunos idiomas), decid铆 escribir esta breve publicaci贸n sobre c贸mo enviar correos electr贸nicos con boto y SES. La biblioteca boto es un contenedor muy agradable para Python que lo ayuda a interactuar con la API de AWS. Para ver algunas de sus capacidades, consulte mi otro art铆culo de boto sobre c贸mo cargar un archivo en s3.

    Preparar

    Antes de que realmente pueda hacer algo, necesitar谩 una cuenta de AWS (obviamente) junto con la clave de acceso y la clave secreta de su cuenta, que se utilizar谩 para autenticarse con los servidores SES. Hay un algunas formas diferentes puede usar las claves para autenticarse, pero aqu铆 solo las pasaremos al connect_to_region m茅todo proporcionado por boto.

    A continuaci贸n, deber谩 verificar con SES una direcci贸n de correo electr贸nico (una direcci贸n de Gmail funciona bien) o un dominio de su propiedad. Si solo est谩 probando esta funci贸n, le sugiero que verifique solo una direcci贸n de correo electr贸nico, ya que es un poco m谩s r谩pido. Todo lo que necesita hacer es hacer clic en un enlace en el correo electr贸nico de verificaci贸n que le env铆an, en lugar de agregar registros TXT a su archivo de zona para verificar un dominio.

    Si est谩 utilizando SES por primera vez y su aplicaci贸n deber谩 enviar un gran volumen de correos electr贸nicos, es posible que deba enviar una solicitud para aumentar su Cuota de env铆o. Su cuenta de SES se coloca inicialmente en una ‘caja de arena’, lo que significa que solo puede enviar 200 correos electr贸nicos en un per铆odo de 24 horas. Una vez que haya solicitado con 茅xito aumentar sus l铆mites de env铆o, deber铆a poder enviar muchos m谩s (me aprobaron 50,000 por d铆a, que es mucho m谩s de lo que necesito).

    El c贸digo

    Una vez que haya realizado la configuraci贸n inicial que mencion茅 anteriormente, deber铆a poder usar el c贸digo a continuaci贸n para enviar correos electr贸nicos.

    import boto.ses
    
    AWS_ACCESS_KEY = 'YOUR-ACCESS-KEY-HERE'
    AWS_SECRET_KEY = 'YOUR-SECRET-KEY-HERE'
    
    class Email(object):
        def __init__(self, to, subject):
            self.to = to
            self.subject = subject
            self._html = None
            self._text = None
            self._format="html"
    
        def html(self, html):
            self._html = html
    
        def text(self, text):
            self._text = text
    
        def send(self, from_addr=None):
            body = self._html
    
            if isinstance(self.to, basestring):
                self.to = [self.to]
            if not from_addr:
                from_addr="[email聽protected]"
            if not self._html and not self._text:
                raise Exception('You must provide a text or html body.')
            if not self._html:
                self._format="text"
                body = self._text
    
            connection = boto.ses.connect_to_region(
                'us-east-1',
                aws_access_key_id=AWS_ACCESS_KEY, 
                aws_secret_access_key=AWS_SECRET_KEY
            )
    
            return connection.send_email(
                from_addr,
                self.subject,
                None,
                self.to,
                format=self._format,
                text_body=self._text,
                html_body=self._html
            )
    

    Para usar este c贸digo, todo lo que necesita hacer es esto:

    email = Email(to='[email聽protected]', subject="You are HTML Awesome")
    email.text('This is a text body. Foo bar.')
    email.html('<html><body>This is a text body. <strong>Foo bar.</strong></body></html>')  # Optional
    email.send()
    

    los email.html() la llamada es opcional. Si incluye tanto texto como HTML en su correo electr贸nico, ambos se incluir谩n en el M脥MICA y el cliente de correo electr贸nico mostrar谩 el formato que sea compatible o preferido por el usuario.

    Usar plantillas de correo electr贸nico

    Si quiere ser realmente elegante, intente usar un motor de plantillas. En lugar de pasar la cadena del cuerpo del correo electr贸nico directamente, podemos cargarla desde una plantilla, de forma muy similar a como lo har铆a con una p谩gina HTML en un marco web como Django.

    Aqu铆 usamos el Jinja2 motor de plantillas para manejar la carga y la representaci贸n de la plantilla:

    import boto.ses
    from jinja2 import Environment, PackageLoader
    
    # Loads templates from the yourapp.templates folder
    env = Environment(loader=PackageLoader('yourapp', 'templates'))
    
    AWS_ACCESS_KEY = 'YOUR-ACCESS-KEY-HERE'
    AWS_SECRET_KEY = 'YOUR-SECRET-KEY-HERE'
    
    class Email(object):
        def __init__(self, to, subject):
            self.to = to
            self.subject = subject
            self._html = None
            self._text = None
    
        def _render(self, filename, context):
            template = env.get_template(filename)
            return template.render(context)
    
        def html(self, filename, context):
            self._html = self._render(filename, context)
    
        def text(self, filename, context):
            self._text = self._render(filename, context)
    
        def send(self, from_addr=None):
            # Same as before...
    

    Nota: Para el c贸digo de producci贸n, no ponga sus claves de seguridad de AWS directamente en su c贸digo. En su lugar, use algo como variables ambientales.

    El uso de este c贸digo es similar al anterior, pero en su lugar simplemente pasaremos el nombre de archivo de la plantilla y el contexto desde el cual se completar谩 la plantilla:

    email = Email(to='[email聽protected]', subject="OMG an Email!")
    ctx = {'username': user.username}
    email.text('email.txt', ctx)
    email.html('email.html', ctx)  # Optional
    email.send()
    

    Ahora puede crear y procesar correos electr贸nicos HTML f谩cilmente como lo hace con las p谩ginas web.

    Conclusi贸n

    Esperamos que este breve tutorial te haya resultado 煤til. El c贸digo aqu铆 deber铆a ser bueno para la mayor铆a de los casos de uso, aunque puede avanzar a煤n m谩s agregando Cc, Bcc, direcciones de respuesta, rutas de retorno o incluso archivos adjuntos.

    Todas estas funciones adicionales que acabo de mencionar, excepto los archivos adjuntos, pueden ser manejadas por el send_email funci贸n. Para enviar archivos adjuntos, deber谩 utilizar el nivel inferior send_raw_email funci贸n, que requiere que usted mismo cree el mensaje MIME. No se preocupe, eso no es demasiado dif铆cil gracias a al paquete de Python de correo electr贸nico, pero lo guardaremos para otro art铆culo.

    驴Te result贸 煤til? 驴Encontraste un error? 隆H谩zmelo saber en los comentarios!

     

    Deja una respuesta

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