Beispiel für den Umgang mit EML-Dateien in Python

Wenn Sie das Paket email von Python verwenden, ist die eml-Datei, mit der E-Mails gespeichert werden können, nur eine Standardbibliothek. Es ist leicht zu analysieren.

Beziehen Sie die angehängte Datei, den Betreff, den Text usw. aus der eml-Datei, obwohl dies das Minimum ist, da es für Unternehmen erforderlich ist. Ich habe eine Klasse gemacht.


# coding:utf-8
"""
Holen Sie sich Daten basierend auf der EML-Datei für eine einfache Handhabung
Stichprobe.

Aufgrund der Mindestimplementierung können einige Auslassungen auftreten. .. ..

"""
import sys
import email
from email.header import decode_header

class MailParser(object):
    """
Eine Klasse, die den Pfad einer Mail-Datei empfängt und analysiert
    """

    def __init__(self, mail_file_path):
        self.mail_file_path = mail_file_path
        #E-Mail aus der EML-Datei.message.Nachrichteninstanz abrufen
        with open(mail_file_path, 'rb') as email_file:
            self.email_message = email.message_from_bytes(email_file.read())
        self.subject = None
        self.to_address = None
        self.cc_address = None
        self.from_address = None
        self.body = ""
        #Anhangsbezogene Informationen
        # {name: file_name, data: data}
        self.attach_file_list = []
        #Interpretation von eml
        self._parse()

    def get_attr_data(self):
        """
Mail-Daten abrufen
        """
        result = """\
FROM: {}
TO: {}
CC: {}
-----------------------
BODY:
{}
-----------------------
ATTACH_FILE_NAME:
{}
""".format(
            self.from_address,
            self.to_address,
            self.cc_address,
            self.body,
            ",".join([ x["name"] for x in self.attach_file_list])
        )
        return result


    def _parse(self):
        """
Mail-Dateien analysieren
        __init__Anrufen
        """
        self.subject = self._get_decoded_header("Subject")
        self.to_address = self._get_decoded_header("To")
        self.cc_address = self._get_decoded_header("Cc")
        self.from_address = self._get_decoded_header("From")

        #Verarbeitung des Nachrichtentextteils
        for part in self.email_message.walk():
            #Wenn der ContentType mehrteilig ist, ist der tatsächliche Inhalt noch größer
            #Da es sich im Innenteil befindet, überspringen Sie es
            if part.get_content_maintype() == 'multipart':
                continue
            #Dateinamen abrufen
            attach_fname = part.get_filename()
            #Sollte der Body sein, wenn es keinen Dateinamen gibt
            if not attach_fname:
                charset = str(part.get_content_charset())
                if charset:
                    self.body += part.get_payload(decode=True).decode(charset, errors="replace")
                else:
                    self.body += part.get_payload(decode=True)
            else:
                #Wenn es einen Dateinamen gibt, handelt es sich um eine angehängte Datei
                #Daten bekommen
                self.attach_file_list.append({
                    "name": attach_fname,
                    "data": part.get_payload(decode=True)
                })

    def _get_decoded_header(self, key_name):
        """
Ruft das dekodierte Ergebnis aus dem Header-Objekt ab
        """
        ret = ""

        #Schlüssel ohne das entsprechende Element geben leere Zeichen zurück
        raw_obj = self.email_message.get(key_name)
        if raw_obj is None:
            return ""
        #Machen Sie das dekodierte Ergebnis unicode
        for fragment, encoding in decode_header(raw_obj):
            if not hasattr(fragment, "decode"):
                ret += fragment
                continue
            #Wenn es keine Codierung gibt, UTF vorerst-Mit 8 dekodieren
            if encoding:
                ret += fragment.decode(encoding)
            else:
                ret += fragment.decode("UTF-8")
        return ret

if __name__ == "__main__":
    result = MailParser(sys.argv[1]).get_attr_data()
    print(result)

Vorerst wurden die erwarteten Ergebnisse erzielt. Ich hoffe, es wird beim Umgang mit E-Mails hilfreich sein.

Recommended Posts

Beispiel für den Umgang mit EML-Dateien in Python
Umgang mit JSON-Dateien in Python
Geben Sie Anmerkungen für Python2 in Stub-Dateien ein!
Umgang mit Json in Python
Umgang mit Hexadezimal in Python3
Spezifischer Beispielcode für die Arbeit mit SQLite3 in Python
Techniken zum Sortieren in Python
[Python] Beispielcode für die Python-Grammatik
Suchen Sie rekursiv nach Dateien und Verzeichnissen in Python und geben Sie sie aus
Relative URL-Verarbeitung in Python
Über "für _ in range ():" von Python
Verschieben von CSV-Dateien mit Python Teil 1
Überprüfen Sie Python auf Speicherlecks
Bearbeiten Sie Dateien und Ordner in Python
Laden Sie Google Drive-Dateien in Python herunter
Behandlung von Zeitzonen in Python (Datum / Uhrzeit, Pytz)
Lesen Sie Dateien parallel zu Python
Exportieren und Ausgeben von Dateien in Python
Führen Sie unittest in Python aus (für Anfänger)
Extrahieren Sie mit Python Zeichenfolgen aus Dateien
Google Cloud Vision API-Beispiel für Python
Suchen Sie nach Dateien wie Linux Find in Python
Ausgabebaumstruktur von Dateien in Python
Anmerkung von nfc.ContactlessFrontend () von nfcpy von Python
Inject wird für DDD in Python empfohlen
Tipps zum Umgang mit Binärdateien in Python
Beispielskript zum Überfüllen von Signalen in Python
Zusammenfassung verschiedener for-Anweisungen in Python
Vorlage zum Schreiben von Batch-Skripten in Python
Automatisieren Sie Jobs, indem Sie Dateien in Python bearbeiten
Verarbeiten Sie mehrere Listen mit for in Python
MongoDB mit Python zum ersten Mal
Lesen und schreiben Sie JSON-Dateien mit Python
Holen Sie sich ein Zeichen für Conoha mit Python
AtCoder Spickzettel in Python (für mich)
Ich habe mit Python nach einer Primzahl gesucht
Hinweise zur Verwendung von Python (Pydev) mit Eclipse
Tipps zum Erstellen kleiner Werkzeuge mit Python
Verwenden Sie pathlib in Maya (Python2.7), um sich auf das kommende Python3.7 vorzubereiten
Laden Sie Dateien in jedem Format mit Python herunter
Modulimport und Ausnahmebehandlung in Python
Vorlage zum Erstellen von Befehlszeilenanwendungen in Python
Quadtree in Python --2
Python in der Optimierung
Python [für mich]
CURL in Python
CERTIFICATE_VERIFY_FAILED in Python 3.6, dem offiziellen Installationsprogramm für macOS
++ und-können nicht zum Inkrementieren / Dekrementieren in Python verwendet werden
Geokodierung in Python
SendKeys in Python
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Metaanalyse in Python
Unittest in Python
Zusammenfassung zum Importieren von Dateien in Python 3
Beheben Sie den japanischen Schreibfehler UnicodeEncodeError in der Python-Datei
Python-Abschlussbeispiel
Epoche in Python
Zwietracht in Python
Fügen Sie ein Zitat ">" für die Beantwortung von E-Mails in Python3 hinzu