8

インライン画像を使用してDjangoでメールを作成しようとしています。

msg = EmailMultiAlternatives(...)
image_file = open('file_path', 'rb') 
img = MIMEImage(img_data)
image_file.close()
img.add_header('Content-ID', '<image1>') 
img.add_header('Content-Disposition', 'inline')
msg.attach(img)
msg.send()

そして、テンプレートでは、次のように参照します。

<img src="cid:image1" />

これは、Webブラウザ、Outlook、Thunderbirdなどで正常に機能します。OSX、iPad、iPhoneのアップルメールクライアントを除きます。画像は2回表示されます。それらは正しくインラインに配置されますが、電子メールの下部にも添付されます。私の質問は、どうすれば下部の画像を取り除くことができますか?または、メール内の画像に別の方法でアプローチする必要があります。

参照:
http ://djangosnippets.org/snippets/1507/
Django:画像が埋め込まれたHTMLメールを送信する方法
Python/djangoで送信する画像を含むMIMEメールテンプレートを作成する

4

1 に答える 1

12

multipart/mixedさまざまな電子メールクライアントが、さまざまな方法でメッセージをレンダリングすることを選択します。

ほとんどのクライアントは、各パートを(「マルチパート」メッセージで)インラインで、電子メールに追加された順序でレンダリングすることを選択します。ただし、画像がtext/htmlパーツで参照されている場合、ほとんどのクライアントは、「すべてのパーツのインライン化」プロセスの一部として、後でその画像を再度表示することはありません。

OSXとiOSのAppleMailは、HTMLと画像の間の内部参照に関係なく、メッセージ内の各部分を含まれている順序で表示するという点で異なります。multipart/mixedこれにより、画像がHTML内に一度表示され、メッセージの最後に自動的にインライン化されて表示されます。

解決策は、HTMLアセットと画像アセットを1つrelatedの部分にグループ化することです。すなわち:

from django.core.mail import EmailMultiAlternatives
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# HTML + image container 
related = MIMEMultipart("related")

# Add the HTML
html = MIMEText('an image: <img src="cid:some_image"/>', "html")
related.attach(html)

# Add an image
with open("icon.png", "rb") as handle:
    image = MIMEImage(handle.read())
image.add_header("Content-ID", "<some_image>")
image.add_header("Content-Disposition", "inline")
related.attach(image)

# top level container, defines plain text version
email = EmailMultiAlternatives(subject="demo", body="plain text body",
                               from_email="foo@example.com",
                               to=["bar@example.com"])
# add the HTML version
email.attach(related)

# Indicate that only one of the two types (text vs html) should be rendered
email.mixed_subtype = "alternative"
email.send()
于 2012-04-12T04:12:32.863 に答える