Email Summarizer:

The following code is highly useful and a time-saver for those who receive numerous lengthy emails daily. It integrates the Python Gmail reader library ’email’ with the well-known ChatGPT model. By providing a Gmail account username and password, the code reads a specified number of emails you input and summarizes them into structured points. Originally designed for inbox emails, it can also handle emails from a designated folder, allowing you to select which ones to summarize. After defining the emails to process, the program sends them to ChatGPT for summarization. Once all emails are summarized, the code compiles a single email containing a structured summary of all processed emails, along with individual summaries in case you prefer to review the original content.

Steps:

  1. Define the number of mails to read.
  2. The code will read the mails one by one following the next steps:
    1. Obtain the subject and the “from” of the mail.
    2. Extracts the HTML body of the email.
    3. Converts the HTML body to plain text format.
    4. Include the email body in the prompt for ChatGPT to process
    5. Receive the structured and summarized email from ChatGPT.
  3. Combines all the summarized emails.
  4. Compile and send all the summarized emails in a single mail message.
# Librerias Correo:
from email.message import EmailMessage
import ssl
import smtplib
import imghdr
import imaplib
import email
from email.header import decode_header

# Librerias Chat GPT:
import openai
import os

# Librerias leer txt HTML:
from IPython.display import display, HTML
from bs4 import BeautifulSoup

#Hora actual para mandar correo:
from datetime import datetime

# Inputs:

#Emisor el correo del cual se van a leer los correos
email_emisor = "xxxxx@gmail.com"
#Contraseña del correo del cual se van a leer los correos
contra_emisor = "xwiqgqjvoydpnjhj"

#Receptor otro mail por si quieres recibir el correo resumido en otro correo:
email_receptor = "xxxxx@gmail.com"

# Carga la API Key de OPEN AI:
openai.api_key = ""

# Cuantos mails quieres resumir?
num_mails = 4

# API OPEN AI:

# Función para interactuar con la API de OpenAI
def interact_with_gpt(prompt):
    try:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",  # Modelo actualizado
            messages=[
                {"role": "user", "content": prompt}
            ],
            max_tokens=150
        )
        return response.choices[0].message['content'].strip()
    except openai.error.OpenAIError as e:
        return f"Error al interactuar con la API de OpenAI: {e}"


# Enviar Mail:

def send_email(asunto, cuerpo, email_emisor, contra_emisor, email_receptor):
    #__________________________________MENSAJE_____________________________
    em = EmailMessage()
    
    # Emisor
    em["From"] = email_emisor

    #receeptor:
    em["To"] = email_receptor

    # Asunto
    em["Subject"] = asunto
    
    #Definir correo
    em.set_content(cuerpo)
    contexto = ssl.create_default_context()
    

    
    with smtplib.SMTP_SSL("smtp.gmail.com", 465, context = contexto) as smtp:
        smtp.login(email_emisor, contra_emisor)
        smtp.sendmail(email_emisor, email_receptor, em.as_string())

# Read Mail:

#_______________________________________________Correo_______________________________________________
dic_correos = {}
num_mails = num_mails +1
# Crear un contexto SSL
context = ssl.create_default_context()
# Conectarse al servidor
mail = imaplib.IMAP4_SSL("imap.gmail.com", port=993, ssl_context=context)
# Iniciar sesión en tu cuenta
mail.login(email_emisor, contra_emisor)
# Seleccionar el buzón de correo que deseas leer
mail.select("inbox")

# Buscar todos los correos electrónicos en la bandeja de entrada
status, messages = mail.search(None, "ALL")

# Convertir los mensajes a una lista de IDs de correos electrónicos
email_ids = messages[0].split()

for contador in range(1,num_mails):
    # Obtener el último correo electrónico
    latest_email_id = email_ids[-contador]

    # Obtener el correo electrónico por ID
    status, msg_data = mail.fetch(latest_email_id, "(RFC822)")

    # Obtener el contenido del correo electrónico
    for response_part in msg_data:
        if isinstance(response_part, tuple):
            msg = email.message_from_bytes(response_part[1])
            # Decodificar el asunto del correo electrónico
            subject, encoding = decode_header(msg["Subject"])[0]
            if isinstance(subject, bytes):
                subject = subject.decode(encoding if encoding else "utf-8")
            # Decodificar el remitente del correo electrónico
            from_ = msg.get("From")
            #print("Asunto:", subject)
            #print("De:", from_)

            # Si el mensaje del correo electrónico es multipart
            if msg.is_multipart():
                # Iterar sobre las partes del correo electrónico
                for part in msg.walk():
                    # Extraer el tipo de contenido del correo electrónico
                    content_type = part.get_content_type()
                    content_disposition = str(part.get("Content-Disposition"))

                    try:
                        # Obtener el cuerpo del correo electrónico
                        body = part.get_payload(decode=True).decode()
                        #print("Cuerpo:", body)
                    except Exception as e:
                        pass
            else:
                # Extraer el tipo de contenido del correo electrónico
                content_type = msg.get_content_type()

                # Obtener el cuerpo del correo electrónico
                body = msg.get_payload(decode=True).decode()
                #print("Cuerpo:", body)
                
    #Leer el body en html
    soup = BeautifulSoup(body, "html.parser")

    # Obtener el conteido del correo a texto 
    text_content = soup.get_text()
    
    # Dar formato al correo para pasarlo a la API de Chat GPT:
    Correo = "Correo de " + from_ + "Asunto:" + subject + "Con contenido:" + str(text_content)
    
    #_______________________________________________CHAT GPT_______________________________________________
    #Promp CHAT GPT
    promp_corre = "Pon como titulo en mayusculas el asunto, añadade tambien quien ha enviado el correo y con el contenido: Resume el correo usando puntos sobre los temas mas importantes: \n"+ '"""' + Correo + '"""' 

    #Preguntar CHAT GPT:
    respuesta = interact_with_gpt(promp_corre)
    print(respuesta)
    dic_correos[subject] = respuesta
    
    print("________________________________________________")
    
    
                
            

# Cerrar la conexión y cerrar sesión
mail.close()
mail.logout()

# Generar el correo a enviar:
correo_enviar = ""
for i in dic_correos.keys():
    correo_enviar = correo_enviar + dic_correos[i] + "\n" + "____________________________________________" + "\n" + "\n" + "\n" + "\n" 
    
# Hora actual para poner en el asunto:
now = datetime.now()
hora_actual = now.strftime("%Y-%m-%d %H:%M")    

## Enviar el correo:
send_email("Correos resumidos por CHAT GPT "+ hora_actual, correo_enviar, email_emisor, contra_emisor, email_receptor)

Leave a Comment

Your email address will not be published. Required fields are marked *