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