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.
Python 3.9 Erforderliche Bibliotheken ・ Google-API-Python-Client ・ Google-auth-httplib2 ・ Google-auth-oauthlib
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.
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
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'])
Das Folgende ist der Quellcode des Ausführungsteils. Als Verarbeitungsablauf
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.
Wenn Sie die URL öffnen, wird der folgende Bildschirm angezeigt: Klicken Sie auf Details → Zur unsicheren Seite.
Klicken Sie auf Zulassen.
Klicken Sie auf Zulassen.
Der Code wird angezeigt. Kopieren Sie ihn und fügen Sie ihn in den Teil Geben Sie den Autorisierungscode der Konsole ein.
Wenn die Authentifizierung erfolgreich ist, wird die nachfolgende Verarbeitung durchgeführt und die E-Mail gespeichert.
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