Holen Sie sich den Betreff und den Text von Google Mail mit der Python- und Google Mail-API

Einführung

Verwenden Sie Python und die Google Mail-API, um den Betreff und den Text der Ziel-E-Mail in Ihrem Posteingang zu speichern und in einer Datei zu speichern.

Voraussetzungen

Ausführungsumgebung

Python 3.9 Erforderliche Bibliotheken ・ Google-API-Python-Client ・ Google-auth-httplib2 ・ Google-auth-oauthlib

Quellcode

Der diesmal verwendete Code kann von GitHub heruntergeladen werden. https://github.com/kirinnsan/backup-gmail Ich habe auch die Docker-Datei hochgeladen. Wenn Sie Docker verwenden können, müssen Sie die Bibliothek nicht mit pip install installieren.

Authentifizierung

Legen Sie die erstellten Anmeldeinformationen im selben Verzeichnis mit dem Dateinamen client_id.json ab. Der Authentifizierungsablauf ist in der InstalledAppFlow-Klasse implementiert. ** run_console **, in der der Benutzer die angegebene Authentifizierungs-URL öffnet, den Authentifizierungscode abruft und in die Konsole einfügt, und ** run_local_server, der sich über den Webserver authentifiziert. Es gibt zwei Arten von Methoden **.

Dieses Mal wird die Authentifizierung mit der Methode run_console durchgeführt.

Wenn die erste Authentifizierung erfolgreich ist, wird im Verzeichnis ein token.pickle erstellt, das das Zugriffstoken und das Aktualisierungstoken enthält. Danach wird die Authentifizierung damit durchgeführt.

auth.py



import pickle
import os.path
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from google.auth.exceptions import GoogleAuthError


def authenticate(scope):
    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 available, let the user log in.
    if not creds or not creds.valid:
        try:
            if creds and creds.expired and creds.refresh_token:
                creds.refresh(Request())
            else:
                flow = InstalledAppFlow.from_client_secrets_file(
                    'client_id.json', scope)
                creds = flow.run_console()
        except GoogleAuthError as err:
            print(f'action=authenticate error={err}')
            raise

        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    return creds

Abrufen von E-Mails mithilfe der Google API

Mithilfe der Google Mail-API wird eine Methode zum Abrufen einer Liste von E-Mails im Posteingang und eine Methode zum Abrufen des Betreffs und des Hauptteils der Ziel-E-Mail implementiert. Sie können die maximale Anzahl der abzurufenden Elemente und die Suchbedingungen in der Mailingliste angeben.

client.py



from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

import util


class ApiClient(object):

    def __init__(self, credential):
        self.service = build('gmail', 'v1', credentials=credential)

    def get_mail_list(self, limit, query):
        # Call the Gmail API
        try:
            results = self.service.users().messages().list(
                userId='me', maxResults=limit, q=query).execute()
        except HttpError as err:
            print(f'action=get_mail_list error={err}')
            raise

        messages = results.get('messages', [])

        return messages

    def get_subject_message(self, id):
        # Call the Gmail API
        try:
            res = self.service.users().messages().get(userId='me', id=id).execute()
        except HttpError as err:
            print(f'action=get_message error={err}')
            raise

        result = {}

        subject = [d.get('value') for d in res['payload']['headers'] if d.get('name') == 'Subject'][0]
        result['subject'] = subject

        # Such as text/plain
        if 'data' in res['payload']['body']:
            b64_message = res['payload']['body']['data']
        # Such as text/html
        elif res['payload']['parts'] is not None:
            b64_message = res['payload']['parts'][0]['body']['data']
        message = util.base64_decode(b64_message)
        result['message'] = message

        return result

Das Folgende ist der Prozess des Dekodierens des Base64-codierten Körpers und des Prozesses des Speicherns der abgerufenen Nachricht. Die Datei wird im angegebenen Verzeichnis in Form von ** mail subject.txt ** gespeichert.

util.py


import base64
import os


def base64_decode(b64_message):
    message = base64.urlsafe_b64decode(
        b64_message + '=' * (-len(b64_message) % 4)).decode(encoding='utf-8')
    return message


def save_file(base_dir, result):
    os.makedirs(base_dir, exist_ok=True)

    file_name = base_dir + '/' + result['subject'] + '.txt'
    with open(file_name, mode='w') as f:
        f.write(result['message'])

Hauptverarbeitung

Das Folgende ist der Quellcode des Ausführungsteils. Als Verarbeitungsablauf

  1. Authentifizierung
  2. Holen Sie sich eine Liste der E-Mails basierend auf der maximalen Anzahl von Elementen und Suchbedingungen
  3. Rufen Sie den Betreff und den Text der Ziel-E-Mail aus der ID jeder E-Mail ab
  4. In Datei in Form von ** Subject.txt ** speichern Wird sein.

main.py


from __future__ import print_function

import auth
from client import ApiClient
import util

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
# Number of emails retrieved
MAIL_COUNTS = 5
# Search criteria
SEARCH_CRITERIA = {
    'from': "[email protected]",
    'to': "",
    'subject': "E-Mail Betreff"
}
BASE_DIR = 'mail_box'


def build_search_criteria(query_dict):
    query_string = ''
    for key, value in query_dict.items():
        if value:
            query_string += key + ':' + value + ' '

    return query_string


def main():
    creds = auth.authenticate(SCOPES)

    query = build_search_criteria(SEARCH_CRITERIA)

    client = ApiClient(creds)
    messages = client.get_mail_list(MAIL_COUNTS, query)

    if not messages:
        print('No message list.')
    else:
        for message in messages:
            message_id = message['id']

            # get subject and message
            result = client.get_subject_message(message_id)

            # save file
            util.save_file(BASE_DIR, result)


