J'ai joué avec le module de messagerie en python mais je veux pouvoir savoir comment incorporer des images qui sont incluses dans le html.
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
devrait être remplacé par content-id
. Est-ce que quelqu'un sait comment faire ça?
Voici un exemple que j'ai trouvé.
Recette 473810: Envoyer un e-mail HTML avec image incorporée et texte brut alternatif :
Le HTML est la méthode de choix pour ceux qui souhaitent envoyer des e-mails avec du texte riche, une mise en page et des graphiques. Il est souvent souhaitable d'incorporer les graphiques dans le message afin que les destinataires puissent afficher le message directement, sans téléchargement supplémentaire.
Certains agents de messagerie ne prennent pas en charge HTML ou leurs utilisateurs préfèrent recevoir des messages en texte brut. Les expéditeurs de messages HTML doivent inclure un message en texte brut comme alternative pour ces utilisateurs.
Cette recette envoie un court message HTML avec une seule image intégrée et un autre message en texte brut.
# 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()
Pour Python versions 3.4 et supérieures.
La réponse acceptée est excellente, mais ne convient qu'aux anciennes versions Python (2.x et 3.3). Je pense qu'il a besoin d'une mise à jour.
Voici comment vous pouvez le faire dans les nouvelles versions Python versions (3.4 et supérieures):
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