Für Python-Versionen 3.4 und höher
Die akzeptierte Antwort ist ausgezeichnet, aber alt. Ich denke, es braucht ein Update.
Hier ist, wie Sie es in Versionen neuerer Pythons tun können (3.4 und höher):
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
Vielen Dank habe ich viel Lösung versucht, Dies ist das eine, die perfekt funktioniert! – wukong
@Andrew Hare: Es gibt zwei mehrteilige Ansichten (die beiden msgText-Instanzen). Ich sehe den angegebenen Inhaltstyp nicht. Wie würde das empfangende System wissen, welches für das Html zu machen ist? –
Ich habe msgText.replace_header ('Content-Type', 'text/html') für die zweite msgText-Instanz hinzugefügt. –