Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Consultar por asunto en gmail
#1
Buen día, espero que anden bien, tengo la tarea de conseguir como realizar en Python esta tarea:

Pido que me ORIENTEN donde puedo encontrar algo similar o igual. 

A modo de investigación dado que soy novato debo encontrar informacion de como hacer un programa en Python que:

  • Se conecte a una cuenta de Gmail, 
  • Recorra el inbox, 
  • Detecte los emails con un título específico .
  • Descargue solamente los adjuntos tipo excel de esa lista de emails. 
  • Los grabe en un directorio.

Ahi concluiría.


Algún tutorial tambien puede servir por supuesto.

Muchas gracias!

Adjunto codigo que encontre, tal vez me digan que con modificarlo un poco pueda resolverlo.

Código:
import imaplib
import email
from email.header import decode_header
import webbrowser
import os
from getpass import getpass

# Datos del usuario
username = input("Correo: ")
password = getpass("Password: ")

# Crear conexión
imap = imaplib.IMAP4_SSL("imap.gmail.com")
# iniciar sesión
imap.login(username, password)

status, mensajes = imap.select("INBOX")
# print(mensajes)
# mensajes a recibir
N = 3
# cantidad total de correos
mensajes = int(mensajes[0])

for i in range(mensajes, mensajes - N, -1):
    # print(f"vamos por el mensaje: {i}")
#     # Obtener el mensaje
    try:
        res, mensaje = imap.fetch(str(i), "(RFC822)")
    except:
        break
    for respuesta in mensaje:
        if isinstance(respuesta, tuple):
            # Obtener el contenido
            mensaje = email.message_from_bytes(respuesta[1])
            # decodificar el contenido
            subject = decode_header(mensaje["Subject"])[0][0]
            if isinstance(subject, bytes):
                # convertir a string
                subject = subject.decode()
            # de donde viene el correo
            from_ = mensaje.get("From")
            print("Subject:", subject)
            print("From:", from_)
            print("Mensaje obtenido con exito")
            # si el correo es html
            if mensaje.is_multipart():
                # Recorrer las partes del correo
                for part in mensaje.walk():
                    # Extraer el contenido
                    content_type = part.get_content_type()
                    content_disposition = str(part.get("Content-Disposition"))
                    try:
                        # el cuerpo del correo
                        body = part.get_payload(decode=True).decode()
                    except:
                        pass
                    if content_type == "text/plain" and "attachment" not in content_disposition:
                        # Mostrar el cuerpo del correo
                        print(body)
                    elif "attachment" in content_disposition:
#                         # download attachment
                        nombre_archivo = part.get_filename()
                        if nombre_archivo:
                            if not os.path.isdir(subject):
                                # crear una carpeta para el mensaje
                                os.mkdir(subject)
                            ruta_archivo = os.path.join(subject, nombre_archivo)
                            # download attachment and save it
                            open(ruta_archivo, "wb").write(part.get_payload(decode=True))
            else:
                # contenido del mensaje
                content_type = mensaje.get_content_type()
                # cuerpo del mensaje
                body = mensaje.get_payload(decode=True).decode()
                if content_type == "text/plain":
#                     # mostrar solo el texto
                    print(body)
            # if content_type == "text/html":
            #     # Abrir el html en el navegador
            #     if not os.path.isdir(subject):
            #         os.mkdir(subject)
            #     nombre_archivo = f"{subject}.html"
            #     ruta_archivo = os.path.join(subject, nombre_archivo)
            #     open(ruta_archivo, "w").write(body)
            #     # abrir el navegador
            #     webbrowser.open(ruta_archivo)
#             print("********************************")
imap.close()
imap.logout()
Responder
#2
Hola, bienvenido.

Para hacer todo lo relativo a Gmail, tenés que crear una clave de acceso en tu cuenta para poder acceder desde un script de Python. Luego todas las operaciones en el código (buscar mails con un asunto determinado, leerlos, etc.) las hacés usando la librería oficial de Google para Python o alguna alternativa como simplegmail (esta última parece ser más sencilla). Supongo que esas librerías deben tener también alguna opción para guardar un adjunto en una carpeta local.

Saludos
Responder
#3
Gracias por la bienvenida Francisco, si, lei algo al respecto. Te agradezco tu respuesta tan rápida.
Responder
#4
Hola, de nada.

También es posible usando el protocolo IMAP (vía el módulo estándar imaplib), que es un protocolo genérico de email (se aplica también a otros proveedores de email), como muestra el código que pegaste. Son dos formas distintas de acceder al mismo contenido. La ventaja de IMAP es que no necesitás gestionar una clave, simplemente ponés tu usuario y contraseña. Pero seguramente la API de Gmail tenga mejores opciones de búsqueda y otras características adicionales.

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)