¿Cómo enviar correos electrónicos a través de Gmail en Python?
Publicado: 2021-06-06Enviar una gran cantidad de correos electrónicos manualmente es una tarea tediosa. Puede utilizar servicios de terceros para enviar los correos electrónicos de forma masiva a la vez.
¿Qué tal si crea su 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 otras personas.
Configurar Gmail
Aquí, usaremos Gmail como proveedor de correo electrónico. Google no permite que los scripts inicien sesión. Y necesitamos 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 con mucha facilidad. Se recomienda crear una nueva cuenta de Gmail. Vaya 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
Es necesario realizar ciertos pasos para enviar un correo utilizando la biblioteca smtplib . Veamos primero los pasos y luego escribiremos el guión.
# 1. Conexión al servidor SMTP
Cada proveedor de servicios tendrá un puerto y un nombre de dominio de servidor SMTP diferente. 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 y el puerto del servidor SMTP para Gmail son smtp.gmail.com y <em>465</em> .
Usaremos 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 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 login . El código tiene el siguiente aspecto.
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 utilizando 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 aclaraciones en el formato anterior. Veamos el código de muestra.
server.sendmail(sender_mail, email, f"Subject: {subject}\n{content}")# 4. Renunciar
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. La clase de escritura o simplemente no depende de ti. 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 electrónico utilizando la secuencia de comandos de Python.
Contenido HTML
¿Qué pasa si desea enviar el correo en HTML? ¿Es posible?
Si, Por qué no. Podemos enviar el correo usando HTML a la biblioteca llamada email.mime . Es una biblioteca incorporada.
El MIME es un estándar que se utiliza para ampliar el formato de los correos electrónicos para admitir programas de aplicación, videos, 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. MIMEText
La clase MIMEText se utiliza para escribir el contenido de nuestro correo en HTML. Crearemos una instancia de la clase MIMEText pasando contenido HTML y el tipo de contenido. Vea el código de muestra a continuación.

html_content = MIMEText(html_template, 'html')Algunos servicios de correo no admiten la representación HTML. Por lo tanto, es mejor crear dos instancias de la clase MIMEText para texto sin formato y HTML.
# 2. MIMEMultipart
La clase MIMEMultipart se usa para simplificar el formato y la escritura del tema, desde la dirección, hasta la dirección, etc. Daremos el contenido creado con la clase MIMEText a MIMEMultipart usando el método attach .
Necesitamos asegurarnos de que la instancia de MIMEMultipart se crea con el argumento alternative 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'] = 'Geekflare Celebrations' mail['From'] = self.sender_mail mail['To'] = email text_template = """ Geekflare Hi {0}, We are delighted announce that our website hits 10 Million views this month. """ html_template = """ <h1>Geekflare</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 Bcc usando ese atributo Bcc en la instancia MIMEMultipart.
Agregar archivos adjuntos
Los archivos adjuntos pueden ser imágenes, pdfs, documentos, hojas, etc. Se llama MIMEBase en la clase email.mime . Se usa 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 = "Geekflare-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 sobre 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. Eso es todo, ha enviado el correo a correos masivos a la vez.
Conclusión
Hay algunas bibliotecas de terceros para enviar correos electrónicos en Python. Algunas de ellas son Envelopes, Yagmail, Flanker, etc., estas librerías nos ayudan a escribir scripts con pocas líneas de código. También puedes explorarlos.
Ahora, puede automatizar su correo electrónico utilizando scripts 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
