2012-04-11 22 views
7

インライン画像付きのDjangoで電子メールを作成しようとしています。iPhone、iPadでのインライン画像の表示

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" /> 

これは、すべてのOSX、iPadのリンゴのメールクライアントを除いて... Webブラウザ、見通し、サンダーバードで正常に動作し、 iPhone。画像は2回表示されます。それらは正しくインラインに配置されますが、メールの下部にも添付されます。私の質問は、どうやって底の画像を取り除くのですか?私は電子メールの画像に別の方法でアプローチするべきですか?

参考文献:
http://djangosnippets.org/snippets/1507/
Django: How to send HTML emails with embedded images
creating a MIME email template with images to send with python/django

+0

ことで、人々がより多くの興味を見つけて、今のところ「Djangoの電子メールを使用して作成された」を求める忘れて。 – hynekcer

+0

助けてくれてありがとう – SunnySydeUp

+0

イメージを添付することは、私が知っている限り、デフォルトで表示させる試みです。つまり、 "[email protected]のすべてのイメージを表示"を有効にする必要はありません。サーバー上でホストされているイメージへのURL。画像は一度しか表示されませんが、ユーザからの操作が必要な場合があります –

答えて

10

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

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

Apple Mailのは、これまでのところ、彼らかかわらず、HTMLと画像の間のいずれかの内部リファレンスの、それらが含まれていたために、multipart/mixedメッセージ内の各部分を表示するように、異なっています。この結果、画像はHTML内に1回表示され、メッセージの最後に自動的にインライン表示されます。

解決策は、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="[email protected]", 
           to=["[email protected]"]) 
# 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() 
+0

「画像を表示...」を押さずにGmailにメールを表示しますか? – nelsonvarela

+0

@iAmTheOneAndOnly私はそれをテストしていないが、私はそれを疑う。たとえそれがあっても、Gmailのバグであり、あなたはそれを修正することを期待する必要があるので、それに頼らないでください。 –

+0

これはどのようにルビーで行うことができますか? ActionMailer? Gmailでは – mirage

関連する問題