Python - Emailed Zip Archieve无法正确显示

问题描述:

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

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() 

任何人都可以告诉我我做错了什么?

+0

我想尝试在'add_header'行中使用'os.path.basename(self._filename)'来删除'/ tmp /'。我的猜测是,电子邮件客户端不知道如何处理包含斜线的“文件名”。 – smarx

+0

另外,你说文件传入的是'/ tmp/Reports_2017-06-20.zip',但这并不意味着你将使用一个名为'/tmp/Reports_2017-06-20.zip.zip的文件'? (在你使用'self._filename'的地方,你似乎会追加'.zip'。) – smarx

+0

'.zip.zip'是输入问题时出错,我传递给'/ tmp/Reports_2017-06-20' 。好眼睛,我在原来的问题中纠正它。 – OnlyDean

使用os.path.basename所以您只发送Content-Disposition标头中的文件名(不是完整路径)。看来,电子邮件客户端不知道如何处理包含斜线的“文件名”。