2009-05-28 9 views
43

Ich habe mit dem E-Mail-Modul in Python gespielt, aber ich möchte in der Lage sein zu wissen, wie Bilder eingebettet werden, die in den HTML enthalten sind.Senden von Multipart-HTML-E-Mails, die eingebettete Bilder enthalten

So zum Beispiel, wenn der Körper ist so etwas wie

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

Ich mag würde image.png in die E-Mail und das src Attribut sollte mit content-id einzubetten ersetzt werden. Weiß jemand, wie man das macht?

Antwort

102

Hier ist ein Beispiel, das ich gefunden habe.

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

HTML ist die Methode der Wahl für diejenigen, wollen E-Mails mit Rich-Text zu senden, Layout und Grafik. Oft ist es wünschenswert, die Grafiken in die Nachricht einzubetten, so dass Empfänger die Nachricht direkt anzeigen können, ohne weitere Downloads.

Einige Mail-Agents unterstützen kein HTML oder ihre Benutzer bevorzugen, einfache Textnachrichten zu empfangen. Absender von HTML-Nachrichten sollten einen einfachen Text Nachricht als eine Alternative für diese Benutzer enthalten.

Dieses Rezept sendet eine kurze HTML-Nachricht mit einem einzelnen eingebetteten Bild und eine alternative Klartextnachricht .

# 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

Vielen Dank habe ich viel Lösung versucht, Dies ist das eine, die perfekt funktioniert! – wukong

+0

@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? –

+0

Ich habe msgText.replace_header ('Content-Type', 'text/html') für die zweite msgText-Instanz hinzugefügt. –

1

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