Cómo enviar mensajes de correo electrónico automatizados en Python

En este artículo, veremos cómo enviar mensajes de correo electrónico automatizados que implican la entrega de mensajes de texto, fotos esenciales y archivos importantes, entre otras cosas. en Python. 

Usaremos dos bibliotecas para esto: email y smtplib , así como el objeto MIMEMultipart. Este objeto tiene múltiples subclases; estas subclases se utilizarán para construir nuestro mensaje de correo electrónico.

  • MIMEText: Consiste en texto simple. Este será el cuerpo del correo electrónico.
  • MIMEImage: Esto nos permitiría agregar imágenes a nuestros correos electrónicos.
  • MIMEAudio: si deseamos agregar archivos de audio, podemos hacerlo fácilmente con la ayuda de esta subclase.
  • MIMEApplication: esto se puede usar para agregar cualquier cosa o cualquier otro archivo adjunto.

Implementación paso a paso

Paso 1: importa los siguientes módulos

Python3

from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
import smtplib
import os

Paso 2: configuremos una conexión a nuestro servidor de correo electrónico.

  • Proporcione la dirección del servidor y el número de puerto para iniciar nuestra conexión SMTP
  • Luego usaremos smtp . ehlo para enviar un comando EHLO (Extended Hello).
  • Ahora, usaremos smtp . starttls para habilitar el cifrado de seguridad de la capa de transporte ( TLS ).

Python3

smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('YourMail@gmail.com', 'Your Password')

Paso 3: Ahora, construye el contenido del mensaje.

  • Asigne el objeto MIMEMultipart a la variable msg después de inicializarlo.
  • La función MIMEText se utilizará para adjuntar texto.

Python3

msg = MIMEMultipart()
msg['Subject'] = subject
msg.attach(MIMEText(text))

Paso 4: veamos cómo adjuntar imágenes y varios archivos adjuntos.

Adjuntar imágenes: 

  • Primero, lea la imagen como datos binarios.
  • Adjunte los datos de la imagen a MIMEMultipart usando MIMEImage , agregamos el nombre de archivo dado use os . nombre base

Python3

img_data = open(one_img, 'rb').read()
msg.attach(MIMEImage(img_data, 
                     name=os.path.basename(one_img)))

Adjuntar varios archivos:

  • Lea el archivo adjunto usando MIMEApplication .
  • Luego editamos los metadatos del archivo adjunto.
  • Finalmente, agregue el archivo adjunto a nuestro objeto de mensaje.

Python3

with open(one_attachment, 'rb') as f:
    file = MIMEApplication(
        f.read(), name=os.path.basename(one_attachment)
    )
    file['Content-Disposition'] = f'attachment; \
    filename="{os.path.basename(one_attachment)}"'
    msg.attach(file)

Paso 5: El último paso es enviar el correo electrónico.

  • Haga una lista de todos los correos electrónicos que desea enviar.
  • Luego, usando la función sendmail , pase parámetros como desde dónde, a dónde y el contenido del mensaje.
  • Por último, acaba de salir de la conexión del servidor.

Python3

to = ["klm@gmail.com", "xyz@gmail.com", "abc@gmail.com"]
smtp.sendmail(from_addr="Your Login Email",
              to_addrs=to, msg=msg.as_string())
smtp.quit()

A continuación se muestra la implementación completa:

Python3

# Import the following module
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
import smtplib
import os
  
# initialize connection to our
# email server, we will use gmail here
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
  
# Login with your email and password
smtp.login('Your Email', 'Your Password')
  
  
# send our email message 'msg' to our boss
def message(subject="Python Notification", 
            text="", img=None,
            attachment=None):
    
    # build message contents
    msg = MIMEMultipart()
      
    # Add Subject
    msg['Subject'] = subject  
      
    # Add text contents
    msg.attach(MIMEText(text))  
  
    # Check if we have anything
    # given in the img parameter
    if img is not None:
          
        # Check whether we have the lists of images or not!
        if type(img) is not list:  
            
              # if it isn't a list, make it one
            img = [img] 
  
        # Now iterate through our list
        for one_img in img:
            
              # read the image binary data
            img_data = open(one_img, 'rb').read()  
            # Attach the image data to MIMEMultipart
            # using MIMEImage, we add the given filename use os.basename
            msg.attach(MIMEImage(img_data,
                                 name=os.path.basename(one_img)))
  
    # We do the same for
    # attachments as we did for images
    if attachment is not None:
          
        # Check whether we have the
        # lists of attachments or not!
        if type(attachment) is not list:
            
              # if it isn't a list, make it one
            attachment = [attachment]  
  
        for one_attachment in attachment:
  
            with open(one_attachment, 'rb') as f:
                
                # Read in the attachment
                # using MIMEApplication
                file = MIMEApplication(
                    f.read(),
                    name=os.path.basename(one_attachment)
                )
            file['Content-Disposition'] = f'attachment;\
            filename="{os.path.basename(one_attachment)}"'
              
            # At last, Add the attachment to our message object
            msg.attach(file)
    return msg
  
  
