2009-06-06 25 views
2

django.core.mail.EmailMultiAlternativesを使用して、私のdjangoアプリケーションから電子メールを送信しようとしました。電子メールクライアントはHTMLをサポートしていません。 - 問題のないHTMLコンテンツを表示Win2003のOutlook 2003でのDjango EmailMultiAlternativesとHTML電子メールの表示

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や他の多くの電子メールクライアントで素晴らしい作品:

は、ここに私のsend_email方法です。しかし、Win2003上で実行されているOutlook 2003ではHTMLコンテンツが表示されません。テキストバージョンのみです。

私は強制的にEmailMultiAlternativesでHTMLを入れた場合は、そのような_html instead of msg _text、すなわち使用MSGを呼び出す:

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

が、それはすべてのクライアントで正しく動作します。これは、HTMLをサポートしていないクライアント、またはサポートを無効にしている(おそらく)クライアントのためのテキストフォールバックがないことを意味します。

Mac OS Xで動作しているdjangoアプリケーションで電子メールが生成されていることに言及する価値があると思います(OS間の行終端子の違いに関係します)。

私は people using other languagesは、Outlookと同様の問題があったことがわかり

...

誰もが私のコードで適用することができる簡単な修正がある場合、見通しは異なる動作をしてしまうWHYの任意のアイデアを持っているのだろうか?

答えて

5

私はこれをテストするためのOutlookのインストールがありませんので、私はあなたの関数の5行目の理由について疑問に思っています。

self.msg.content_subtype = "html"

私はマルチパートメールの内部について多くを知らないが、ラインが原因と私のシステム上でのメッセージの両方の部分は、テキスト/ HTMLのコンテンツタイプを持っています。それを放置すると、最初の部分には "Content-Type:text/plain"、2番目には "Content-Type:text/html"というメッセージが出力されます。

いずれにしても、Javaについての質問に対する回答の1つは、文字セットをiso-8859-1に変更することです。私はあなたがdjango.core.mailでそれを行うことができるはずだと思います。

(EmailMultiAlternativesが継承する)EmailMessageクラスには、使用する文字セットを設定する "encoding"という名前の属性があります。デフォルトではNoneなので、utf-8のデフォルトの文字セット(設定で上書きされない限り)が代わりに使用されます。機能だけで最初の部分(MSG_TEXTに指定されたエンコーディングを変更します

残念ながら
self.msg.content_subtype = "iso-8859-1"

、:つまり

、質問に記載されている機能では、送信ラインの前に次のようなものを追加上記)。代替コンテンツを添付する関数は、エンコーディング属性を使用していないようです。私はそれが正しいアプローチであるかどうかはわかりませんが、EmailMultiAlternativesをサブクラス化して関連する関数をオーバーライドしても問題ありません。 「smart_str(コンテンツは、settings.DEFAULT_CHARSET)は」一部もむしろ「settings.DEFAULT_CHARSET」よりも「エンコーディング」を参照する必要があれば

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

は私はわからないが、それは扱うテキストが書かれているメッセージ本体(Djangoの。 core.mail.EmailMessage.message)。

私が言ったように、私はOutlookを持っていないので、Outlookのアスペクトを実際にテストすることはできませんが、両方の部分のためにcharsetをiso-8859-1に変更するようです。

+0

どちらもテストするOutlookはありませんが、努力するには+1してください! –

+1

あなたの最初の本能は、私がcontent_subtypeを使いこなすべきではないということです。私の機能からそれを削除すると、Outlook 2003やその他の電子メールクライアントでもHTMLが正しくレンダリングされます。 私は、電子メールの送信に関するDjangoのドキュメントは、content_subtypeへの言及を削除するか、またはそれを使用する方法を明確にすることによって利益を得るかもしれないと思います。私は、Outlookが代替のコンテンツタイプを扱うことができると仮定しました。私はcontent_subtype = 'html'を使うべきです。明らかにそれは事実ではなく、私が達成しようとしていたことに反しています。サニティチェックに感謝します。 – cethegeek

+0

'content_subtype =" iso-8859-1 "'を使用しないでください! MIMEタイプを 'text/iso-8859-1'に設定します。これは明らかにナンセンスです。実際のメッセージを含む' noname'という名前の添付ファイルが空になります。 – Timmmm

関連する問題