2009-05-28 8 views
43

J'ai joué avec le module de courrier électronique en python, mais je veux être capable de savoir comment intégrer des images qui sont incluses dans le code HTML.Envoi de courriels html en plusieurs parties qui contiennent des images incorporées

Ainsi, par exemple si le corps est quelque chose comme

<img src="../path/image.png"></img> 

Je voudrais intégrer image.png dans l'e-mail, et l'attribut src doit être remplacé par content-id. Est-ce que quelqu'un sait comment faire cela?

Répondre

102

Voici un exemple que j'ai trouvé.

Recipe 473810: Send an HTML email with embedded image and plain text alternate:

HTML est la méthode de choix pour ceux qui souhaitent envoyer des e-mails avec un texte riche, mise en page et des graphiques. Souvent, il est souhaitable d'intégrer les graphiques dans le message afin que les destinataires peuvent afficher le message directement, sans plus téléchargements.

Certains agents de messagerie ne prennent pas en charge HTML ou leurs utilisateurs préfèrent recevoir des messages texte . Les expéditeurs de messages HTML doivent inclure un message en texte brut en tant qu'alternative pour ces utilisateurs .

Cette recette envoie un court message HTML avec une seule image intégrée et un message texte en clair .

# Send an HTML email with an embedded image and a plain text message for 
# email clients that don't want to display the HTML. 

from email.MIMEMultipart import MIMEMultipart 
from email.MIMEText import MIMEText 
from email.MIMEImage import MIMEImage 

# Define these once; use them twice! 
strFrom = '[email protected]' 
strTo = '[email protected]' 

# Create the root message and fill in the from, to, and subject headers 
msgRoot = MIMEMultipart('related') 
msgRoot['Subject'] = 'test message' 
msgRoot['From'] = strFrom 
msgRoot['To'] = strTo 
msgRoot.preamble = 'This is a multi-part message in MIME format.' 

# Encapsulate the plain and HTML versions of the message body in an 
# 'alternative' part, so message agents can decide which they want to display. 
msgAlternative = MIMEMultipart('alternative') 
msgRoot.attach(msgAlternative) 

msgText = MIMEText('This is the alternative plain text message.') 
msgAlternative.attach(msgText) 

# We reference the image in the IMG SRC attribute by the ID we give it below 
msgText = MIMEText('<b>Some <i>HTML</i> text</b> and an image.<br><img src="cid:image1"><br>Nifty!', 'html') 
msgAlternative.attach(msgText) 

# This example assumes the image is in the current directory 
fp = open('test.jpg', 'rb') 
msgImage = MIMEImage(fp.read()) 
fp.close() 

# Define the image's ID as referenced above 
msgImage.add_header('Content-ID', '<image1>') 
msgRoot.attach(msgImage) 

# Send the email (this example assumes SMTP authentication is required) 
import smtplib 
smtp = smtplib.SMTP() 
smtp.connect('smtp.example.com') 
smtp.login('exampleuser', 'examplepass') 
smtp.sendmail(strFrom, strTo, msgRoot.as_string()) 
smtp.quit() 
+0

Une grande merci, j'ai essayé beaucoup de solution, c'est celui qui fonctionne parfaitement! – wukong

+0

@Andrew Hare: Il existe deux vues multi-parties (les deux instances de msgText). Je ne vois pas le type de contenu spécifié pour chacun. Comment le système récepteur sait-il lequel rendre pour le Html? –

+0

J'ai ajouté msgText.replace_header ('Content-Type', 'text/html') pour la deuxième instance de msgText. –

1

Pour les versions Python 3.4 et au-dessus

La réponse acceptée est excellente, mais vieux. Je pense qu'il a besoin d'une mise à jour.

Voici comment vous pouvez le faire dans les nouvelles versions de Python (3.4 et plus):

from email.message import EmailMessage 
from email.utils import make_msgid 
import mimetypes 

msg = EmailMessage() 

# generic email headers 
msg['Subject'] = 'Hello there' 
msg['From'] = 'ABCD <[email protected]>' 
msg['To'] = 'PQRS <[email protected]>' 

# set the plain text body 
msg.set_content('This is a plain text body.') 

# now create a Content-ID for the image 
image_cid = make_msgid(domain='xyz.com') 
# if `domain` argument isn't provided, it will 
# use your computer's name 

# set an alternative html body 
msg.add_alternative("""\ 
<html> 
    <body> 
     <p>This is an HTML body.<br> 
      It also has an image. 
     </p> 
     <img src="cid:{image_cid}"> 
    </body> 
</html> 
""".format(image_cid=image_cid[1:-1]), subtype='html') 
# image_cid looks like <[email protected]> 
# to use it as the img src, we don't need `<` or `>` 
# so we use [1:-1] to strip them off 


# now open the image and attach it to the email 
with open('path/to/image.jpg', 'rb') as img: 

    # know the Content-Type of the image 
    maintype, subtype = mimetypes.guess_type(img.name)[0].split('/') 

    # attach it 
    msg.get_payload()[1].add_related(img.read(), 
             maintype=maintype, 
             subtype=subtype, 
             cid=image_cid) 


# the message is ready now 
# you can write it to a file 
# or send it using smtplib 
Questions connexes