C贸mo enviar correos electr贸nicos con Gmail usando Python

    Hay varias formas de enviar correo electr贸nico con Python, ya sea a trav茅s de una biblioteca de terceros como boto y SES, o mediante un protocolo de correo electr贸nico como SMTP. Si bien el tema de usar Python para enviar correos electr贸nicos puede parecer que se ha hecho hasta la muerte, hay muchas formas diferentes de hacerlo y muchos problemas que pueden surgir. Pens茅 que ser铆a 煤til escribir un tutorial sobre c贸mo enviar correos electr贸nicos con Gmail como proveedor usando Python.

    El protocolo SMTP

    Puede que esto no sea una sorpresa, pero, por supuesto, Python ya tiene una biblioteca que le permite conectarse a un SMTP servidor, como el que usa Gmail. Esta biblioteca se llama, como era de esperar, smtplib y viene incluido con Python.

    SMTP (Protocolo simple de transferencia de correo) es un protocolo de nivel de aplicaci贸n (adem谩s de TCP) que se utiliza para comunicarse con servidores de correo desde servicios externos, como un cliente de correo electr贸nico en su tel茅fono. SMTP es solo un protocolo de entrega, por lo que en realidad no puede recuperar correo electr贸nico con 茅l, solo puede enviar correo electr贸nico, que es en lo que nos centraremos en este art铆culo. Si desea recuperar el correo electr贸nico en su lugar, querr谩 consultar el IMAP (Protocolo de acceso a mensajes de Internet).

    Debo se帽alar que muchos servicios de correo electr贸nico, como Gmail, no suelen utilizar SMTP en sus servidores de correo internos. SMTP generalmente se proporciona como una interfaz externa a su servicio a trav茅s del smtp.gmail.com servidor. Esto est谩 destinado principalmente a ser utilizado por clientes de correo electr贸nico en su tel茅fono o computadora (como Outlook, Thunderbird, etc.).

    Abrir la conexi贸n

    Como ya se mencion贸, Python viene convenientemente con el smtplib, que maneja todas las diferentes partes del protocolo, como la conexi贸n, la autenticaci贸n, la validaci贸n y, por supuesto, el env铆o de correos electr贸nicos.

    Con esta biblioteca, hay algunas formas diferentes de crear una conexi贸n con su servidor de correo. En esta secci贸n, nos centraremos en crear una conexi贸n simple e insegura (que rara vez, si es que alguna vez, deber铆a usarse). Esta conexi贸n no est谩 encriptada y por defecto es el puerto 25. Sin embargo, el protocolo para el env铆o de correo realmente usa 587, que es lo que usaremos.

    Estas conexiones son realmente simples de crear con smtplib. La versi贸n no cifrada se puede crear con:

    import smtplib
    
    try:
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.ehlo()
    except:
        print 'Something went wrong...'
    

    Y eso es. Realmente no hay mucho m谩s que pasar la direcci贸n del servidor, el puerto y la llamada .helo(), que lo identifica en el servidor SMTP. Usando esto server objeto ahora puede enviar correo electr贸nico a trav茅s de una conexi贸n insegura.

    Nota: Es posible que a煤n no est茅 listo para enviar correos electr贸nicos. Gmail impone algunas restricciones a las conexiones SMTP como esta. Consulte la secci贸n “Autenticaci贸n con Gmail” a continuaci贸n para obtener m谩s informaci贸n.

    Usando una conexi贸n segura

    Cuando una conexi贸n SMTP est谩 protegida mediante TLS / SSL, se realiza a trav茅s del puerto 465 y normalmente se denomina SMTPS. No hace falta decir que siempre debe utilizar una conexi贸n segura.

    Hay algunas formas diferentes de proteger sus conexiones SMTP en el smtplib biblioteca. La primera forma es crear primero una conexi贸n insegura y luego actualizar a TLS. Esto se hace usando el .starttls() m茅todo.

    import smtplib
    
    try:
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.ehlo()
        server.starttls()
        # ...send emails
    except:
        print 'Something went wrong...'
    

    Tenga en cuenta que si bien esto es muy similar a la conexi贸n insegura anterior que creamos, todo lo que es diferente es que estamos usando el .starttls() m茅todo para actualizar la conexi贸n a segura.

    Su otra opci贸n es crear una conexi贸n SSL desde el principio. En este caso, querr谩 utilizar el .SMTP_SSL() m茅todo en su lugar:

    import smtplib
    
    try:
        server_ssl = smtplib.SMTP_SSL('smtp.gmail.com', 465)
        server_ssl.ehlo()   # optional
        # ...send emails
    except:
        print 'Something went wrong...'
    

    Entre otras peque帽as diferencias, usamos el puerto SMTPS (465) de inmediato, aunque puede dejar el par谩metro del puerto fuera de esto y smtplib de todos modos, el valor predeterminado ser谩 465.

    Ahora que tenemos nuestra conexi贸n, creemos un correo electr贸nico.

    Crear el correo electr贸nico

    Los correos electr贸nicos, en el fondo, son solo cadenas de texto conectadas por caracteres de nueva l铆nea. La mayor铆a de los correos electr贸nicos tendr谩n al menos los campos “De”, “Para”, “Asunto” y un cuerpo. He aqu铆 un ejemplo sencillo:

    From: [email聽protected]
    To: [email聽protected], [email聽protected]
    Subject: OMG Super Important Message
    
    Hey, what's up?
    
    - You
    

    Como puede ver, cada l铆nea contiene un nuevo campo con sus datos. Sin protocolo binario, sin XML, sin JSON, solo cadenas separadas por l铆neas.

    Una forma sencilla de parametrizar estos campos es usar formato de cadena en Python:

    sent_from = '[email聽protected]'
    to = ['[email聽protected]', '[email聽protected]']
    subject="OMG Super Important Message"
    body = 'Hey, what's up?nn- You'
    
    email_text = """
    From: %s
    To: %s
    Subject: %s
    
    %s
    """ % (sent_from, ", ".join(to), subject, body)
    

    Ahora todo lo que tienes que hacer es pasar el email_text cadena a smtplib, que mostraremos en la siguiente secci贸n, y listo.

    Autenticarse con Gmail

    Hay algunos pasos que debe seguir antes de poder enviar correos electr贸nicos a trav茅s de Gmail con SMTP, y tiene que ver con la autenticaci贸n. Si est谩 utilizando Gmail como proveedor, deber谩 indicarle a Google que le permita conectarse a trav茅s de SMTP, que se considera un m茅todo “menos seguro”.

    Realmente no puede culpar a Google por configurarlo de esta manera, ya que su aplicaci贸n (o alguna otra aplicaci贸n de terceros) necesitar谩 tener su contrase帽a de texto simple para que esto funcione, lo cual definitivamente no es ideal. No es como el protocolo OAuth en el que se emite un token revocable, por lo que tienen que encontrar otra forma de asegurarse de que ninguna parte no autorizada acceda a sus datos.

    Para muchos otros proveedores de correo electr贸nico, no necesitar谩 realizar ninguno de los pasos adicionales que describo aqu铆.

    Primero, querr谩 permitir que aplicaciones menos seguras accedan a su cuenta. Para obtener instrucciones detalladas sobre c贸mo hacer esto, debe consultar esta p谩gina:

    Permitir que aplicaciones menos seguras accedan a su cuenta

    Si tiene habilitada la verificaci贸n en dos pasos en su cuenta, deber谩 crear una contrase帽a espec铆fica de la aplicaci贸n para aplicaciones menos seguras como esta. En ese caso, deber谩 seguir las instrucciones aqu铆:

    Iniciar sesi贸n con contrase帽as de aplicaciones

    Y finalmente, si todav铆a est谩s recibiendo un SMTPAuthenticationError con un c贸digo de error 534, deber谩 realizar otro paso para que esto funcione.

    Desbloqueo de pantalla Captcha

    No he tenido que hacer este 煤ltimo paso para mis propias cuentas, pero he le铆do que en realidad no funciona de inmediato. Aparentemente, despu茅s de habilitar aplicaciones menos seguras, es posible que deba esperar unos minutos antes de probar el enlace ‘Mostrar Desbloquear Captcha’. Si se encuentra con este problema y encuentra una buena manera de solucionarlo, 隆h谩ganoslo saber en los comentarios!

    En cuanto al c贸digo Python real, todo lo que necesita hacer es llamar al login m茅todo:

    import smtplib
    
    gmail_user="[email聽protected]"
    gmail_password = '[email聽protected]!'
    
    try:
        server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
        server.ehlo()
        server.login(gmail_user, gmail_password)
    except:
        print 'Something went wrong...'
    

    Env铆o del correo electr贸nico

    Ahora que tiene su conexi贸n SMTP configurada y autoriz贸 su aplicaci贸n con Google, finalmente puede usar Python para enviar correos electr贸nicos con Gmail.

    Usando la cadena de correo electr贸nico que construimos arriba, y el conectado / autenticado server objeto, necesitas llamar al .sendmail() m茅todo. Aqu铆 est谩 el c贸digo completo, incluidos los m茅todos para cerrar la conexi贸n:

    import smtplib
    
    gmail_user="[email聽protected]"
    gmail_password = '[email聽protected]!'
    
    sent_from = gmail_user
    to = ['[email聽protected]', '[email聽protected]']
    subject="OMG Super Important Message"
    body = 'Hey, what's up?nn- You'
    
    email_text = """
    From: %s
    To: %s
    Subject: %s
    
    %s
    """ % (sent_from, ", ".join(to), subject, body)
    
    try:
        server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
        server.ehlo()
        server.login(gmail_user, gmail_password)
        server.sendmail(sent_from, to, email_text)
        server.close()
    
        print 'Email sent!'
    except:
        print 'Something went wrong...'
    

    Conclusi贸n

    Aparte de los pasos de autorizaci贸n espec铆ficos de Gmail (que involucran aplicaciones menos seguras, etc.), este c贸digo deber铆a funcionar para casi cualquier otro proveedor de correo electr贸nico que admita el acceso SMTP, asumiendo que tiene la direcci贸n y el puerto del servidor correctos. Si descubre que otros proveedores imponen restricciones especiales al acceso SMTP como lo hace Google, 隆h谩ganoslo saber! Nos gustar铆a incluir tanta informaci贸n como sea posible aqu铆.

    驴Env铆a correos electr贸nicos mediante programaci贸n con SMTP? 驴Para qu茅 tipo de aplicaciones lo usas? 隆H谩znoslo saber en los comentarios!

    Recursos

    Editar: Gracias a cropr (en los comentarios) por se帽alar que Gmail impone una serie de restricciones a las personas que env铆an correo electr贸nico con SMTP. Las cuentas gratuitas est谩n limitadas a 500 correos electr贸nicos por d铆a y tienen una tasa limitada de aproximadamente 20 correos electr贸nicos por segundo.

    Si cree que va a superar estos l铆mites, es posible que desee configurar su propio servidor SMTP o utilizar servicios como AWS SES o Sendgrid.

     

    Etiquetas:

    Deja una respuesta

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