Sending HTML Email From Python

(Due to changes in the Python standard library, I’ve posted a new updated method to send HTML email from Python.)

I forget where exactly I found this, but the other day I needed a quick Python method to send an HTML email — in my case, it was in response to a Web CGI request, but this example below is usable anywhere. The bits that need to be changed for different situations should be evident (‘somefile.txt’ for example). You will also need to point the smtplib to an actual mail server if you don’t run one on the local machine.

def createhtmlmail (html, text, subject):
    """Create a mime-message that will render HTML in popular
       MUAs, text in better ones"""
    import MimeWriter
    import mimetools
    import cStringIO

    out = cStringIO.StringIO() # output buffer for our message
    htmlin = cStringIO.StringIO(html)
    txtin = cStringIO.StringIO(text)

    writer = MimeWriter.MimeWriter(out)
    # set up some basic headers... we put subject here
    # because smtplib.sendmail expects it to be in the
    # message body
    writer.addheader("Subject", subject)
    writer.addheader("MIME-Version", "1.0")
    # start the multipart section of the message
    # multipart/alternative seems to work better
    # on some MUAs than multipart/mixed
    # the plain text section
    subpart = writer.nextpart()
    subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
    pout = subpart.startbody("text/plain", [("charset", 'us-ascii')])
    mimetools.encode(txtin, pout, 'quoted-printable')
    # start the html subpart of the message
    subpart = writer.nextpart()
    subpart = writer.nextpart()
    subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
    # returns us a file-ish object we can write to
    pout = subpart.startbody("text/html", [("charset", 'us-ascii')])
    mimetools.encode(htmlin, pout, 'quoted-printable')
    # Now that we're done, close our writer and
    # return the message body
    msg = out.getvalue()
    print msg
    return msg

if __name__ == '__main__':
    f = open("somefile.html", "r")
    html = % vals
    f = open("somefile.txt", 'r')
    text = % vals
    subject = "Some subject"
    message = createhtmlmail(html, text, subject)
    server = smtplib.SMTP("localhost")
    server.sendmail('','', message)

After this page had been up for a while, someone pointed out that it looks like an ActiveState recipe, which it may very well be.





Leave a Reply

Your email address will not be published. Required fields are marked *