¿Cómo enviar correos electrónicos a través de Gmail en Python?

Enviar una gran cantidad de correos electrónicos manualmente es una tarea tediosa. Puede utilizar servicios de terceros para enviar correos electrónicos de forma masiva a la vez.

¿Qué tal si creas tu propio script personalizado para enviar correos electrónicos?

¿No es maravilloso?

Sí lo es. Vamos a escribir un script en Python para enviar correos electrónicos.

Python tiene una biblioteca llamada smtplib que se usa para enviar correos electrónicos. La biblioteca smtplib se basa en SMTP (Protocolo simple de transporte de correo). SMTP se utiliza para enviar correos electrónicos a otros.

Configurar Gmail

Aquí, vamos a utilizar Gmail como proveedor de correo electrónico. Google no permite que los scripts inicien sesión. Y debemos hacer un cambio en la seguridad de nuestra cuenta de Gmail que permita que los scripts inicien sesión en nuestra cuenta de Gmail.

Cambiar la opción de seguridad en nuestra cuenta de Gmail no es bueno ya que permite que otros accedan a la cuenta muy fácilmente. Se recomienda crear una nueva cuenta de Gmail. Ir a la configuración aquí y active la configuración Permitir aplicaciones menos seguras: ACTIVADO.

Si no se siente cómodo activando la configuración anterior, puede usar la API de Google para iniciar sesión en su cuenta de Gmail. Puede encontrar el script para usar las API de Google para la autenticación aquí.

Pasos para enviar correo

Se deben realizar ciertos pasos para enviar un correo utilizando la biblioteca smtplib. Primero veamos los pasos y luego escribiremos el guión.

#1. Conexión al servidor SMTP

Cada proveedor de servicios tendrá un nombre de dominio y un puerto de servidor SMTP diferentes. Tenemos que usar el nombre de dominio del servidor SMTP y el puerto del proveedor de correo electrónico que vamos a usar en el script. El nombre de dominio del servidor SMTP y el puerto de Gmail son smtp.gmail.com y 465.

Usaremos el cifrado SSL para la conexión del servidor SMTP, ya que es más seguro que el cifrado TSL. Si desea utilizar el cifrado TSL, utilice el puerto 587 en lugar del 465. El nombre de dominio del servidor SMTP será diferente según el proveedor de servicios de correo electrónico.

El código para conectarse al servidor SMTP

server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)

#2. Acceso

Una vez que se establece la conexión con el servidor SMTP, podemos iniciar sesión utilizando la dirección de correo electrónico y la contraseña con el método del objeto SMTP de inicio de sesión. El código se ve de la siguiente manera.

server.login(sender_email, password)

#3. Enviar correo

Después de iniciar sesión, no hay forma de que podamos esperar para enviar el correo. Envíe el correo usando el método sendmail. Asegúrese de enviar el correo en el siguiente formato.

Asunto: your_subject_for newline mail_content

Los espacios no son necesarios. Son solo para aclaración en el formato anterior. Veamos el código de muestra.

server.sendmail(sender_mail, email, f"Subject: {subject}n{content}")

#4. Abandonar

No olvide salir del SMTP c

Hemos visto los pasos para enviar correo usando Python. Pero, no hemos discutido el código completo. Repasemos rápidamente el código.

import smtplib, ssl

class Mail:

    def __init__(self):
        self.port = 465
        self.smtp_server_domain_name = "smtp.gmail.com"
        self.sender_mail = "GMAIL_ADDRESS"
        self.password = "SECURE_PASSWORD"

    def send(self, emails, subject, content):
        ssl_context = ssl.create_default_context()
        service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context)
        service.login(self.sender_mail, self.password)
        
        for email in emails:
            result = service.sendmail(self.sender_mail, email, f"Subject: {subject}n{content}")

        service.quit()


if __name__ == '__main__':
    mails = input("Enter emails: ").split()
    subject = input("Enter subject: ")
    content = input("Enter content: ")

    mail = Mail()
    mail.send(mails, subject, content)

Hemos creado una clase llamada Mail. Y tiene un método llamado enviar para enviar los correos. Clase de escritura o simplemente no depende de usted. La clase lo hace más legible. Hemos implementado todos los pasos discutidos anteriormente uno por uno en el método de envío.

¡Viva! ha enviado un correo usando el script de Python.

Contenido HTML

¿Qué sucede si desea enviar el correo en HTML? ¿Es posible?

Si, Por qué no. Podemos enviar el correo usando la librería HTML llamada email.mime. Es una biblioteca integrada.

los MÍMICA es un estándar utilizado para extender el formato de los correos electrónicos para admitir programas de aplicación, video, imágenes, etc.,

Hay dos clases que necesitamos del módulo email.mime. Son MIMEText y MIMEMultipart. Veamos una breve explicación sobre ellos.

