"""Common utilies to format / semd emails.:organization: Logilab:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""__docformat__="restructuredtext en"fromemail.MIMEMultipartimportMIMEMultipartfromemail.MIMETextimportMIMETextfromemail.MIMEImageimportMIMEImagefromemail.HeaderimportHeaderdefheader(ustring):returnHeader(ustring.encode('UTF-8'),'UTF-8')defaddrheader(uaddr,uname=None):# even if an email address should be ascii, encode it using utf8 since# application tests may generate non ascii email addressaddr=uaddr.encode('UTF-8')ifuname:return'%s <%s>'%(header(uname).encode(),addr)returnaddrdefformat_mail(uinfo,to_addrs,content,subject="",cc_addrs=(),msgid=None,references=(),config=None):"""Sends an Email to 'e_addr' with content 'content', and subject 'subject' to_addrs and cc_addrs are expected to be a list of email address without name """asserttype(content)isunicode,repr(content)msg=MIMEText(content.encode('UTF-8'),'plain','UTF-8')# safety: keep only the first newlinesubject=subject.splitlines()[0]msg['Subject']=header(subject)ifuinfo.get('email'):email=uinfo['email']elifconfigandconfig['sender-addr']:email=unicode(config['sender-addr'])else:email=u''ifuinfo.get('name'):name=uinfo['name']elifconfigandconfig['sender-addr']:name=unicode(config['sender-name'])else:name=u''msg['From']=addrheader(email,name)ifconfigandconfig['sender-addr']andconfig['sender-addr']!=email:appaddr=addrheader(config['sender-addr'],config['sender-name'])msg['Reply-to']='%s, %s'%(msg['From'],appaddr)elifemail:msg['Reply-to']=msg['From']ifconfigisnotNone:msg['X-CW']=config.appidunique_addrs=lambdaaddrs:sorted(set(addrforaddrinaddrsifaddrisnotNone))msg['To']=', '.join(addrheader(addr)foraddrinunique_addrs(to_addrs))ifcc_addrs:msg['Cc']=', '.join(addrheader(addr)foraddrinunique_addrs(cc_addrs))ifmsgid:msg['Message-id']=msgidifreferences:msg['References']=', '.join(references)returnmsgclassHtmlEmail(MIMEMultipart):def__init__(self,subject,textcontent,htmlcontent,sendermail=None,sendername=None,recipients=None,ccrecipients=None):MIMEMultipart.__init__(self,'related')self['Subject']=header(subject)self.preamble='This is a multi-part message in MIME format.'# Attach alternative text messagealternative=MIMEMultipart('alternative')self.attach(alternative)msgtext=MIMEText(textcontent.encode('UTF-8'),'plain','UTF-8')alternative.attach(msgtext)# Attach html messagemsghtml=MIMEText(htmlcontent.encode('UTF-8'),'html','UTF-8')alternative.attach(msghtml)ifsendermailorsendername:self['From']=addrheader(sendermail,sendername)ifrecipients:self['To']=', '.join(addrheader(addr)foraddrinrecipientsifaddrisnotNone)ifccrecipients:self['Cc']=', '.join(addrheader(addr)foraddrinccrecipientsifaddrisnotNone)defattach_image(self,data,htmlId):image=MIMEImage(data)image.add_header('Content-ID','<%s>'%htmlId)self.attach(image)