Sending 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
#
writer.startmultipartbody("alternative")
writer.flushheaders()
#
# 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’)
txtin.close()
#
# 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’)
htmlin.close()
#
# Now that we’re done, close our writer and
# return the message body
#
writer.lastpart()
msg = out.getvalue()
out.close()
print msg
return msg
if __name__ == ‘__main__’:
f = open(”somefile.html”, “r”)
html = f.read() % vals
f.close()
f = open(”somefile.txt”, ‘r’)
text = f.read() % vals
subject = “Some subject”
message = createhtmlmail(html, text, subject)
server = smtplib.SMTP(”localhost”)
server.sendmail(’some_address@somewhere.com’,'to_address@somewhere.com’, message)
server.quit()
If anyone knows the original source of this example, please tell me and I’ll give proper attributions.
I like the info and will be linking back to you from my site. Also great looking site I wish I had one like this.
I believe that example is from O\\\’Reilly\\\’s Python Cookbook…if I remember right.