#1. Texto MIME

La clase MIMEText se utiliza para escribir nuestro contenido de correo en HTML. Crearemos una instancia de la clase MIMEText pasando contenido HTML y el tipo de contenido. Vea el código de ejemplo a continuación.

html_content = MIMEText(html_template, 'html')

Algunos servicios de correo no admiten la representación de HTML. Por lo tanto, es mejor crear dos instancias de la clase MIMEText para texto sin formato y HTML.

#2. MIMEMultiparte

La clase MIMEMultipart se usa para simplificar el formato y la escritura del asunto, desde la dirección hasta la dirección, etc. Daremos el contenido creado con la clase MIMEText a MIMEMultipart usando el método de conexión.

Necesitamos asegurarnos de que la instancia de MIMEMultipart se cree con el argumento alternativo para representar texto sin formato o HTML. Enviemos un correo con contenido HTML.

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


class Mail:

    def __init__(self):
        ...

    def send(self, emails):
        ssl_context = ssl.create_default_context()
        service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context)
        service.login(self.sender_mail, self.password)
        
        for email in emails:
            mail = MIMEMultipart('alternative')
            mail['Subject'] = 'kirukiru.es Celebrations'
            mail['From'] = self.sender_mail
            mail['To'] = email

            text_template = """
            kirukiru.es

            Hi {0},
            We are delighted announce that our website hits 10 Million views this month.
            """
            html_template = """
            <h1>kirukiru.es</h1>

            <p>Hi {0},</p>
            <p>We are delighted announce that our website hits <b>10 Million</b> views last month.</p>
            """

            html_content = MIMEText(html_template.format(email.split("@")[0]), 'html')
            text_content = MIMEText(text_template.format(email.split("@")[0]), 'plain')

            mail.attach(text_content)
            mail.attach(html_content)

            service.sendmail(self.sender_mail, email, mail.as_string())

        service.quit()


if __name__ == '__main__':
    mails = input("Enter emails: ").split()

    mail = Mail()
    mail.send(mails)

También puede agregar una copia oculta usando ese atributo Bcc en la instancia de MIMEMultipart.

Agregar archivos adjuntos

Los archivos adjuntos pueden ser imágenes, archivos PDF, documentos, hojas, etc. Se llama MIMEBase en la clase email.mime. Se utiliza para agregar archivos adjuntos al correo.

Agreguemos un archivo adjunto al correo anterior.

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from pathlib import Path


class Mail:

    def __init__(self):
        ...

    def send(self, emails):
        ## login...
        
        for email in emails:
            ## MIMEMultipart instance

            ## text and html templates

            ## MIMEText instances

            ## attaching messages to MIMEMultipart

            ## attaching an attachment
            file_path = "kirukiru.es-logo.png"
            mimeBase = MIMEBase("application", "octet-stream")
            with open(file_path, "rb") as file:
                mimeBase.set_payload(file.read())
            encoders.encode_base64(mimeBase)
            mimeBase.add_header("Content-Disposition", f"attachment; filename={Path(file_path).name}")
            mail.attach(mimeBase)

            ## sending mail

        service.quit()


if __name__ == '__main__':
    mails = input("Enter emails: ").split()

    mail = Mail()
    mail.send(mails)

Correo a correos masivos a la vez

Hemos utilizado un bucle para enviar el mismo correo a varios miembros. Ese es un caso (cuando no desea que los receptores sepan acerca de otros receptores).

Suponga que tiene que enviar el mismo correo a 1000 miembros a la vez del mismo grupo. En tales casos, el uso de un bucle no será apropiado. Podemos agregar varios correos electrónicos en el campo Para en la redacción de correo general. ¿Cómo hacerlo en el script de Python?

Necesitamos combinar la lista de correos electrónicos como una cadena separada por una coma y un espacio. Podemos usar la cadena del método de unión para combinar todos los correos electrónicos como una cadena. Vea el código para combinar correos electrónicos como una cadena.

", ".join(emails)

Reemplace el campo Para en el script anterior usando la cadena anterior. Ya está, has enviado el correo a correos masivos de una vez.

Conclusión

Hay algunas bibliotecas de terceros para enviar correos electrónicos en Python. Algunos de ellos son Sobres, Yagmail, flanqueador, etc., estas librerías nos ayudan a escribir scripts con pocas líneas de código. También puedes explorarlos.

Ahora, puede automatizar sus correos electrónicos usando secuencias de comandos de Python. La estructura de envío de correos electrónicos será diferente según su caso de uso. Hemos visto diferentes escenarios de envío de correos electrónicos. Puede personalizar fácilmente los scripts discutidos en el tutorial para su caso de uso. He tomado la referencia de este artículo.

Codificación feliz 🙂