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