# Call the message function
msg = message("Good!", "Hi there!",
              r"C:\Users\Dell\Downloads\Garbage\Cartoon.jpg",
              r"C:\Users\Dell\Desktop\slack.py")
  
# Make a list of emails, where you wanna send mail
to = ["ABC@gmail.com",
      "XYZ@gmail.com", "insaaf@gmail.com"]
  
# Provide some data to the sendmail function!
smtp.sendmail(from_addr="hello@gmail.com",
              to_addrs=to, msg=msg.as_string())
  
 # Finally, don't forget to close the connection
smtp.quit()

Producción: 

Programar mensajes de correo electrónico

Para programar el correo, haremos uso del paquete de programación en python. Es muy ligero y fácil de usar. 

Instalar el módulo 

pip install schedule

Ahora mire las diferentes funciones que se definen en un módulo de programación y su uso:

La siguiente función llamará a la función mail cada 2 segundos.

schedule.every(2).seconds.do(mail) 

Esto llamará a la función mail cada 10 minutos.

schedule.every(10).minutes.do(mail)

Esto llamará a la función cada hora.

schedule.every().hour.do(mail)

Llamando todos los días a las 10:30 AM.

schedule.every().day.at("10:30").do(mail)

Llamando a un día en particular.

schedule.every().monday.do(mail)

A continuación se muestra la implementación:

Python3

import schedule
import time
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
import smtplib
import os
  
# send our email message 'msg' to our boss
def message(subject="Python Notification", 
            text="", img=None, attachment=None):
    
    # build message contents
    msg = MIMEMultipart()
      
    # Add Subject
    msg['Subject'] = subject  
      
    # Add text contents
    msg.attach(MIMEText(text))  
  
    # Check if we have anything
    # given in the img parameter
    if img is not None:
  
          # Check whether we have the
        # lists of images or not!
        if type(img) is not list:
            
              # if it isn't a list, make it one
            img = [img]  
  
        # Now iterate through our list
        for one_img in img:
            
              # read the image binary data
            img_data = open(one_img, 'rb').read()  
              
            # Attach the image data to MIMEMultipart
            # using MIMEImage,
            # we add the given filename use os.basename
            msg.attach(MIMEImage(img_data, 
                                 name=os.path.basename(one_img)))
  
    # We do the same for attachments
    # as we did for images
    if attachment is not None:
  
          # Check whether we have the
        # lists of attachments or not!
        if type(attachment) is not list:
            
              # if it isn't a list, make it one
            attachment = [attachment]  
  
        for one_attachment in attachment:
  
            with open(one_attachment, 'rb') as f:
                
                # Read in the attachment using MIMEApplication
                file = MIMEApplication(
                    f.read(),
                    name=os.path.basename(one_attachment)
                )
            file['Content-Disposition'] = f'attachment;\
            filename="{os.path.basename(one_attachment)}"'
              
            # At last, Add the attachment to our message object
            msg.attach(file)
    return msg
  
  
def mail():
    
    # initialize connection to our email server,
    # we will use gmail here
    smtp = smtplib.SMTP('smtp.gmail.com', 587)
    smtp.ehlo()
    smtp.starttls()
      
    # Login with your email and password
    smtp.login('Email', 'Password')
  
    # Call the message function
    msg = message("Good!", "Hi there!",
                  r"C:\Users\Dell\Downloads\Garbage\Cartoon.jpg",
                  r"C:\Users\Dell\Desktop\slack.py")
      
    # Make a list of emails, where you wanna send mail
    to = ["ABC@gmail.com",
          "XYZ@gmail.com", "insaaf@gmail.com"]
  
    # Provide some data to the sendmail function!
    smtp.sendmail(from_addr="hello@gmail.com",
                  to_addrs=to, msg=msg.as_string())
      
    # Finally, don't forget to close the connection
    smtp.quit()  
  
  
schedule.every(2).seconds.do(mail)
schedule.every(10).minutes.do(mail)
schedule.every().hour.do(mail)
schedule.every().day.at("10:30").do(mail)
schedule.every(5).to(10).minutes.do(mail)
schedule.every().monday.do(mail)
schedule.every().wednesday.at("13:15").do(mail)
schedule.every().minute.at(":17").do(mail)
  
while True:
    schedule.run_pending()
    time.sleep(1)

Producción:

Publicación traducida automáticamente

Artículo escrito por gittysatyam y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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