如何为每个content_type保存文件,而不是通过imaplib和电子邮件保存每个uid

问题描述 投票:0回答:1

我已成功使用以下代码将每个电子邮件的内容保存为.txt,.html或.PDF文件。但是,我想为每个电子邮件(每个uid)保存每个content_type的版本。当前,它仅为每个uid保存一种文件类型。

例如,带有PDF附件的电子邮件目前仅保存PDF。我希望将PDF附件以及电子邮件的纯文本内容保存在2个单独的文件中。

感谢您的帮助。

import imaplib
import email
import os
import mimetypes

mail = imaplib.IMAP4_SSL('imap.secureserver.net',993)
mail.login('[user]', '[pw]')
mail.select('Inbox')
result, data = mail.uid('search', None, 'ALL')
item_list = data[0].split()

for item in item_list:
    result2, email_data = mail.uid('fetch',item,'(RFC822)')
    raw_email = email_data[0][1].decode("utf-8")
    email_message = email.message_from_string(raw_email)

print_dir = False
if print_dir: print(dir(email_message)) #options, e.g. list of from, to etc.
from_    = email_message['From']
date_    = email_message['Date']

for part in email_message.walk():
    option = str(item)[2:-1] + ' ' + date_[:-15] + ' ' + from_ + ' '

    content_type = part.get_content_type()
    print(str(item),' ',content_type)

    if content_type == 'text/html':
        filename = option + '.html'
    elif content_type == 'text/plain':
        filename = option + '.txt'
    elif content_type == 'application/pdf':
        attachment = part.get_filename() #attachment filename
        filename = option + str(attachment)
    else:
        # Guesses the file type
        ext = mimetypes.guess_extension(content_type)
        if not ext:
            ext = '.bin'
        filename = option + ext

save_path = os.getcwd() + '/' + filename

with open(save_path, 'wb') as fp:
    fp.write(part.get_payload(decode=True))

^对于多类型,我想保存一个带有所有类型扩展名的文件。例如22382,PDF和txt

^当前输出文件

python email imaplib
1个回答
0
投票

我不确定,但是我认为您的问题出在for item in item_list:循环中。

email_message最终只会是该循环中创建的最后一个项目。

您是否需要将循环1选项卡中的几乎所有内容都推送出去?

此外,我假设您要在此行中使用零件而不是项目:option = str(item)[2:-1] + ' ' + date_[:-15] + ' ' + from_ + ' '

再次,不是完全确定,但是希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.