# HtmlMail python class
# Compose HTML mails from URLs or local files with all images included
#
# Author: Catalin Constantin
import sys, os, urllib2, urlparse
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
from email.MIMEMultipart import MIMEMultipart
import email, re
class HtmlMail:
def __init__(self, location, encoding="iso-8859-1"):
self.location=location
if location.find("http://")==0:
self.is_http=True
else:
self.is_http=False
self.encoding=encoding
self.p1=re.compile("()", re.IGNORECASE|re.DOTALL)
self.p2=re.compile("(<.*?background=\")(.*?)(\".*?>)", re.IGNORECASE|re.DOTALL)
self.p3=re.compile("()", re.IGNORECASE|re.DOTALL)
self.img_c=0
def set_log(self,log):
self.log=log
def _handle_image(self, matchobj):
img=matchobj.group(2)
if not self.images.has_key(img):
self.img_c+=1
self.images[img]="dazoot-img%d" % self.img_c
return "%scid:%s%s" % (matchobj.group(1), self.images[img], matchobj.group(3))
def _parse_images(self):
self.images={}
self.content=self.p1.sub(self._handle_image, self.content)
self.content=self.p2.sub(self._handle_image, self.content)
self.content=self.p3.sub(self._handle_image, self.content)
return self.images
def _read_image(self, imglocation):
if self.is_http:
img_url=urlparse.urljoin(self.location, imglocation)
content=urllib2.urlopen(img_url).read()
return content
else:
return file(imglocation, "rb").read()
def get_msg(self):
if self.is_http:
content=urllib2.urlopen(self.location).read()
else:
content=file(self.location, "r").read()
self.content=content
msg=MIMEMultipart("related")
images=self._parse_images()
tmsg=MIMEText(self.content, "html", self.encoding)
msg.attach(tmsg)
for img in images.keys():
img_content=self._read_image(img)
img_msg=MIMEImage(img_content)
img_type, img_ext=img_msg["Content-Type"].split("/")
del img_msg["MIME-Version"]
del img_msg["Content-Type"]
del img_msg["Content-Transfer-Encoding"]
img_msg.add_header("Content-Type", "%s/%s; name=\"%s.%s\"" % (img_type, img_ext, images[img], img_ext))
img_msg.add_header("Content-Transfer-Encoding", "base64")
img_msg.add_header("Content-ID", "<%s>" % images[img])
img_msg.add_header("Content-Disposition", "inline; filename=\"%s.%s\"" % (images[img], img_ext))
msg.attach(img_msg)
return msg
if __name__=="__main__":
# test the class here
import smtplib
hm=HtmlMail("http://www.egirl.ro/newsletter/december2005_2/")
msg=hm.get_msg()
msg["Subject"]="Egirl Newsletter"
msg["From"]="Catalin Constantin "
msg["To"]="dazoot@gmail.com"
s=smtplib.SMTP("localhost")
s.sendmail("dazoot@gmail.com", msg["To"], msg.as_string())
s.quit()