【问题标题】:How can I send an email with a zip file attached in Python?如何发送带有 Python 附件的 zip 文件的电子邮件?
【发布时间】:2012-10-22 06:42:42
【问题描述】:

我的目录中有一个名为 csv 的 zip 文件夹:

  • /home/local/user/project/zip_module/csv

我想用这个 zip 文件夹作为附件发送一封电子邮件。

到目前为止,我已经使用 smtplib 从 Python 发送电子邮件 模块,但我不知道如何发送带有 zip 文件夹作为附件的电子邮件。

我在 Google 上搜索过,但我找到的代码是用于压缩和发送电子邮件,而不是在电子邮件中附加 zip 文件。

【问题讨论】:

    标签: python email zip


    【解决方案1】:

    假设您要附加的 zip 文件是 '/home/local/user/project/zip_module/csv.zip', 和tosendersubjecttext 分别包含您的收件人地址、发件人地址、主题和邮件文本。

    那么,

    import smtplib, MimeWriter, mimetools, base64
    
    message = StringIO.StringIO()
    email_msg = MimeWriter.MimeWriter(message)
    email_msg.addheader('To', to)
    email_msg.addheader('From', sender)
    email_msg.addheader('Subject', subject)
    email_msg.addheader('MIME-Version', '1.0')
    
    email_msg.startmultipartbody('mixed')
    
    part = email_msg.nextpart()
    body = part.startbody('text/plain')
    part.flushheaders()
    body.write(text)
    
    file_to_attach = '/home/local/user/project/zip_module/csv.zip'
    filename = os.path.basename(file_to_attach)
    ftype, encoding = 'application/zip', None
    
    part = email_msg.nextpart()
    part.addheader('Content-Transfer-Encoding', encoding)
    body = part.startbody("%s; name=%s" % (ftype, filename))
    mimetools.encode(open(file_to_attach, 'rb'), body, encoding)
    
    email_msg.lastpart()
    
    email_text = message.getvalue()
    

    现在像使用smtplib 一样发送电子邮件,将email_text 用作msg

    例如

    smtp = smtplib.SMTP(SERVER, PORT)
    smtp.login(USER, PASSWORD)
    smtp.sendmail(sender, to, email_text)
    smtp.quit()
    

    【讨论】:

    • k 我尝试了上面的代码,它显示了 Traceback(最近一次调用最后一次):文件“schedular_runner.py”,第 78 行,在 part.addheader('Content-Transfer-Encoding', encoding)文件“/usr/lib64/python2.7/MimeWriter.py”,第 105 行,在 addheader 行 = value.split("\n") AttributeError: 'NoneType' object has no attribute 'split'
    • 我的错,请使用编码为 'binary' 或 'base64' 而不是这里声明的 None ftype, encoding = 'application/zip', None
    • 谢谢,但实际上一封电子邮件已成功发送,但该邮件没有附件,我通过打印知道是否有 file_to_attach 路径,我可以看到将要保存的 zip 文件已提取,但未附加到邮件中
    【解决方案2】:

    试试标准库中的email package。它允许您构建多部分 MIME 消息,其中可以包含 text/plain 部分(用于您要发送的文本)和 application/zip 部分用于 ZIP 文件。然后,您可以将消息序列化为字符串并使用smtplib 发送。

    【讨论】:

      猜你喜欢
      • 2014-11-09
      • 2017-02-04
      • 2019-11-21
      • 1970-01-01
      • 2015-09-09
      • 2017-09-06
      相关资源
      最近更新 更多