如何转码,email有专门的工具。
网上说的是encode为UTF-8然后读取,我发现这样BUG多,既然邮件是bytes,就按照bytes读取。
当配好句柄以后(我将句柄设置为email)
mail=p.retr(i)[1]
mail=b'\n'.join(mail)
msg=email.message_from_bytes(mail)
即可获得一个邮件正文。
其中msg就是一个处理邮件的类。
通过email中的waik()命令遍历所有程序体。
然后getpayload
有人说:网上需要multipart判断,但是按照我的经验:用BYTES一读不会出现问题,会扁平化。
用创建文件为例:
C:\
C:\d1
c:\d2
c:\d3\s1
然后读取完了就会:d1、d2、s1,无视multipart的问题……
get_content_charset()获取该part的编码。
然后,调用get_payload(decode=True)转化为bytes,然后对bytes进行编码decode,即可获取文本正体。
def get_file(msg):
data_char=''
for part in msg.walk():
part_charset=part.get_content_charset()
print(part_charset)
part_type=part.get_content_type()
#print(part_type)
if part_type=="text/plain" or part_type=='text/html':
data=part.get_payload(decode=True)
try:
data=data.decode(part_charset,errors="replace")
except:
data=data.decode('gb2312',errors="replace")
data=html_to_plain_text(data)
data_char=data_char+'\n'+data
return data_char+'\n'
当文件进行处理的时候,会获取两个部分:html部分和纯文本部分。
通过这个函数可以将html转化为text文本。
我自己对这个东西不太了解,所以没的说……
import re
from html import unescape
#这个程序的作用是为了将html转化成txt文本,转化能力还不错……
def html_to_plain_text(html):
text = re.sub('<head.*?>.*?</head>', ' ', html, flags=re.M | re.S | re.I)
text = re.sub(r'<a\s.*?>', ' HYPERLINK ', text, flags=re.M | re.S | re.I)
text = re.sub('<.*?>', ' ', text, flags=re.M | re.S)
text = re.sub(r'(\s*\n)+', '\n', text, flags=re.M | re.S)
return unescape(text)
通过这个处理方式处理的邮件结果是(为了加密我删除了一点敏感信息):
服 <jusu@126.com>
<sdmcms@ipur.com>
你好!为高新专家装维人员,因前期村的情况,还请协助恢复原有权限,谢谢
省公司领导:
您好!
为高新专家装维人员,因前期村的情况,还请协助恢复原有权限,谢谢
您好! 为高新专家装维人员,因前期村的情况,还请协助恢复原有权限,谢谢
会出现重复文本的问题。
如果想要无格式文本,那么只读取text/plain即可。我是为了不漏信息,所以同时采集html和plain的信息