アカウントから電子メールを取得し、添付ファイルをダウンロードし、電子メール ブラスト プログラム用の 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