【问题标题】:Python -- Emailed Zip Archieve not displaying correctlyPython - 通过电子邮件发送的 Zip 存档未正确显示
【发布时间】:2017-06-20 19:13:47
【问题描述】:

我有一个程序可以向我自己和其他一些人发送每日自动报告。这些报告被写入我的/tmp/ 目录中的一个文件夹,然后压缩成一个 Zip 存档并作为附件通过电子邮件发送。我期望的结果是所有用户都可以将附件视为Reports_2017-06-20.zip(或当天的任何日期)。在我的电子邮件客户端上,我看到附件为_tmp_Engineering_Reports_2017-06-20.zip。该报告的一位收件人声称该附件仅出现在他的电子邮件客户端2。在所有情况下,文件都通过电子邮件成功传输,但最终用户通常必须手动重命名 zip 文件才能提取文件并查看它们。下面是我的电子邮件课程。字典passed_values 是在此类之外创建的。被传递的filename/tmp/Reports_2017-06-20

import smtplib
from email import encoders
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText


class EmailHandler(object):
    def __init__(self, passed_values):
        self._filename = passed_values.get('filename')
        self._subject = passed_values.get('subject')
        self._from_address = passed_values.get('from_address')
        self._to_addresses = passed_values.get('to_addresses')
        self._email_password = passed_values.get('email_password')
        self._body = passed_values.get('body')

    @property
    def filename(self):
        return self._filename

    @filename.setter
    def filename(self, value):
        self._filename = value

    @property
    def from_address(self):
        return self._from_address

    @from_address.setter
    def from_address(self, value):
        self._from_address = value

    @property
    def to_addresses(self):
        return self._to_addresses

    @to_addresses.setter
    def to_addresses(self, value):
        self._to_addresses = value

    @property
    def body(self):
        return self._body

    @body.setter
    def body(self, value):
        self._body = value

    @property
    def subject(self):
        return self._body

    @body.setter
    def body(self, value):
        self._body = value

    def send_email_with_attachment(self):
        msg = MIMEMultipart()
        msg['From'] = self._from_address
        msg['To'] = ', '.join(self._to_addresses)
        msg['Subject'] = self._subject
        msg.attach(MIMEText(self._body, 'plain'))
        attachment = open (self._filename + '.zip', "rb")
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(attachment.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', "attachment; filename= %s" % self._filename + '.zip')
        msg.attach(part)
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.starttls()
        server.login(self._from_address, self._email_password)
        text = msg.as_string()
        server.sendmail(self._from_address, self._to_addresses, text)
        server.quit()

谁能告诉我我做错了什么?

【问题讨论】:

  • 我会尝试在add_header 行中使用os.path.basename(self._filename) 来删除/tmp/。我的猜测是电子邮件客户端不知道如何处理包含斜杠的“文件名”。
  • 另外,您说传入的文件名是/tmp/Reports_2017-06-20.zip,但这不意味着您将使用一个名为/tmp/Reports_2017-06-20.zip.zip 的文件吗? (您似乎在使用 self._filename 的任何地方都附加了 .zip。)
  • “.zip.zip”是输入问题时出现的错误,我正在传递/tmp/Reports_2017-06-20。好眼力,我正在纠正我原来的问题。
  • @smarx 成功了。如果您发布您的 os.path.basename() 建议作为答案,我会接受它。非常感谢!

标签: python email zip attachment


【解决方案1】:

使用os.path.basename,因此您只在Content-Disposition 标头中发送文件名(而不是完整路径)。似乎电子邮件客户端不确定如何处理包含斜杠的“文件名”。

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多