通过电子邮件发送的邮件在首次尝试时无效

时间:2015-06-23 14:59:24

标签: python email python-3.x mime-types mime

我尝试创建一个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,我可以解压缩并使用这些文件。

我是一个蟒蛇新手,说实话,我现在很难达到目前的水平,但解决这个问题让我头疼。谁能解释一下我做错了什么?

2 个答案:

答案 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))    

详细信息据我所知。

第一次运行

  • zipfile创建文件描述符(在内存占位符中)和包清单(要添加的文件)
  • zipfile.write()将文件压缩到文件描述符中,并将文件添加到清单
  • msg.attach()文件没有刷新,因此内存中仍然没有任何内容。
  • - 结束脚本文件描述符清理将文件描述符刷新到磁盘。 (reports.zip存在但不完整/无效)

第二轮

  • zipfile创建一个fd和manifest
  • zipfile.write()将文件压缩到fd并将文件添加到清单
  • msg.attach()文件上次刷新但仍然不完整附加无效文件

答案 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

免责声明:我是yagmail的开发者,这是一个试图让您轻松发送电子邮件(包含或不包含附件)的软件包。