Entwurf von Google Mail in Python

Erstellt am 26. September 2020. </ b>

Umgebung

Windows10 home
Python 3.8.3
google-auth-oauthlib 0.4.1
google-api-python-client 1.12.2

Was du machen willst

Ich möchte Python in meiner lokalen Umgebung ausführen und einen Entwurf in Google Mail über die API erstellen.

In diesem Artikel schreibe ich Code mit minimaler Fehlerbehandlung und ohne Scheiße. Nicht schlecht.

Verfahren

Das allgemeine Verfahren ist wie folgt.

  1. Erstellen Sie ein Projekt mit GCP
  2. Erstellen Sie Anmeldeinformationen mit GCP
  3. Erstellen Sie ein Python-Skript

1. Erstellen Sie ein Projekt mit GCP ~ 2. Erstellen Sie Anmeldeinformationen

Für 1 und 2 Artikel → "Senden und Empfangen von Google Mail über die Google Mail-API mit Python" Ist sehr leicht zu verstehen.

Wenn Sie dem Artikel folgen, sollte es grundsätzlich kein Problem geben, aber in meinem Fall "Wenn ich mit Vivaldi auf GCP zugreife, kann ich" client_ .json "nicht herunterladen" </ b> .. Dies könnte durch die Verwendung von Chrome vermieden werden.

3. Erstellen Sie ein Python-Skript

Als Fluss, Zugriffstoken gemäß OAuth-Authentifizierungsablauf abrufen ↓ Erstellen Sie Daten für E-Mails zum Senden ↓ Klicken Sie auf die Google Mail-API, um einen Entwurf zu erstellen

Es ist wie es ist.

1. Holen Sie sich das Zugriffstoken

Die minimal erforderliche Funktion zum Abrufen eines Zugriffstokens lautet wie folgt. Referenz → [API-Authentifizierung und -Aufruf (Google Cloud-Handbuch)](https://cloud.google.com/bigquery/docs/authentication/end-user-installed?hl=ja#authenticating-and-calling-the- api)

from google_auth_oauthlib.flow import InstalledAppFlow
#Legen Sie den API-Bereich fest(Festlegen, welche API verwendet werden soll)
SCOPES = ["https://www.googleapis.com/auth/gmail.modify"]

def get_credential():
    launch_browser = True
    flow = InstalledAppFlow.from_client_secrets_file("client_id.json", SCOPES)
    flow.run_local_server()
    cred = flow.credentials
    return cred

Fügen Sie die von GCP abgelegte JSON-Datei in "InstalledAppFlow.from_client_secrets_file" ein, erstellen Sie eine "Flow-Instanz" mit den Informationen der API, die Sie verwenden möchten, und führen Sie "run_local_server ()" aus, um den Browser zu starten. Der vertraute Berechtigungsbildschirm wird angezeigt. スクリーンショット 2020-09-26 170859.jpg

Drücken Sie nun Zulassen und Sie erhalten ein Zugriffstoken.

Übrigens wird der Berechtigungsbildschirm bisher jedes Mal angezeigt, wenn das Programm ausgeführt wird. In der Praxis erscheint es daher praktisch, das Zugriffstoken als Pickle zu speichern.

2. Erstellen Sie einen Entwurf der E-Mail


from email.mime.text import MIMEText
import base64

def create_message(sender, to, subject, message_text):
    enc = "utf-8"
    message = MIMEText(message_text.encode(enc), _charset=enc)
    message["to"] = to
    message["from"] = sender
    message["subject"] = subject
    encode_message = base64.urlsafe_b64encode(message.as_bytes())
    return {"raw": encode_message.decode()}

Es befindet sich in der Google Mail-API-Dokumentation Erstellen von Entwurfsnachrichten, aber im Fall der Dokumentation in der letzten Zeile der Funktion "create_message" Aber


return {'raw': base64.urlsafe_b64encode(message.as_string())}

Es ist geworden. "Base64.urlsafe_b64encode ()" muss jedoch Bytes anstelle von Zeichenfolgen als Eingabe enthalten

encode_message = base64.urlsafe_b64encode(message.as_bytes())

Da der str-Typ erforderlich ist, um ihn später im Entwurf zu ändern und zu speichern

return {"raw": encode_message.decode()}

Und dekodieren.

3. Speichern Sie die von der Google Mail-API erstellten E-Mail-Daten als Entwurf

Fügen Sie dem Entwurf die Daten der E-Mail hinzu, die Sie zuvor erstellt haben.


def create_draft(service, user_id, message_body):
    message = {'message':message_body}
    draft = service.users().drafts().create(userId=user_id, body=message).execute()
    return draft

Der hier verwendete "Service" ist wie ein Meisterwerk bei der Verwendung der Google Mail-API und wird in Google Mail-API-Referenz aufgeführt. Dies ist die Instanz, die die Funktion enthält. Dies erfolgt mit dem folgenden Code.


from googleapiclient.discovery import build

service = build("gmail", "v1", credentials=creds, cache_discovery=False)

Wenn Sie das Obige in einem Programm kombinieren, sieht es wie folgt aus.


from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build

import base64
from email.mime.text import MIMEText

SCOPES = ["https://www.googleapis.com/auth/gmail.compose",]


def get_credential():
    launch_browser = True
    flow = InstalledAppFlow.from_client_secrets_file("client_id.json", SCOPES)
    flow.run_local_server()
    cred = flow.credentials
    return cred


def create_message(sender, to, subject, message_text):
    enc = "utf-8"
    message = MIMEText(message_text.encode(enc), _charset=enc)
    message["to"] = to
    message["from"] = sender
    message["subject"] = subject
    encode_message = base64.urlsafe_b64encode(message.as_bytes())
    return {"raw": encode_message.decode()}


def create_draft(service, user_id, message_body):
    message = {'message':message_body}
    draft = service.users().drafts().create(userId=user_id, body=message).execute()
    return draft


def main(sender, to, subject, message_text):
    creds = get_credential()
    service = build("gmail", "v1", credentials=creds, cache_discovery=False)
    message = create_message(sender, to, subject, message_text)
    create_draft(service, "me", message)


if __name__ == "__main__":

    sender = "E-Mail-Absenderadresse"
    to = "Zieladresse"
    subject = "Gegenstand"
    message_text = "Text"

    main(sender=sender, to=to, subject=subject, message_text=message_text)

Dadurch wird der Entwurf zu Google Mail hinzugefügt. Du hast es geschafft! (・ ∀ ・)

Referenz

・ Der hilfreichste Artikel https://qiita.com/muuuuuwa/items/822c6cffedb9b3c27e21

-Flow-Klasse und InstalledAppFlow-Klassendokumentation google_auth_oauthlib.flow module

・ Dokumente von googleapiclient.discovery.build https://googleapis.github.io/google-api-python-client/docs/epy/googleapiclient.discovery-module.html#build

Recommended Posts