2009-06-06 103 views
2

从django应用程序发送电子邮件时使用django.core.mail.EmailMultiAlternatives,试图确保邮件降级为文本电子邮件客户端不支持HTML。在Win2003的Outlook 2003中Django EmailMultiAlternatives和HTML电子邮件显示

这里是我的SEND_EMAIL方法:

def send_email(self, from_address, to_list, subject, msg_text, msg_html): 
     subject=subject.replace('\r','').replace('\n',' ') 
     self.msg = EmailMultiAlternatives(subject, msg_text, from_address, to_list) 
     self.msg.attach_alternative(msg_html, "text/html") 
     self.msg.content_subtype = "html" 
     self.msg.send() 

它与Gmail,Hotmail和其他许多电子邮件客户端的伟大工程 - 显示没有问题的HTML内容。但它不会显示在Win2003上运行的Outlook 2003中的HTML内容 - 只是文本版本。

如果我强行放在EmailMultiAlternatives的HTML调用,即使用味精_html instead of msg _text像这样:

self.msg = EmailMultiAlternatives(subject, msg_html, from_address, to_list) 

那么它正常工作的所有客户端;但这意味着对于不支持HTML的客户端(更可能)已禁用对其的支持,不存在文本回退。

我认为值得一提的是,电子邮件正在Mac OS X上运行的django应用程序上生成(以防万一它与操作系统之间的行结束符差异)。

我看到people using other languages曾与Outlook类似的问题...

我不知道是否有人有,为什么面貌将表现不同任何想法,如果有,可以在我的代码可以应用简单的解决?

回答

5

我没有可用的Outlook安装来测试这个,所以我想知道你的函数中第五行的原因。

self.msg.content_subtype = "html"

我不知道很多关于多电子邮件的内容,但是我的系统行导致该消息的两个部分有一个内容类型text/html的。将它排除出去会在第一部分产生一个带有“Content-Type:text/plain”的消息,在第二部分产生一个带有“Content-Type:text/html”的消息。

在任何情况下,关于Java的问题的答案之一提到将字符集更改为iso-8859-1。我想你应该可以用django.core.mail来做到这一点。

EmailMessage类(EmailMultiAlternatives从中继承)具有名为“encoding”的属性,该属性设置要使用的字符集。默认情况下它是None,所以使用默认的utf-8字符集(除非在设置中被覆盖)。

换句话说,添加类似的问题中列出的功能发送前行的情况如下:

self.msg.content_subtype = "iso-8859-1"

不幸的是,这只会改变在第一部分中指定的编码(msg_text在功能以上)。附加替代内容的功能似乎不使用编码属性。我不确定这是否是正确的方法,但是我将其分类为EmailMultiAlternatives以覆盖相关的功能,并且它似乎可以正常工作。

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) 
      # original text being replaced above (not last argument) 
      # attachment = SafeMIMEText(smart_str(content, 
      #  settings.DEFAULT_CHARSET), subtype, settings.DEFAULT_CHARSET) 
     else: 
      # Encode non-text attachments with base64. 
      attachment = MIMEBase(basetype, subtype) 
      attachment.set_payload(content) 
      Encoders.encode_base64(attachment) 
     if filename: 
      attachment.add_header('Content-Disposition', 'attachment', 
            filename=filename) 
     return attachment

我不知道如果“smart_str(内容,settings.DEFAULT_CHARSET)”部分应该还引用了“编码”,而不是“settings.DEFAULT_CHARSET”但是这是邮件正文处理文本写入(Django的。 core.mail.EmailMessage.message)。

正如我所说的,我没有Outlook,所以我不能真正测试Outlook方面,但它确实似乎将字符集更改为ISO-8859-1两个部分。

+0

我没有Outlook可以测试,但+1努力! – 2009-06-08 09:12:41

相关问题