Erstellt am 26. September 2020. </ b>
Windows10 home
Python 3.8.3
google-auth-oauthlib 0.4.1
google-api-python-client 1.12.2
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.
Das allgemeine Verfahren ist wie folgt.
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_
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.
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.
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.
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.
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! (・ ∀ ・)
・ 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