2012-04-11 2 views
7

J'essaye de créer un email dans Django avec des images en ligne.Afficher des images en ligne sur 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() 

Et dans le modèle, je référence comme ceci:

<img src="cid:image1" /> 

Cela fonctionne très bien dans les navigateurs web, les perspectives, thunderbird ... tous, sauf pour le client de messagerie Apple sur Mac OS X, iPad et iPhone Les images sont affichées deux fois. Ils sont placés en ligne correctement, mais ils sont également attachés au bas de l'email. Ma question est, comment puis-je me débarrasser des images en bas? ou devrais-je aborder les images dans les emails différemment.

Références:
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

ReTAG votre question à une étiquette plus spécifique comme « email » ou « email de pomme » pour trouver des gens plus intéressés à oublier et demander « created par courrier électronique Django » pour l'instant. – hynekcer

+0

merci pour le conseil – SunnySydeUp

+0

Joindre des images (pour autant que je sache) est une tentative de les afficher par défaut - c'est-à-dire sans avoir à activer "Afficher toutes les images de [email protected]" donc l'alternative est d'utiliser URL vers une image hébergée sur votre serveur. L'image apparaîtra seulement une fois, mais elle pourrait nécessiter une action de l'utilisateur. –

Répondre

10

différents clients de messagerie choisissent de rendre multipart/mixed messages de différentes manières.

La plupart des clients choisissent de rendre chaque partie (dans un message «multipart») en ligne - dans l'ordre dans lequel ils ont été ajoutés à l'e-mail. Cependant, si une image est référencée dans une partie text/html, la plupart des clients n'affichent plus cette image plus tard sur dans le cadre du processus "inlining all parts".

Apple Mail sur Mac OS X et iOS sont différents, dans la mesure où ils seront affichage chaque partie dans un message multipart/mixed dans l'ordre dans lequel ils ont été inclus, indépendamment de toute référence interne entre HTML et images. Cela entraîne l'affichage de vos images une fois dans votre code HTML et à la fin du message où elles ont été automatiquement mises en ligne.

La solution consiste à regrouper vos ressources HTML et image en une seule pièce related. i.e. .:

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

Est-ce que cela montre l'email dans Gmail sans appuyer sur "Afficher les images ..."? – nelsonvarela

+0

@iAmTheOneAndOnly Je ne l'ai pas testé, mais j'en doute. Même si c'est le cas, c'est un bogue dans Gmail et vous devriez vous attendre à ce qu'ils le résolvent, alors ne vous y fiez pas. –

+0

une idée de comment cela peut-il être fait avec ruby? ActionMailer? – mirage

Questions connexes