=Enviando emails em Html e anexos=
Embora não seja uma boa prática, visto que pode impedir ou dificultar algumas pessoas de lerem o seu email, às vezes é necessário enviar emails em html a partir de um programa python. A função com um exemplo de uso está abaixo, bem como um exemplo de template html referenciando as imagens corretamente.
1 # -*- coding: utf-8 -*-
2
3 def mail(serverURL=None, sender='', to='', subject='', text='', attachments = [], html_template = None):
4
5 import smtplib, MimeWriter, base64, cStringIO, mimetools
6
7 #
8 # buffer da mensagem
9 #
10 message = cStringIO.StringIO()
11
12 txtin = cStringIO.StringIO(text)
13
14 if html_template:
15 htmlin = cStringIO.StringIO(open(html_template).read() % text)
16
17 writer = MimeWriter.MimeWriter(message)
18 writer.addheader('Subject', subject)
19 writer.addheader('MIME-Version', '1.0')
20
21 writer.startmultipartbody("alternative")
22 writer.flushheaders()
23
24 #
25 # parte de texto plano
26 #
27 subpart = writer.nextpart()
28 subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
29 pout = subpart.startbody("text/plain", [("charset", 'utf-8')])
30 mimetools.encode(txtin, pout, 'quoted-printable')
31 txtin.close()
32
33 #
34 # parte do html
35 #
36 subpart = writer.nextpart()
37 subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
38 pout = subpart.startbody("text/html", [("charset", 'utf-8')])
39 mimetools.encode(htmlin, pout, 'quoted-printable')
40 htmlin.close()
41
42 #
43 # adiciona os anexos
44 #
45 for attachment in attachments:
46 part = writer.nextpart()
47 part.addheader('Content-Transfer-Encoding', 'base64')
48 #necessário para referência em tags <img>
49 part.addheader('Content-Id', "<"+attachment['file']+">")
50 body = part.startbody('%s; name=%s' % (attachment['mime'], attachment['file']))
51 base64.encode(open(attachment['file'], 'rb'), body)
52
53 #
54 # finaliza a mensagem
55 #
56 writer.lastpart()
57
58 #
59 # envia o email
60 #
61 smtp = smtplib.SMTP(serverURL)
62 smtp.sendmail(sender, to, message.getvalue())
63 message.close()
64 smtp.quit()
65
66 if __name__ == "__main__":
67 anexos = []
68 anexos.append({'mime' : 'image/jpg', 'file' : 'cabecalho.jpg'})
69 anexos.append({'mime' : 'image/jpg', 'file' : 'rodape.jpg'})
70 template = 'template.htm'
71 mail('smtp.server.com.br','joao@server.com.br','maria@cliente.com.br','Solicitação de visita', str_mail, anexos, template)
Template Html:
<HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> <STYLE> body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; } </STYLE> </HEAD> <BODY> <img src="cid:cabecalho.jpg" width="743" height="132" align="texttop"> <br> <br> <br> <pre> %s </pre> <br> <br> <br> <div style="background: url(cid:rodape.jpg); height: 113px; width: 741px;"> Atenciosamente, <br> <b>João da Silva</b> <br> <i>Gerente </i> <br> </div> </BODY> </HTML>
Baseado no cookbook encontrado em http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/67083