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 *