if __name__ == '__main__':
    main()

Diesmal beträgt die maximale Anzahl von Akquisitionen 5, der Empfänger ist ** [email protected] ** und der Betreff ist ** E-Mail-Betreff **. Um den Empfänger anzugeben, legen Sie ihn in Form von ** von: [email protected] ** oder ** von: Hanako ** fest. Stellen Sie für das Thema die Form ** Betreff: Betreff ** ein. Auf der folgenden offiziellen Seite werden die Bedingungen und die Verwendung beschrieben, die mit Google Mail verwendet werden können. https://support.google.com/mail/answer/7190

Die abgerufene E-Mail wird im Verzeichnis mail_box gespeichert.

Führen Sie die App aus.

python3 main.py

Nach der Ausführung werden Sie angewiesen, die Authentifizierungs-URL wie unten gezeigt über die Konsole zu öffnen. Öffnen Sie daher die URL.

キャプチャ.PNG

Wenn Sie die URL öffnen, wird der folgende Bildschirm angezeigt: Klicken Sie auf Details → Zur unsicheren Seite. キャプチャ2.PNG

Klicken Sie auf Zulassen. キャプチャ4.PNG

Klicken Sie auf Zulassen. キャプチャ5.PNG

Der Code wird angezeigt. Kopieren Sie ihn und fügen Sie ihn in den Teil Geben Sie den Autorisierungscode der Konsole ein. キャプチャ.PNG

Wenn die Authentifizierung erfolgreich ist, wird die nachfolgende Verarbeitung durchgeführt und die E-Mail gespeichert.

Schließlich

Die offizielle Referenz enthält ein Beispiel für die App, wenn Sie Python verwenden, sodass Sie auch darauf verweisen können. https://developers.google.com/gmail/api/quickstart/python

Ich konnte die Suchbedingungen angeben und die Ziel-E-Mail speichern. Dieses Mal habe ich nur den Titel und den Text der empfangenen E-Mail gespeichert. Da die Google Mail-API jedoch verschiedene andere APIs enthält, können je nach Methode verschiedene Aktionen ausgeführt werden.

Recommended Posts

Holen Sie sich den Betreff und den Text von Google Mail mit der Python- und Google Mail-API
Erhalten Sie E-Mails von Google Mail und beschriften Sie sie mit Python3
[Python] Mit der API von Qiita erhalten Sie Benutzer- und Artikelinformationen
Holen Sie sich Bewertungen mit Python Googlemap API
[Python] Python-Paketinformationen mit der PyPI-API abrufen
Holen Sie sich den Git-Zweignamen und den Tag-Namen mit Python
Holen Sie sich Artikelbesuche und Likes mit Qiita API + Python
Holen Sie sich ein Date mit Python
Mit Python + Tweepy können Sie Bilder und Videos der Medienzeitleiste abrufen
Erhalten Sie Kommentare auf Youtube Live mit [Python] und [Pytchat]!
Senden und empfangen Sie Google Mail über die Google Mail-API mit Python
Crawlen mit Python und Twitter API 1-Einfache Suchfunktion
Erhalten Sie Kommentare und Abonnenten mit der YouTube-Daten-API
Holen Sie sich den Ländercode mit Python
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Verwenden Sie die Trello-API mit Python
Holen Sie sich Twitter-Timeline mit Python
Verwenden Sie die Twitter-API mit Python
Holen Sie sich Youtube-Daten mit Python
Informationen erhalten Sie mit zabbix api
Web-API mit Python + Falcon
Holen Sie sich die Thread-ID mit Python
Beginnen Sie mit Python! ~ ② Grammatik ~
Rufen Sie die API mit python3 auf.
Python mit Pyenv und Venv
Verwenden Sie die Unterschall-API mit Python3
[Python] Quotient und Überschuss erhalten
Holen Sie sich Lager mit Python
Holen Sie sich das Home-Verzeichnis mit Python
Holen Sie sich Tastaturereignis mit Python
Holen Sie sich Alembic-Informationen mit Python
Funktioniert mit Python und R.
Senden Sie mit Python mit Google Mail
Holen Sie sich ein Ranking mit Rakuten API
Versuchen Sie, mit Python schnell und einfach auf die Twitter-API zuzugreifen
Vergleichen Sie HTTP GET / POST mit cURL (Befehl) und Python (Programmierung).
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
Abrufen von Daten aus der Analyse-API mit Google API Client für Python
Beispiel für das Parsen von HTTP GET und JSON mit Pfefferpython
[Python x Zapier] Erhalten Sie Warninformationen und benachrichtigen Sie mit Slack
Holen Sie sich zusätzliche Daten zu LDAP mit Python (Writer und Reader)
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Beginnen Sie mit Python! ~ ① Umweltbau ~
Roboter läuft mit Arduino und Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Erstellen Sie Awaitable mit der Python / C-API
AM-Modulation und Demodulation mit Python
Führen Sie Rotrics DexArm mit der Python-API aus
Scraping mit Python, Selen und Chromedriver
Kratzen mit Python und schöner Suppe
Quine Post mit Qiita API (Python)
Holen Sie sich das Wetter mit Python-Anfragen
Holen Sie sich Web-Screen-Capture mit Python
Holen Sie sich das Wetter mit Python-Anfragen 2
[Python] Mit DataReader Wirtschaftsdaten abrufen
Zusammenarbeit zwischen Python-Modul und API