¿Cómo leer correos electrónicos de Gmail usando la API de Gmail en Python?

En este artículo, veremos cómo leer correos electrónicos de su Gmail usando la API de Gmail en Python. La API de Gmail es una API RESTful que permite a los usuarios interactuar con su cuenta de Gmail y utilizar sus funciones con un script de Python.

Entonces, sigamos adelante y escribamos un script de Python simple para leer correos electrónicos.

Requisitos

  • Python (2.6 o superior)
  • Una cuenta de Google con Gmail habilitado
  • Hermosa biblioteca de sopas
  • Cliente API de Google y bibliotecas OAuth de Google

Instalación

Instale las bibliotecas necesarias ejecutando estos comandos:

pip install –actualizar google-api-python-client google-auth-httplib2 google-auth-oauthlib

Ejecute esto para instalar Beautiful Soup:

pip instalar beautifulsoup4

Ahora, debe configurar su consola de Google Cloud para interactuar con la API de Gmail. Entonces, sigue estos pasos:

Crear un nuevo proyecto

  • Vaya a API y servicios .

Ir a API y Servicios

  • Habilite la API de Gmail para el proyecto seleccionado.

Vaya a Habilitar API y servicios

Habilitar la API de Gmail

  • Ahora, configure la pantalla de consentimiento haciendo clic en Pantalla de consentimiento de OAuth si aún no está configurada.

Configurar la pantalla de consentimiento

  • Introduzca el nombre de la aplicación y guárdelo.

Ingrese el nombre de la aplicación

  • Ahora ve a Credenciales .

Ir a Credenciales

  • Haga clic en Crear credenciales y vaya a ID de cliente de OAuth .

Crear una ID de cliente de OAuth

  • Elija el tipo de aplicación como Aplicación de escritorio.
  • Ingrese el nombre de la aplicación y haga clic en el botón Crear.
  • Se creará el ID de cliente. Descárguelo a su computadora y guárdelo como credentials.json

Mantenga la confidencialidad de su identificación de cliente y sus secretos de cliente.

Ahora, todo está configurado y estamos listos para escribir el código. Entonces vamos.

Código

Acercarse :

El archivo ‘ token.pickle ‘ contiene el token de acceso del Usuario, por lo que primero comprobaremos si existe o no. Si no existe o no es válido, nuestro programa abrirá el navegador y solicitará acceso al Gmail del usuario y lo guardará para la próxima vez. Si existe, comprobaremos si es necesario actualizar el token y actualizaremos si es necesario.

Ahora, nos conectaremos a la API de Gmail con el token de acceso. Una vez conectado, le solicitaremos una lista de mensajes. Esto devolverá una lista de ID de los últimos 100 correos electrónicos (valor predeterminado) para esa cuenta de Gmail. Podemos solicitar cualquier cantidad de correos electrónicos pasando un argumento opcional ‘ maxResults ‘.

El resultado de esta solicitud es un diccionario en el que el valor de la clave ‘ mensajes ‘ es una lista de diccionarios. Cada diccionario contiene la identificación de un correo electrónico y la identificación del hilo .

Ahora, revisaremos todos estos diccionarios y solicitaremos el contenido del correo electrónico a través de sus ID .

Esto nuevamente devuelve un diccionario en el que la clave ‘ carga útil ‘ contiene el contenido principal del correo electrónico en forma de diccionario.

Este diccionario contiene ‘ encabezados ‘, ‘ partes ‘, ‘ nombre de archivo ‘, etc. Por lo tanto, ahora podemos encontrar fácilmente encabezados como remitente , asunto , etc. desde aquí. Las ‘ partes ‘ clave, que es una lista de diccionarios, contienen todas las partes del cuerpo del correo electrónico, como texto , HTML , detalles del archivo adjunto, etc. Por lo tanto, podemos obtener el cuerpo del correo electrónico desde aquí. Generalmente se encuentra en el primer elemento de la lista.

El cuerpo está codificado en codificación Base 64 . Entonces, tenemos que convertirlo a un formato legible. Después de decodificarlo, el texto obtenido está en ‘ lxml ‘. Entonces, lo analizaremos usando la biblioteca BeautifulSoup y lo convertiremos a formato de texto.

Por último, imprimiremos el Asunto , el Remitente y el Correo electrónico .

Python3

# import the required libraries
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import pickle
import os.path
import base64
import email
from bs4 import BeautifulSoup
  
# Define the SCOPES. If modifying it, delete the token.pickle file.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
  
def getEmails():
    # Variable creds will store the user access token.
    # If no valid token found, we will create one.
    creds = None
  
    # The file token.pickle contains the user access token.
    # Check if it exists
    if os.path.exists('token.pickle'):
  
        # Read the token from the file and store it in the variable creds
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
  
    # If credentials are not available or are invalid, ask the user to log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
  
        # Save the access token in token.pickle file for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
  
    # Connect to the Gmail API
    service = build('gmail', 'v1', credentials=creds)
  
    # request a list of all the messages
    result = service.users().messages().list(userId='me').execute()
  
    # We can also pass maxResults to get any number of emails. Like this:
    # result = service.users().messages().list(maxResults=200, userId='me').execute()
    messages = result.get('messages')
  
    # messages is a list of dictionaries where each dictionary contains a message id.
  
    # iterate through all the messages
    for msg in messages:
        # Get the message from its id
        txt = service.users().messages().get(userId='me', id=msg['id']).execute()
  
        # Use try-except to avoid any Errors
        try:
            # Get value of 'payload' from dictionary 'txt'
            payload = txt['payload']
            headers = payload['headers']
  
            # Look for Subject and Sender Email in the headers
            for d in headers:
                if d['name'] == 'Subject':
                    subject = d['value']
                if d['name'] == 'From':
                    sender = d['value']
  
            # The Body of the message is in Encrypted format. So, we have to decode it.
            # Get the data and decode it with base 64 decoder.
            parts = payload.get('parts')[0]
            data = parts['body']['data']
            data = data.replace("-","+").replace("_","/")
            decoded_data = base64.b64decode(data)
  
            # Now, the data obtained is in lxml. So, we will parse 
            # it with BeautifulSoup library
            soup = BeautifulSoup(decoded_data , "lxml")
            body = soup.body()
  
            # Printing the subject, sender's email and message
            print("Subject: ", subject)
            print("From: ", sender)
            print("Message: ", body)
            print('\n')
        except:
            pass
  
  
getEmails()

Ahora, ejecute el script con 

python3 email_reader.py

Esto intentará abrir una nueva ventana en su navegador predeterminado. Si falla, copie la URL de la consola y ábrala manualmente en su navegador.

Ahora, inicie sesión en su cuenta de Google si aún no lo ha hecho. Si hay varias cuentas, se le pedirá que elija una de ellas. Luego, haga clic en el botón Permitir .

Su aplicación solicitando permiso

Una vez completada la autenticación, su navegador mostrará un mensaje: “El flujo de autenticación se ha completado. Puede cerrar esta ventana».

El script comenzará a imprimir los datos del correo electrónico en la consola.

También puede ampliar esto y guardar los correos electrónicos en archivos de texto o csv separados para crear una colección de correos electrónicos de un remitente en particular.

Publicación traducida automáticamente

Artículo escrito por devansh07 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 *