Erhalten Sie E-Mails von Google Mail und beschriften Sie sie mit Python3

Ich wollte eine E-Mail mit einem bestimmten Label aus Google Mail abrufen, also habe ich ein Memo in Python erstellt.

Umgebung

Login und Label

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

Post bekommen

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.

Erhalten Sie E-Mail-Inhalte

Zeichencodeerfassung und Perspektive

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']

Absender / Titel abrufen

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 Datum / Körper

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()

Beschriftungen setzen und löschen

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

Referenz

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.

Recommended Posts

Erhalten Sie E-Mails von Google Mail und beschriften Sie sie mit Python3
Holen Sie sich den Betreff und den Text von Google Mail mit der Python- und Google Mail-API
Holen Sie sich HTML von Element mit Python-Selen
Holen Sie sich Daten von VPS MySQL mit Python 3 und SQL Alchemy
[Python / Ruby] Mit Code verstehen Wie man Daten aus dem Internet abruft und in CSV schreibt
2. Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (2. Grundlagen des Python-Programms)
Machen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (4. Datenstruktur)
Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (5. Information Entropy)
Holen Sie sich den Git-Zweignamen und den Tag-Namen mit Python
Holen Sie sich ein Date mit Python
Mit Python + Tweepy können Sie Bilder und Videos der Medienzeitleiste abrufen
Installieren Sie Selenium auf Ihrem Mac und probieren Sie es mit Python aus
Holen Sie sich mit Python + Zeep einen Zeitplan von der Garoon SOAP API
Erhalten Sie Kommentare auf Youtube Live mit [Python] und [Pytchat]!
Lesen Sie die json-Datei mit Python, formatieren Sie sie und geben Sie json aus
Holen Sie sich Dateien von Linux mit paramiko und scp [Python]
[Python] Mit der API von Qiita erhalten Sie Benutzer- und Artikelinformationen
Abrufen von Daten aus der Datenbank über ODBC mit Python (Access)
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
Holen Sie sich Twitter-Timeline mit Python
Holen Sie sich Youtube-Daten mit Python
Holen Sie sich die Thread-ID mit Python
Führen Sie Label mit tkinter [Python] aus.
Beginnen Sie mit Python! ~ ② Grammatik ~
Python mit Pyenv und Venv
[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
Mit Skype benachrichtigen Sie mit Skype von Python!
Holen Sie sich Alembic-Informationen mit Python
Funktioniert mit Python und R.
Senden Sie mit Python mit Google Mail
Holen Sie sich ein Bild von einer Webseite und ändern Sie die Größe
Vergleichen Sie HTTP GET / POST mit cURL (Befehl) und Python (Programmierung).
[Python] Senden Sie eine E-Mail aus Google Mail mit einer zweistufigen Authentifizierungseinstellung
Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
Holen Sie sich Python-Webseite, Zeichenkodierung und Anzeige
Befreien Sie sich mit Python und regulären Ausdrücken von schmutzigen Daten
[Python] Ich habe das Spiel von pip installiert und versucht zu spielen
Hasch mit Python und entkomme dem Ego eines bestimmten Ministers
Abrufen von Daten aus der Analyse-API mit Google API Client für Python
Sammeln von Informationen von Twitter mit Python (Integration von MySQL und Python)
Beispiel für das Parsen von HTTP GET und JSON mit Pfefferpython
[Python x Zapier] Erhalten Sie Warninformationen und benachrichtigen Sie mit Slack
Installieren Sie CaboCha in der Ubuntu-Umgebung und rufen Sie es mit Python auf.
Holen Sie sich zusätzliche Daten zu LDAP mit Python (Writer und Reader)
Nachricht vom ersten Offset mit Kafka Consumer in Python abrufen
Holen Sie sich die passende Zeichenfolge in den regulären Ausdruck und verwenden Sie sie beim Ersetzen unter Python3 erneut
Erstellen Sie mit Python einen Entscheidungsbaum aus 0 und verstehen Sie ihn (3. Datenanalysebibliothek Pandas Edition)
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Vorsichtsmaßnahmen bei der Eingabe von CSV mit Python und der Ausgabe an json, um exe zu erstellen
Setzen Sie Ubuntu in Raspi ein, setzen Sie Docker darauf und steuern Sie GPIO mit Python aus dem Container
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Rufen Sie mit BeautifulSoup + Python PowerShell-Befehle von einer Website für dynamische Malware-Analysen ab
Beginnen Sie mit Python! ~ ① Umweltbau ~