Мы должны обрабатывать вложения электронной почты отдельно.Однако, если мы используем walk()
, который является универсальным генератором, который можно использовать для итерации по всем частям и частям дерева объектов сообщений, в порядке обхода в глубину , в итоге мы также анализируем вложение электронной почты.
Итак, нам нужно будет использовать get_payload()
для получения каждой отдельной части письма.Вот как мы можем проанализировать вложения электронной почты -
def get_subject(msgobj) :
subject = None
if msgobj['Subject'] is not None:
decodefrag = decode_header(msgobj['Subject'])
subj_fragments = []
for s , enc in decodefrag:
if enc:
s = unicode(s , enc).encode('utf8','replace')
subj_fragments.append(s)
subject = ''.join(subj_fragments)
subject = re.sub('\n', '', subject)
return subject
def get_msg_file_as_attachment(message_part):
attachment = {}
attachment['data'] = message_part.get_payload()[0].as_string(unixfrom=True)
attachment['content_type'] = message_part.get_content_type()
attachment['name'] = get_subject(message_part.get_payload()[0])
attachment['name'] += '.eml'
attachment['size'] = len(attachment['data'])
return attachment
def parse_attachment(message_part):
content_disposition = message_part.get("Content-Disposition", None)
content_type = message_part.get_content_type()
if content_disposition:
dispositions = content_disposition.strip().split(";")
if bool(content_disposition and (dispositions[0].lower() == "attachment" or dispositions[0].lower() == "inline")):
if (content_type.lower().strip() == 'message/rfc822'):
return get_msg_file_as_attachment(message_part)
else:
file_data = message_part.get_payload(decode=True)
attachment = {}
attachment['data'] = file_data
attachment['content_type'] = content_type
attachment['size'] = len(file_data)
attachment['name'] = message_part.get_filename()
return attachment
return None