我尝试创建一个zip存档,其中包含来自特定目录(和子目录)的所有文件,并通过邮件发送:
#Create archive containing all files from directory "reports/"
zipf = zipfile.ZipFile('reports.zip', 'w')
for root, dirs, files in os.walk('reports/'):
for file in files:
zipf.write(os.path.join(root, file))
#Create email
msg = MIMEMultipart()
msg["From"] = emailfrom
msg["To"] = emailto
msg["Subject"] = "Monatliche Reports - Verrechnung an Kunden"
#Attach report.zip to email
fp = open(fileToSend, "rb")
attachment = MIMEBase('application', 'zip')
attachment.set_payload(fp.read())
fp.close()
encoders.encode_base64(attachment)
attachment.add_header("Content-Disposition", "attachment",
filename=fileToSend)
msg.attach(attachment)
#Send email via localhost smtp-server
server = smtplib.SMTP("localhost")
server.sendmail(emailfrom, emailto, msg.as_string())
server.quit()
该脚本似乎有效。我收到包含所有文件的附加zip档案的邮件。执行脚本时,有两种可能的情况:
案例1:在执行脚本之前已经有一个zip存档,名为report.zip(上一次运行中的旧脚本)
案例2:执行脚本之前没有zip存档。
在案例1中一切正常。旧的将被替换为新生成的,然后通过电子邮件发送。
在案例2中,report.zip已生成并通过电子邮件发送,但无效。如果我尝试在Windows上使用7zip(或Windows板载工具)打开它,它只会说“存档无效”。我发现只有通过电子邮件发送的report.zip才会被破坏。如果我通过电子邮件手动发送在案例2中生成的report.zip,我可以解压缩并使用这些文件。
我是一个蟒蛇新手,说实话,我现在很难达到目前的水平,但解决这个问题让我头疼。谁能解释一下我做错了什么?
答案 0 :(得分:2)
添加文件后需要关闭zip文件以确保存档完整。
https://docs.python.org/2/library/zipfile.html#zipfile.ZipFile.close
更好地使用with
声明:
with zipfile.ZipFile('reports.zip', 'w') as zipf:
for root, dirs, files in os.walk('reports/'):
for file in files:
zipf.write(os.path.join(root, file))
详细信息据我所知。
第一次运行:
第二轮:
答案 1 :(得分:0)
试试这个:
import yagmail
me = 'me@gmail.com'
yag = yagmail.SMTP(emailfrom, 'mypassword')
yag.send(emailto, "Monatliche Reports - Verrechnung an Kunden", 'reports.zip')
您可能需要使用pip install yagmail
免责声明:我是yagmail的开发者,这是一个试图让您轻松发送电子邮件(包含或不包含附件)的软件包。