-2

アカウントから電子メールを取得し、添付ファイルをダウンロードし、電子メール ブラスト プログラム用の html を作成し、それらを素敵な小さなアーカイブに圧縮するスクリプトがあります。これは、受信トレイに電子メールが 1 つしかない場合はうまく機能しますが、複数の電子メールが存在する場合はスクリプトがハングします。これは、ファイルを圧縮するスクリプトのセクションが正しくループしていないためだと思います。私が達成しようとしているのは、電子メールごとに 1 つの 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

4

1 に答える 1

1

ここに間違いがあるようです:

        counter = 1

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

カウンタはこのループで常に 1 になります。おそらく 2 番目の前に定義する必要があります

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ファイルを再帰的に圧縮したり、それらを削除したりしません

于 2013-05-09T19:44:15.967 に答える