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.
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)
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)
https://qiita.com/denzow/items/a42d344fa343cd80cf86 https://stackoverflow.com/questions/21711404/how-to-get-decode-attachment-filename-with-python-email
Recommended Posts