将邮箱消息转换为PDF:哪个部分?

时间:2018-04-05 11:39:21

标签: python beautifulsoup

我正在尝试编写一个脚本,将使用pdfkit将我的所有邮件(邮箱mbox格式)导出为PDF文件。

似乎我邮箱中的所有邮件都是多部分的,而我正在努力弄清楚哪部分是相关部分。如果我使用下面的代码遍历所有部分,我将通过电子邮件生成通常3到5个PDF,其中只有一个类似于我用电子邮件客户端打开电子邮件时所看到的。其他部分通常是原始文本或类似的内容:x92O&S\xd2\x0c\xb4e\xee\x0fh\xc68\x1(十六进制?)。

我试图通过包含一个过滤HTML(if bool(BeautifulSoup(html, "html.parser").find()))的测试来解决这个问题,但似乎这不起作用。

for part in message.walk():
    partcounter +=1
    try:
        html = str(part.get_payload(decode=True))
        if bool(BeautifulSoup(html, "html.parser").find()):
            print(str(messagecounter)+'-'+str(partcounter)+' - '+"payload is HTML")
            filename = 'C:/Email_forwarding/Attachments/'+str(messagecounter)+"-"+str(partcounter)+'.pdf'#this keeps the file only for the last part, which seems to be correct
            pdfkit.from_string(html,filename, configuration=config)
            print(str(messagecounter)+'-'+str(partcounter)+' - '+"created %s" %(filename))
        else:
            print(str(messagecounter)+'-'+str(partcounter)+' - '+"payload is not HTML")
    except:
        print(str(messagecounter)+'-'+str(partcounter)+' - '+"no payload or failed to convert")

如何检测多部分电子邮件的哪一部分包含实际的,可解释的HTML?

1 个答案:

答案 0 :(得分:1)

您可以使用part.get_content_type()来过滤邮件的不同部分:

for part in message.walk():
    if part.get_content_type() == 'text/html':
        html = str(part.get_payload(decode=True))