在本篇博客中,我们将解析一段Python代码,该代码可以从电子邮件中下载附件并提取发送人、主题和日期等元数据。
这段代码包含两个函数:download_file
和 get_email_title
。其中,download_file
函数用于将附件保存到指定路径;而 get_email_title
函数则用于提取发件人、主题和日期等信息。
download_file 函数
def download_file(msg):
fpath = os.getcwd()
path_name = qq_email_rx.Subject
out_file = fpath + "\\" + path_name
print('文件保存路径是:', out_file)
doc_function.mkdir(out_file)
attachment_files = []
for part in msg.walk():
file_name = part.get_filename()
contentType = part.get_content_type()
mycode = part.get_content_charset()
if file_name:
h = Header(file_name)
dh = decode_header(h)
filename_download = dh[0][0]
if dh[0][1]:
filename_download = email_parse.decode_str(str(filename_download, dh[0][1]))
attachment_files.append(filename_download)
data = part.get_payload(decode=True)
with open(out_file + "\\" + filename_download, 'wb') as f:
f.write(data)
qq_email_rx.filename = attachment_files
src = out_file + "\\" + filename_download
if qq_email_rx.filename[0].find(".mp3") != -1:
dst = out_file + "\\" + "mp3-" + qq_email_rx.Date + filename_download
time.sleep(2)
elif qq_email_rx.filename[0].find(".jpg") != -1 or qq_email_rx.filename[0].find(".bmp") != -1 or \
qq_email_rx.filename[0].find(".png") != -1:
pic_name = doc_function.search_file("pic")
if pic_name == None:
pic_num = 0
else:
pic_num = len(pic_name)
dst = out_file + "\\" + "pic" + str(pic_num) + "-" + qq_email_rx.Date + filename_download
qq_email_tx.main_body = qq_email_tx.main_body + str(pic_num) + "-"
else:
dst = out_file + "\\" + qq_email_rx.Date + filename_download
try:
os.rename(src, dst)
except:
os.remove(dst)
os.rename(src, dst)
print(f'附件 {filename_download} 已下载及重命名完成')
elif contentType == 'text/plain':
data = part.get_payload(decode=True)
content = data.decode(mycode)
qq_email_rx.main_body = content
download_file
函数首先获取当前工作目录,并以电子邮件的主题名称作为文件夹名称创建一个新的文件夹。该函数然后遍历电子邮件中的每一部分,使用 msg.walk()
方法检查是否包含任何附件。如果找到附件,则将其保存到之前创建的文件夹中,并使用 open()
函数重命名文件以包含日期和时间,并相应地更新全局变量 qq_email_rx
和 qq_email_tx
。如果电子邮件包含纯文本,则函数从中提取文本,并将其存储在 qq_email_rx
的 main_body
属性中。
get_email_title 函数
def get_email_title(msg):
for header in ['From', 'Subject', 'Date']:
value = msg.get(header, '')
if value != '':
if header == 'From':
hdr, addr = parseaddr(value)
name = email_parse.decode_str(hdr)
value = '%s <%s>' % (name, addr)
qq_email_rx.From = name
elif header == 'Subject':
value = email_parse.decode_str(value)
if value.find("回复") != -1:
qq_email_rx.Subject = value[3:]
print(qq_email_rx.Subject)
else:
qq_email_rx.Subject = value
elif header == 'Date':
value = email_parse.decode_str(value)
print(value)
time_format = datetime.datetime.strptime(value, '%a, %d %b %Y %H:%M:%S +%f')
qq_email_rx.Date = time_format.strftime("%Y-%m-%d %H-%M-%S-")
print(qq_email_rx.Date)
print('%s: %s' % (header, value))
get_email_title
函数从电子邮件头中提取发送人、主题和日期等信息。它使用 msg.get()
方法获取每个头字段的值,并使用 email_parse.decode_str()
函数对其进行解码。发送者的名称和电子邮件地址分别使用 parseaddr()
方法提取。检查主题行是否包含“回复”一词,如果包含,则将其后面的字符用作文件夹名称。最后,使用 datetime.datetime.strptime()
方法解析日期,并使用 strftime()
方法将其转换为标准格式,然后将其存储在 qq_email_rx
的 Date
属性中。
这是一个有用的代码片段,可以在需要从电子邮件中提取附件和元数据时使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)