Ich wollte eine E-Mail mit einem bestimmten Label aus Google Mail abrufen, also habe ich ein Memo in Python erstellt.
Das Anschließen und Beschriften ist einfach.
import imaplib, re, email, six, dateutil.parser
email_default_encoding = 'iso-2022-jp'
def main():
gmail = imaplib.IMAP4_SSL("imap.gmail.com")
gmail.login("user","password")
gmail.select('INBOX') #Geben Sie Ihren Posteingang an
gmail.select('register') #Geben Sie das Etikett an
Holen Sie sich die Mail mit .search ()
.
Wenn Sie ALL angeben, können Sie alle ungelesenen Elemente in UNSEEN abrufen.
Weitere Einstellungen finden Sie im IMAP4-Handbuch. Obwohl es auf Englisch ist.
INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1
typ, [data] = gmail.search(None, "(UNSEEN)")
#typ, [data] = gmail.search(None, "(ALL)")
#Bestätigung
if typ == "OK":
if data != '':
print("New Mail")
else:
print("Non")
#Bearbeitung der erworbenen Mailingliste
for num in data.split():
###Verarbeitung zu jeder Mail###
#Aufräumen
gmail.close()
gmail.logout()
Der mittlere Teil prüft nur, ob es empfangen wurde. Schreiben Sie danach die Verarbeitung für jede Mail, und es ist der Endfluss. Ab dem nächsten werden der Absender, der Titel und der Text im Mail-Verarbeitungsteil erfasst.
Da nur die ID der Zielmail von ".search ()" abgerufen werden kann, kann auf die gesamte Mail mit der durch ".fetch ()" angegebenen ID zugegriffen werden. Zuerst müssen Sie den Zeichencode der E-Mail erhalten. Greifen Sie nach dem Parsen der E-Mail mit "email.message_from_string" auf den Titelteil zu. Wenn der Zeichencode angegeben ist, legen Sie ihn fest, andernfalls setzen Sie den Standardwert "iso2022-jp". Danach dekodiere ich wieder mit diesem Zeichencode, aber ich habe das Gefühl, dass es einen besseren Weg gibt, ihn hier zu schreiben ...
for num in data.split():
###Verarbeitung zu jeder Mail###
result, d = gmail.fetch(num, "(RFC822)")
raw_email = d[0][1]
#Zur Zeichencode-Erfassung
msg = email.message_from_string(raw_email.decode('utf-8'))
msg_encoding = email.header.decode_header(msg.get('Subject'))[0][1] or 'iso-2022-jp'
#Analysieren und für die Analyse vorbereiten
msg = email.message_from_string(raw_email.decode(msg_encoding))
print(msg.keys())
Sie können die Elemente, die hier erhältlich sind, mit msg.keys ()
überprüfen.
['Delivered-To', 'Received', 'X-Received', 'Return-Path', 'Received', 'Received-SPF', 'Authentication-Results', 'DKIM-Signature', 'Subject', 'From', 'To', 'Errors-To', 'MIME-Version', 'Date', 'X-Mailer', 'X-Priority', 'Content-Type', 'Message-ID', 'X-Antivirus', 'X-Antivirus-Status']
Holen Sie sich den Absender, aber haben Sie es hier schwer.
fromObj = email.header.decode_header(msg.get('From'))
addr = ""
for f in fromObj:
if isinstance(f[0],bytes):
addr += f[0].decode(msg_encoding)
else:
addr += f[0]
print(addr)
Wenn Sie etwas wie "Sender <[email protected]>
" analysieren
fromObj [0] [0]: b'xxxxxxxxx '・ ・ ・ Codiert "From" fromObj [0] [1]: 'iso-2022-jp' ・ ・ ・ Zeichencode fromObj [1] [0]: b '[email protected]' ・ ・ ・ Adressenteil fromObj [1] [1]: Keine ・ ・ ・ Kein Zeichencode, da nur alphanumerische Zeichen
Es scheint, dass Sie es im Format bekommen können.
Wenn es keine japanische Notation gibt, wird sie nicht zerlegt, wenn sie wie "Sashidashi <[email protected]>
" lautet.
fromObj[0][0] : 'Sashidashi<[email protected]>'
fromObj[0][1] : None
Es wird str Typ in Form von. Also bekomme ich das Ganze per Loop + Typurteil.
Ich habe das gleiche für den Titel getan und es hat funktioniert.
subject = email.header.decode_header(msg.get('Subject'))
title = ""
for sub in subject:
if isinstance(sub[0],bytes):
title += sub[0].decode(msg_encoding)
else:
title += sub[0]
print(title)
Außerdem kann der Absenderteil möglicherweise nicht gut dekodiert werden, wenn in einigen E-Mails Japanisch enthalten ist. Ich werde es in einem anderen Artikel zusammenfassen.
Holen Sie sich das Datum und ändern Sie das Format.
Wenn Sie das Format JJJJMMTT möchten, können Sie einfach dateutil
verwenden.
date = dateutil.parser.parse(msg.get('Date')).strftime("%Y/%m/%d %H:%M:%S")
print(date)
Der Erwerb des Textes hat auch einen Zweig.
Sie können es mit .get_payload ()
erhalten, aber im Fall von E-Mails, die im HTML-Format gesendet werden, werden sowohl Text als auch HTML abgerufen, sodass der Text / die einfache Datei herausgenommen wird.
body = ""
if msg.is_multipart():
for payload in msg.get_payload():
if payload.get_content_type() == "text/plain":
body = payload.get_payload()
else:
if msg.get_content_type() == "text/plain":
body = msg.get_payload()
Es fiel mir schwer, nicht zu wissen, wie man Etiketten setzt und löscht.
#Ungelesen
gmail.store(num, '-FLAGS','\\SEEN')
#Etikett hinzufügen
gmail.store(num, '+X-GM-LABELS','added')
#Etikett entfernen
gmail.store(num, '-X-GM-LABELS','added')
Es scheint, dass dies durch Angabe von "X-GM-LABELS" erreicht werden kann. "+" Zum Hinzufügen "-" zum Löschen. Quelle: Google Mail IMAP-Erweiterungen
Einschließlich der oben genannten INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1 Gmail IMAP Extensions IMAP4 (Internet Mail Access Protocol Version 4) - Teil 1 IMAP4 (Internet Mail Access Protocol Version 4) - Teil 2 email - Paket für die E-Mail- und MIME-Verarbeitung
Nein, es ist schwierig, wenn Sie imap4 nicht richtig verstehen.