4

私のDjangoアプリはHTML形式でメールを送信する必要があります。公式文書によると:

電子メールにコンテンツの複数のバージョンを含めると便利な場合があります。典型的な例は、メッセージのテキストバージョンとHTMLバージョンの両方を送信することです。Djangoのメールライブラリでは、EmailMultiAlternativesクラスを使用してこれを行うことができます。EmailMessageのこのサブクラスには、電子メールにメッセージ本文の追加バージョンを含めるためのattach_alternative()メソッドがあります。他のすべてのメソッド(クラスの初期化を含む)は、EmailMessageから直接継承されます。

...私は次のコードを思いついた:

from django.core.mail import EmailMultiAlternatives
msg = EmailMultiAlternatives()
msg.sender = "someone@somewhere.com"
msg.subject = subject
msg.to = [target,]
msg.attach_alternative(content, "text/html")
msg.send()

これは期待どおりに機能します。ただし、状況によっては、PDF添付ファイルを含める必要があります。そのために、直前に次のコードを追加しましたmsg.send()

if attachments is not None:
    for attachment in attachments:
        content = open(attachment.path, 'rb')
        msg.attach(attachment.name,content.read(),'application/pdf')

これは機能しますが(すべてのPDFドキュメントが電子メールに適切に添付されます)、望ましくない副作用として、電子メールのHTMLコンテンツが消え、PDF文書が添付された空の電子メール本文が残ります。

私はここで何が間違っているのですか?

4

2 に答える 2

6

私はそれを考え出した。

を使用する場合EmailMultiAlternatives、電子メールに追加の添付ファイルがある状況では、電子メールの本文のテキスト形式と HTML 形式の両方を提供する必要があるようです。添付ファイルのない電子メールには問題ない HTML 形式のみを提供しましたが、PDF 文書のように他の添付ファイルが追加されると、どういうわけか混乱しました。

最終的な作業コード:

text_content = strip_tags(content)
msg = EmailMultiAlternatives()
msg.sender = "someone@somewhere.com"
msg.subject = subject
msg.to = [target]
msg.body = text_content
msg.attach_alternative(content, "text/html")
if attachments is not None:
    for attachment in attachments:
        content = open(attachment.path, 'rb')
        msg.attach(attachment.name,content.read(),'application/pdf')
msg.send()
于 2013-01-29T12:02:32.550 に答える
3

プレーン テキストと text/html バージョンの両方を提供する場合は、EmailMultiAlternatives を使用します。表示するバージョンを決定するのは、受信者の電子メール クライアント次第です。必要なのは次のとおりです。

from django.core import mail

....

msg = mail.EmailMessage(subject, content,
                        to=[target], from_email='someone@somewhere.com')
if attachments is not None:
    for attachment in attachments:
        msg.attach_file(attachment, 'application/zip')
于 2013-01-29T10:35:08.630 に答える