Extrahieren Sie die Vorlage der aus Thunderbird gespeicherten EML-Datei mit python3.7

Ich bin die allgemeine Angelegenheit einer kleinen Firma (ungefähr 30 Leute). Natürlich gibt es kein Geld für die Einführung eines Anwesenheitsmanagementsystems. Was ist überhaupt ein Anwesenheitsmanagementsystem? Da es sich um ein Unternehmen mit dem Namen "Unternehmen" handelt, werden monatlich zahlreiche Urlaubsmitteilungen und Feiertagsmitteilungen gesendet, die in dem mit Excel-Rasterpapier erstellten Format eingegeben wurden. Nach dem Studium dachte ich darüber nach, wie ich nach E-Mails nach Datum von thuderbird (erzwungen) suchen, sie durch Ziehen und Ablegen speichern und alle angehängten Dateien extrahieren kann.

Eml-Datei lesen

https://qiita.com/denzow/items/a42d344fa343cd80cf86 Geändert wie folgt, damit das Datum mit Bezug auf extrahiert werden kann

eml_read.py


import sys
import email
from email.header import decode_header
import datetime

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 = ""
        self.date = None
        #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 = """\
DATE: {}
FROM: {}
TO: {}
CC: {}
-----------------------
BODY:
{}
-----------------------
ATTACH_FILE_NAME:
{}
""".format(
            self.date,
            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")
        #Wo ich mich verändert habe
        self.date = datetime.datetime.strptime(
            self._get_decoded_header("Date"),
            "%a, %d %b %Y %H:%M:%S %z"
        )

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

Erstellen Sie Code, um die angehängte Datei der eml-Datei im Ordner zu extrahieren

Da ich ein Amateur bin, verzeihen Sie mir bitte die seltsame Art zu schreiben, wie man Variablen hinzufügt.

save_attachmentfile.py


import eml_read
import glob
import os
from email.header import decode_header
import datetime

PATH = r"C:\Users\toshi\***" + "\\"  #Wo Sie die eml-Datei gespeichert haben
save_file_path = r"C:\Users\***" + "\\"  #Wo möchten Sie die angehängte Datei speichern?


def save_attachmentfile(file_path_list):
    # search_Erhalten Sie die Liste von eml und speichern Sie die angehängte Datei_Im Pfad speichern
    for file_path in file_path_list:
        obj_eml = eml_read.MailParser(file_path)
        from_adderss = obj_eml.from_address[0:3]
        eml_date = obj_eml.date
        print(eml_date)
        #Datum
        str_year = eml_date.strftime("%y")
        str_month = eml_date.strftime("%m").lstrip("0")
        str_day = eml_date.strftime("%d").lstrip("0")
        str_date = str_year + "." + str_month + "." + str_day
        for a in obj_eml.attach_file_list:
            print(type(decode_header(a["name"])[0][0]))
            if type(decode_header(a["name"])[0][0]) == bytes:
                file_name = str_date + from_adderss + decode_header(a["name"])[0][0].decode(decode_header(a["name"])[0][1])
            else:
                file_name = str_date + from_adderss + decode_header(a["name"])[0][0]
            file_name = (
                    file_name
            ).translate(str.maketrans(
                {'<': '', '>': '', '!': '', '/': '', ':': '', '*': '', '"': '', '|': ''}
            ))
            with open(save_file_path + file_name,
                      mode="bw") as f:
                f.write(a["data"])


def search_eml(file_path):
    #Gibt eine Liste der eml-Dateinamen zurück
    emlPATHS = []
    filepaths = glob.glob(os.path.join(file_path, '*.eml'))
    for filepath in filepaths:
        emlPATHS.append(filepath)
    filepaths = None
    return emlPATHS


if __name__ == "__main__":
    lst = search_eml(PATH)
    save_attachmentfile(lst)

Referenzlink

https://qiita.com/denzow/items/a42d344fa343cd80cf86 https://stackoverflow.com/questions/21711404/how-to-get-decode-attachment-filename-with-python-email

Recommended Posts

Extrahieren Sie die Vorlage der aus Thunderbird gespeicherten EML-Datei mit python3.7
Extrahieren Sie die xz-Datei mit Python
Überprüfen Sie die Existenz der Datei mit Python
Extrahieren Sie mit Python Zeilen, die den Bedingungen entsprechen, aus einer Textdatei
[Python] Zusammenfassung der S3-Dateivorgänge mit boto3
Zip mit Python extrahieren (unterstützt japanische Dateinamen)
Extrahieren Sie E-Mail-Anhänge, die Thunderbird mit Python erhalten hat
Konvertieren Sie den Zeichencode der Datei mit Python3
Lesen Sie mit Python Zeile für Zeile aus der Datei
Extrahieren Sie mit Python Daten von einer Webseite
Extrahieren Sie die Tabelle der Bilddateien mit OneDrive & Python
Vorlage des Python-Skripts zum Lesen des Inhalts der Datei
Lerne Nim mit Python (ab Anfang des Jahres).
Erstellen Sie eine Kopie einer Google Drive-Datei aus Python
Lesen Sie den QR-Code aus der Bilddatei mit Python (Mac).
[Grundlagen der Datenwissenschaft] Sammeln von Daten aus RSS mit Python
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern
Zusammenfassung der Python-Dateivorgänge
Zeichnen Sie eine netCDF-Datei mit Python
[Python] Extrahieren Sie Textdaten aus XML-Daten von 10 GB oder mehr.
Python> Aus einer mehrzeiligen Zeichenfolge anstelle einer Datei lesen> io.StringIO ()
Mit Skype benachrichtigen Sie mit Skype von Python!
Laden Sie die CSV-Datei mit Python herunter
Ich möchte mit Python eine beliebige URL aus der Zeichenfolge der HTML-Quelle extrahieren
Test der Spracherkennung mit Azure mit Python (Eingabe vom Mikrofon)
Versuchen Sie, mit Python3 eine Zeichenfolge aus einem Bild zu extrahieren
Lesen Sie die Datei in Python mit einem relativen Pfad aus dem Programm
Extrahieren Sie Text aus [python] pdf und lesen Sie Zeichen mit Open-Jtalk vor
Die Idee, die Konfigurationsdatei mit einer Python-Datei anstelle von yaml zu füttern
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Datenbanktabellen mit CSV extrahieren [ODBC-Verbindung von R und Python]
Führen Sie das Python-Skript aus der Batchdatei aus
Rufen Sie C von Python mit DragonFFI auf
Einfache Verschlüsselung von Dateiinhalten (Python)
Verwenden von Rstan aus Python mit PypeR
[Automatisierung] Extrahieren Sie Outlook-Termine mit Python
[Python] Mit Python in eine CSV-Datei schreiben
[Mit Python automatisiert! ] Teil 1: Datei einstellen
Implementierter Dateidownload mit Python + Bottle
Installieren Sie Python von der Quelle mit Ansible
Ausgabe in eine CSV-Datei mit Python
Existenz aus Sicht von Python
Erste Schritte mit Python Grundlagen von Python
Extrahieren Sie mit Python Text aus Bildern
Lebensspiel mit Python! (Conways Spiel des Lebens)
Führen Sie Aprili von Python auf Orange aus
10 Funktionen von "Sprache mit Batterie" Python
[Anfänger] Extrahieren Sie Zeichenketten mit Python
Extrahieren Sie die Targz-Datei mit Python
Rufen Sie Python von Nim mit Nimpy auf
Implementierung der Dyxtra-Methode durch Python
[Mit Python automatisiert! ] Teil 2: Dateivorgang
Laden Sie fbx aus Python mitinema4d
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Grundlegendes Studium von OpenCV mit Python