2013-03-19 5 views
5

Wenn ich einige Dateien hinzufügen - sie erscheinen als "Noname" in Anhänge ... Nicht nur Google Mail. Django 1.3.1, utf-8 benannte Dateien. Gibt es eine Chance, es ohne Umwandlung in ASCII zu arbeiten? Solange ich es nicht umwandeln kann, um Original-Dateinamen zu speichern, ist sehr wichtig.Django E-Mail-Anhänge sendet als "Noname"

Imgur

Update:
Inzwischen Header scheint echt:

Headers

+0

Wenn Sie es behoben haben, die Lösung als Antwort posten und es akzeptieren. – arulmr

Antwort

7

Ok. Dachte es mit folgendem Code aus:

import mimetypes 
from email import encoders 
from email.header import Header 
from email.mime.base import MIMEBase 
from django.core.mail.message import DEFAULT_ATTACHMENT_MIME_TYPE 

class EmailMultiAlternativesWithEncoding(EmailMultiAlternatives): 
    def _create_attachment(self, filename, content, mimetype=None): 
     """ 
     Converts the filename, content, mimetype triple into a MIME attachment 
     object. Use self.encoding when handling text attachments. 
     """ 
     if mimetype is None: 
      mimetype, _ = mimetypes.guess_type(filename) 
      if mimetype is None: 
       mimetype = DEFAULT_ATTACHMENT_MIME_TYPE 
     basetype, subtype = mimetype.split('/', 1) 
     if basetype == 'text': 
      encoding = self.encoding or settings.DEFAULT_CHARSET 
      attachment = SafeMIMEText(smart_str(content, 
       settings.DEFAULT_CHARSET), subtype, encoding) 
     else: 
      # Encode non-text attachments with base64. 
      attachment = MIMEBase(basetype, subtype) 
      attachment.set_payload(content) 
      encoders.encode_base64(attachment) 
     if filename: 
      try: 
       filename = filename.encode('ascii') 
      except UnicodeEncodeError: 
       filename = Header(filename, 'utf-8').encode() # This is the important line 
      attachment.add_header('Content-Disposition', 'attachment', 
            filename=filename) 
     return attachment 
1

Gemäß den in Ticket fix gemacht 14964:

from django.core.mail import EmailMultiAlternatives 
import mimetypes 
from django.core.mail.message import DEFAULT_ATTACHMENT_MIME_TYPE 

class UnicodeEmailMultiAlternatives(EmailMultiAlternatives): 

    def _create_attachment(self, filename, content, mimetype=None): 
     """ 
     Overrides EmailMultiAlternatives method to allow UTF8 filenames as attachments. 
     """ 
     if mimetype is None: 
      mimetype, _ = mimetypes.guess_type(filename) 
      if mimetype is None: 
       mimetype = DEFAULT_ATTACHMENT_MIME_TYPE 
     attachment = self._create_mime_attachment(content, mimetype) 
     if filename: 
      try: 
       filename = filename.encode('ascii') 
      except UnicodeEncodeError: 
       filename = ('utf-8', '', filename.encode('utf-8')) 
      attachment.add_header('Content-Disposition', 'attachment', 
            filename=filename) 
     return attachment 
Verwandte Themen