Si vous utilisez le package email de Python, le fichier eml qui peut enregistrer les e-mails n'est qu'une bibliothèque standard. C'est facile à analyser.
Obtenez le fichier joint, le sujet, le corps, etc. du fichier eml, bien que ce soit le minimum car il est nécessaire pour les affaires. J'ai fait un cours.
# coding:utf-8
"""
Obtenez des données basées sur un fichier eml pour une manipulation facile
échantillon.
Il peut y avoir des omissions en raison de la mise en œuvre minimale. .. ..
"""
import sys
import email
from email.header import decode_header
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 = ""
#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 = """\
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):
"""
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")
#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)
Pour le moment, les résultats attendus ont été obtenus. J'espère que cela vous sera utile pour gérer les e-mails.
Recommended Posts