Sending Multipart html emails which contain embedded images
Question: I've been playing around with the email module in python but I want to be able
to know how to embed images which are included in the html.

So for example if the body is something like

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

I would like to embed _image.png_ into the email, and the `src` attribute
should be replaced with `content-id`. Does anybody know how to do this?


Answer: Here is an example I found.

> [**Recipe 473810: Send an HTML email with embedded image and plain text
> alternate**](http://code.activestate.com/recipes/473810/):
>
> HTML is the method of choice for those wishing to send emails with rich
> text, layout and graphics. Often it is desirable to embed the graphics
> within the message so recipients can display the message directly, without
> further downloads.
>
> Some mail agents don't support HTML or their users prefer to receive plain
> text messages. Senders of HTML messages should include a plain text message
> as an alternate for these users.
>
> This recipe sends a short HTML message with a single embedded image and an
> alternate plain text message.
    
    
    # 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 = 'from@example.com'
    strTo = 'to@example.com'
    
    # 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()
    

