2017-08-10 106 views
2

我有下面的代码,当我用它发送一个txt文件,图像或音频时,它的工作状态非常好。但是,当我尝试发送zip文件,rar文件或没有自己的MIME(与MIMEText,MIMEImage或MIMEAudio无关)的任何其他文件时,它不起作用。将一个zip文件添加到电子邮件

总之,每当我到了其他部分(MIMEBase命令)我做错事并且得到错误:

e.send_mail(TARGET, SUBJECT, "file.zip")  
msg.attach(part)   //two lines after the else's end 
AttributeError: 'str' object has no attribute 'append' 

代码:

def send_mail(self, target, subject, *file_names): 
    """ 
    send a mail with files to the target 
    @param target: send the mail to the target 
    @param subject: mail's subject 
    @param file_names= list of files to send 
    """ 
    msg = email.MIMEMultipart.MIMEMultipart() 
    msg['From'] = self.mail 
    msg['To'] = email.Utils.COMMASPACE.join(target) 
    msg['Subject'] = subject 
    for file_name in file_names: 
     f = open(file_name, 'rb') 
     ctype, encoding = mimetypes.guess_type(file_name) 
     if ctype is None or encoding is not None: 
      ctype = 'application/octet-stream' 
     maintype, subtype = ctype.split('/', 1) 
     # in case of a text file 
     if maintype == 'text': 
      part = MIMEText(f.read(), _subtype=subtype) 
     # in case of an image file 
     elif maintype == 'image': 
      part = MIMEImage(f.read(), _subtype=subtype) 
     # in case of an audio file 
     elif maintype == 'audio': 
      part = MIMEAudio(f.read(), _subtype=subtype) 
     # any other file 
     else: 
      part = MIMEBase(maintype, subtype) 
      msg.set_payload(f.read()) 
     part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file_name)) 
     msg.attach(part) 
     f.close() 
    # ssl server doesn't support or need tls, so don't call server_ssl.starttls() 
    self.server_ssl.sendmail(self.mail, target, msg.as_string()) 
    #server_ssl.quit() 
    self.server_ssl.close() 

我见过类似的代码,但我不明白我的问题。

你能解释一下我搞砸了吗?

谢谢!

+0

TNX你试图帮助我。但是,其他人甚至没有看到我的问题。我发誓,花了不到5秒,直到有人没有阅读它而投下我的问题。 – tzadok

+0

@tzadok没人downvoted你...你有2个upvotes – paper1111

+0

我们在谈论其他一些问题我问 – tzadok

回答

0

如果它可以帮助任何人在这里就是答案: 的主要问题是,我改变了味精的有效载荷,而不是zip文件的

def send_mail(self, target, subject, body, *file_names): 
     """ 
     send a mail with files to the target 
     @param target: send the mail to the target 
     @param subject: mail's subject 
     @param file_names= list of files to send 
     """ 
     msg = MIMEMultipart() 
     msg['From'] = self.mail 
     msg['To'] = target 
     msg['Subject'] = subject 
     body_part = MIMEText(body, 'plain') 
     msg.attach(body_part) 
     for file_name in file_names: 
      f = open(file_name, 'rb') 
      ctype, encoding = mimetypes.guess_type(file_name) 
      if ctype is None or encoding is not None: 
       ctype = 'application/octet-stream' 
      maintype, subtype = ctype.split('/', 1) 
      # in case of a text file 
      if maintype == 'text': 
       part = MIMEText(f.read(), _subtype=subtype) 
      # in case of an image file 
      elif maintype == 'image': 
       part = MIMEImage(f.read(), _subtype=subtype) 
      # in case of an audio file 
      elif maintype == 'audio': 
       part = MIMEAudio(f.read(), _subtype=subtype) 
      # any other file 
      else: 
       part = MIMEBase(maintype, subtype) 
       part.set_payload(f.read()) 
      encoders.encode_base64(part) 
      part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file_name)) 
      msg.attach(part) 
      f.close() 
     # ssl server doesn't support or need tls, so don't call server_ssl.starttls() 
     self.server_ssl.sendmail(self.mail, target, msg.as_string()) 
     self.server_ssl.quit() 
相关问题