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:
- Inicie sesión en la consola de Google Cloud y cree un nuevo proyecto o continúe con un proyecto existente.
- Vaya a API y servicios .
- Habilite la API de Gmail para el proyecto seleccionado.
- Ahora, configure la pantalla de consentimiento haciendo clic en Pantalla de consentimiento de OAuth si aún no está configurada.
- Introduzca el nombre de la aplicación y guárdelo.
- Ahora ve a Credenciales .
- Haga clic en Crear credenciales y vaya a 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 .
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.