Utilización y activación de la api de Gmail

Google API Console

Lo primero que tenemos que hacer es crear un proyecto nuevo en Google Developers Console. A continuación, haz clic en Seleccionar un proyecto y crea uno nuevo.

image1

Nombra tu nuevo proyecto y pulsa Crear en la parte inferior.

Habilita Gmail API

Una vez hecho esto, puedes pulsar la pestaña Biblioteca de la izquierda y encontrarte en la página de la Biblioteca API. Introduce “Gmail API” en la barra de búsqueda y haz clic en ella una vez encontrada. Ahora, tienes que habilitar la API para tu proyecto.

image2

*Ten en cuenta que tendrás que activarlo por separado para cada nuevo proyecto en el que trabajes. *

Paso 3: Credenciales y autenticación con OAuth 2.0

Una vez activada la API, accederás a un bonito panel que dice: “Para utilizar esta API, puede que necesites credenciales”. Si haces clic en Crear credenciales, tendrás que pasar por una serie de preguntas para saber qué tipo de credenciales necesitas. Te aconsejamos que vayas por otro camino ya que ya sabemos lo que es: ID de cliente OAuth. Así pues, haz clic en la pestaña Credenciales de la izquierda, y luego elige OAuth client ID en la lista desplegable del botón Crear credenciales.

image3

Verás el botón Configurar pantalla de consentimiento. Te llevará a una página con muchos campos. Sólo tienes que introducir el nombre de tu aplicación y especificar los dominios autorizados. Rellena otros campos si quieres.

image4

Haz clic en guardar y luego elige el tipo de tu aplicación (aplicación web, Android, Chrome App, iOS u otra). Después de eso, nombra tu ID de cliente OAuth. Además, introduce los orígenes de JavaScript y los dominios de redirección para utilizarlos con las solicitudes de un navegador o un servidor web, respectivamente. Haz clic en crear para finalizar. Eso es todo. Descarga un archivo JSON con tus credenciales - lo necesitarás más tarde.

Habilitación de la API de Gmail

Para utilizar la API de Gmail, necesitamos un token para conectarnos a la API de Gmail, podemos obtener uno desde el panel de control de las API de Google.

Primero habilitamos la API de correo de Google, nos dirigimos al panel de control y utilizamos la barra de búsqueda para buscar la API de Gmail, hacemos clic en ella y la habilitamos:

image5

A continuación, creamos un ID de cliente OAuth 2.0 mediante la creación de credenciales (dirigiéndose al botón Crear credenciales):

image6

Seleccione Desktop App como el tipo de aplicación y proceda, verá una ventana como esta:

image7

Descargamos nuestro archivo de credenciales y lo guardamos como credentials.json en el directorio actual:

image8


Nota: Si es la primera vez que utilizas las API de Google, puede que tengas que crear simplemente una pantalla de consentimiento de OAuth y añadir tu correo electrónico como usuario de prueba.

Crear pantalla de consentimiento

Información detallada de cómo crearla aquí.

Importante destacar que se marque para uso interno y que no se suba logotipo.

Es porque si no se activa un procedimiento de verificación humana, que retrasa la activación de ventana de consentimiento hasta que termine, y pueden ser días. Lo cual no necesitamos para nuestras pruebas y sería en caso de poner en producción la aplicación, para que así se muestre una ventana formal de aceptación de permisos con aspecto y auterización corporativo.

Creación del Script para consumir la API de Gmail en python

Dependencias necesarias

$ pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

Código de consumo de la api

En la misma carpeta donde se encuentre este script, debe estar el fichero credentials.json que fue renombrado por el que nos descargamos de google con los credenciales de acceso de nuestra cuenta. También destacar que se creará de forma automática después del primer lanzamiento un fichero tocken.picle que no deberemos borrar.

import os
import pickle

# Gmail API utils

from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# for encoding/decoding messages in base64

from base64 import urlsafe_b64decode, urlsafe_b64encode

# for dealing with attachement MIME types

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from mimetypes import guess_type as guess_mime_type

# Request all access (permission to read/send/receive emails, manage the inbox, and more)

SCOPES = ['https://mail.google.com/']
our_email = '[email protected]'

def gmail_authenticate():
    creds = None
    # the file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first time
    if os.path.exists("token.pickle"):
        with open("token.pickle", "rb") as token:
            creds = pickle.load(token)
    # if there are no (valid) credentials availablle, let the user 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 credentials for the next run
        with open("token.pickle", "wb") as token:
            pickle.dump(creds, token)
    return build('gmail', 'v1', credentials=creds)

# get the Gmail API service

service = gmail_authenticate()

# Adds the attachment with the given filename to the given message

def add_attachment(message, filename):
    content_type, encoding = guess_mime_type(filename)
    if content_type is None or encoding is not None:
        content_type = 'application/octet-stream'
    main_type, sub_type = content_type.split('/', 1)
    if main_type == 'text':
        fp = open(filename, 'rb')
        msg = MIMEText(fp.read().decode(), _subtype=sub_type)
        fp.close()
    elif main_type == 'image':
        fp = open(filename, 'rb')
        msg = MIMEImage(fp.read(), _subtype=sub_type)
        fp.close()
    elif main_type == 'audio':
        fp = open(filename, 'rb')
        msg = MIMEAudio(fp.read(), _subtype=sub_type)
        fp.close()
    else:
        fp = open(filename, 'rb')
        msg = MIMEBase(main_type, sub_type)
        msg.set_payload(fp.read())
        fp.close()
    filename = os.path.basename(filename)
    msg.add_header('Content-Disposition', 'attachment', filename=filename)
    message.attach(msg)

def build_message(destination, obj, body, attachments=[]):
    if not attachments: # no attachments given
        message = MIMEText(body, 'html')
        message['to'] = destination
        message['from'] = our_email
        message['subject'] = obj
    else:
        message = MIMEMultipart()
        message['to'] = destination
        message['from'] = our_email
        message['subject'] = obj
        message.attach(MIMEText(body))
        for filename in attachments:
            add_attachment(message, filename)
    return {'raw': urlsafe_b64encode(message.as_bytes()).decode()}

def send_message(service, destination, obj, body, attachments=[]):
    return service.users().messages().send(
      userId="me",
      body=build_message(destination, obj, body, attachments)
    ).execute()

def send(user, subject, body):
    send_message(service, user, subject, body)

Llamada y utilización a este script

El script anterior, lo denominto una dependencia y he externalizado su uso, por ello desde dónde tengamos los datos y queramos enviar el email deberemos poner:

from email_api_gmail import send #Es el nombre que yo le he dado al script que consume la api de gmail.

#### Envío de los datos por email

    try:
        email = "`<html>`" + df.to_html() + "`</html>`"
        send("email_destinatario@dominio", "Encabezado del email", cuerpo_email)
        print("Se ha el email correctamente.")
    except Exception as e:
        print("Ha habido un error en el envío del email:", e)

Fuentes:

https://mailtrap.io/blog/send-emails-with-gmail-api/#Python https://www.thepythoncode.com/article/use-gmail-api-in-python https://developers.google.com/android-publisher/getting_started?hl=es-419 https://docs.moodle.org/all/es/Servicio_OAuth_2_Google