通过Python脚本下载时无法隔离电子邮件

时间:2013-05-09 15:41:55

标签: python

我有一个脚本从我的帐户中提取电子邮件,下载附件,为电子邮件爆炸程序创建一些html,然后将它们拉成一个漂亮的小档案。这在收件箱中只有一封电子邮件时效果很好,但是,当存在多封电子邮件时,脚本会挂起。我觉得这是因为压缩文件的脚本部分没有正确循环。我想要完成的是每个电子邮件的一个zip文件。收件箱中的3封电子邮件= 3个单独的zip文件。我尽力减少代码以获得最大可读性,同时仍保持核心结构。任何人都可以指出我在正确的方向吗?谢谢!

代码:

for emailid in items:
    resp, data = m.fetch(emailid, "(RFC822)")
    email_body = data[0][1]
    mail = email.message_from_string(email_body)

    for part in mail.walk():
        if part.get_content_type() == 'text/plain':
            content = part.get_payload()
            #do something/define variables from email contents           

    if mail.get_content_maintype() != 'multipart':
        continue

    for part in mail.walk():
        if part.get_content_maintype() == 'multipart':
            continue

        if part.get('Content-Disposition') is None:
            continue

        filename = part.get_filename()
        counter = 1

        if not filename:
            filename = 'part-%03d%s' % (counter, 'bin')
            counter += 1

        att_path = os.path.join(detach_dir, filename)

        if not os.path.isfile(att_path) :
            fp = open(att_path, 'wb')
            fp.write(part.get_payload(decode=True))
            fp.close()

    path = 'C:\directory'
    os.chdir(path)
    for file in os.listdir('.'):
        #download attachments
    htmlFile = str(token)+'.html'
    htmlCode = ('<html>HTML goes here</html>')
    htmlData = open(os.path.join('C:\directory', htmlFile), 'w+')
    htmlData.write(htmlCode)
    print htmlFile+' Complete'
    htmlData.close()
    allFiles = [f for f in os.listdir('.')]
    for file in allFiles:
        archive = zipfile.ZipFile(token+'.zip', mode='a')
        archive.write(file)
        archive.close()
        os.unlink(file)

更新

这是完整代码的附件。 http://ideone.com/WEXv9P

1 个答案:

答案 0 :(得分:1)

这里似乎有一个错误:

        counter = 1

    if not filename:
        filename = 'part-%03d%s' % (counter, 'bin')
        counter += 1

在这个循环中,计数器总是1,你可能想在第二个

之前定义它
for part in mail.walk():

编辑:

好的,所以我认为问题出在代码的最后部分

    allFiles = [f for f in os.listdir('.')]
    for file in allFiles:
        archive = zipfile.ZipFile(token+'.zip', mode='a')
        archive.write(file)
        archive.close()
        os.unlink(file)

这将为电子邮件的每个部分创建一个zip文件

我认为你想要做的就是将它缩进一个级别并将其改为更像这样的东西:

allFiles = [f for f in os.listdir(detach_dir) if not f.endswith(".zip")]
for file in allFiles:
    archive = zipfile.ZipFile(token+'.zip', mode='a')
    archive.write(file)
    archive.close()
    os.unlink(file)

这样它就不会递归压缩其他zip文件或删除它们