Extraire le modèle du fichier EML enregistré depuis Thunderbird avec python3.7

Je suis les affaires générales d'une petite entreprise (environ 30 personnes). Bien sûr, il n'y a pas d'argent pour mettre en place un système de gestion des présences, qu'est-ce qu'un système de gestion des présences en premier lieu? Parce qu'il s'agit d'une entreprise appelée, un grand nombre d'avis de vacances et d'avis de travail de vacances saisis au format réalisé avec du papier quadrillé Excel sont envoyés chaque mois. Ainsi, après avoir étudié, j'ai réfléchi à la façon de rechercher des e-mails par date à partir de thuderbird (forcé), de les enregistrer par glisser-déposer et d'extraire tous les fichiers joints.

Lire le fichier eml

https://qiita.com/denzow/items/a42d344fa343cd80cf86 Modifié comme suit afin que la date puisse être extraite en référence à

eml_read.py


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

class MailParser(object):
    """
Une classe qui reçoit le chemin d'un fichier courrier et l'analyse
    """

    def __init__(self, mail_file_path):
        self.mail_file_path = mail_file_path
        #email du fichier eml.message.Obtenir l'instance de message
        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
        #Informations relatives aux pièces jointes
        # {name: file_name, data: data}
        self.attach_file_list = []
        #Interprétation de eml
        self._parse()

    def get_attr_data(self):
        """
Obtenir des données de messagerie
        """
        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):
        """
Analyse des fichiers courrier
        __init__Appeler
        """
        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")
        #Où j'ai changé
        self.date = datetime.datetime.strptime(
            self._get_decoded_header("Date"),
            "%a, %d %b %Y %H:%M:%S %z"
        )

        #Traitement de la partie du corps du message
        for part in self.email_message.walk():
            #Si le ContentType est en plusieurs parties, le contenu réel est encore plus
            #Puisqu'il est dans la partie intérieure, sautez-le
            if part.get_content_maintype() == 'multipart':
                continue
            #Obtenir le nom du fichier
            attach_fname = part.get_filename()
            #Doit être le corps s'il n'y a pas de nom de fichier
            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:
                #S'il y a un nom de fichier, c'est un fichier joint
                #Obtenez des données
                self.attach_file_list.append({
                    "name": attach_fname,
                    "data": part.get_payload(decode=True)
                })

    def _get_decoded_header(self, key_name):
        """
Obtenez le résultat décodé à partir de l'objet d'en-tête
        """
        ret = ""

        #Les clés qui n'ont pas l'élément correspondant renvoient des caractères vides
        raw_obj = self.email_message.get(key_name)
        if raw_obj is None:
            return ""
        #Rendre le résultat décodé unicode
        for fragment, encoding in decode_header(raw_obj):
            if not hasattr(fragment, "decode"):
                ret += fragment
                continue
            #S'il n'y a pas d'encodage, UTF pour le moment-Décoder avec 8
            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)

Créer du code pour extraire le fichier joint du fichier eml dans le dossier

Puisque je suis un amateur, veuillez me pardonner la façon étrange d'écrire comme la façon d'ajouter des variables.

save_attachmentfile.py


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

PATH = r"C:\Users\toshi\***" + "\\"  #Où vous avez enregistré le fichier eml
save_file_path = r"C:\Users\***" + "\\"  #Où vous souhaitez enregistrer le fichier joint


def save_attachmentfile(file_path_list):
    # search_Recevez la liste de eml et enregistrez le fichier joint_Enregistrer dans le chemin
    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)
        #Date
        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):
    #renvoie une liste de noms de fichiers eml
    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)

Lien de référence

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

Recommended Posts

Extraire le modèle du fichier EML enregistré depuis Thunderbird avec python3.7
Extraire le fichier xz avec python
Vérifier l'existence du fichier avec python
Extraire les lignes qui correspondent aux conditions d'un fichier texte avec python
[Python] Résumé des opérations sur les fichiers S3 avec boto3
Extraire le zip avec Python (prend en charge les noms de fichiers japonais)
Extraire les pièces jointes reçues par Thunderbird avec Python
Convertir le code de caractère du fichier avec Python3
Lire ligne par ligne à partir d'un fichier avec Python
Extraire des données d'une page Web avec Python
Extraire le tableau des fichiers image avec OneDrive et Python
Modèle de script python pour lire le contenu du fichier
Apprenez Nim avec Python (dès le début de l'année).
Faire une copie d'un fichier Google Drive à partir de Python
Lire le code QR à partir du fichier image avec Python (Mac)
[Bases de la science des données] Collecte de données depuis RSS avec python
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting
résumé lié à l'opération de fichier python
Dessiner un fichier netCDF avec python
[Python] Extrayez des données texte à partir de données XML de 10 Go ou plus.
Python> Lire à partir d'une chaîne multiligne au lieu d'un fichier> io.StringIO ()
Avec skype, notifiez avec skype de python!
Télécharger le fichier csv avec python
Je souhaite extraire une URL arbitraire de la chaîne de caractères de la source html avec python
Essai de la reconnaissance vocale à l'aide d'Azure avec Python (entrée depuis le microphone)
Essayez d'extraire une chaîne de caractères d'une image avec Python3
Lisez le fichier en Python avec un chemin relatif depuis le programme
Extraire le texte du pdf [python] et lire les caractères à haute voix avec Open-Jtalk
L'idée d'alimenter le fichier de configuration avec un fichier python au lieu de yaml
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
Extraire des tables de base de données avec CSV [connexion ODBC de R et python]
Exécuter le script Python à partir du fichier de commandes
Appeler C depuis Python avec DragonFFI
Chiffrement facile du contenu des fichiers (Python)
Utilisation de Rstan de Python avec PypeR
[Automation] Extraire les rendez-vous Outlook avec Python
[Python] Ecrire dans un fichier csv avec Python
[Automatisé avec python! ] Partie 1: fichier de configuration
Téléchargement de fichiers implémenté avec Python + Bottle
Installez Python à partir des sources avec Ansible
Sortie vers un fichier csv avec Python
Existence du point de vue de Python
Premiers pas avec Python Bases de Python
Extraire du texte d'images avec Python
Jeu de vie avec Python! (Le jeu de la vie de Conway)
Exécutez Aprili depuis Python sur Orange
10 fonctions du "langage avec batterie" python
[Débutant] Extraire des chaînes de caractères avec Python
Extraire le fichier targz en utilisant python
Appelez python de nim avec Nimpy
Implémentation de la méthode Dyxtra par python
[Automatisé avec python! ] Partie 2: Fonctionnement des fichiers
Charger fbx depuis python avec cinema4d
Coexistence de Python2 et 3 avec CircleCI (1.0)
Etude de base d'OpenCV avec Python