associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

EnviarEmail

Receita: EnviarEmail

Esta receita ilustra como utilizar a biblioteca smtplib (padrão em distribuição Python) para enviar e-mails, com anexos opcionais.

Código

   1 #  ___ GPr Sistemas ____________________________________
   2 #
   3 #  Modulo: gpmail.py
   4 #  Data de Criação:     2003-02-26
   5 #  Data de Atualização: 2003-12-05
   6 #
   7 #  Desenvolvedores: João Chaves/Rod Senra
   8 #  Interpretador:   Python 2.3.2  ou superior
   9 
  10 import sys
  11 import smtplib
  12 import MimeWriter
  13 import mimetypes
  14 import base64
  15 import StringIO
  16 import getopt
  17 import os.path
  18 import sys
  19 import urllib2
  20 from StringIO import StringIO
  21 from Crypto.Cipher import DES   # Opcional
  22 from syslog import *
  23 from traceback import format_exception
  24 
  25 
  26 __version__ = '0.4'
  27 
  28 
  29 # Configurações
  30 
  31 # alterar aqui com nome ou endereço servidor smtp
  32 __server = '127.0.0.1'  
  33 
  34 # Atualmente  nao esta havendo autenticacao, preencha 
  35 # se necessario
  36 __login = ""
  37 __passwd = ""
  38 
  39 
  40 def attachText(_writer, _text,_mime):
  41     part = _writer.nextpart()
  42     body = part.startbody(_mime)
  43     body.write(_text)
  44 
  45 
  46 
  47 def attachPlainFile(_writer, _file, _mimeType=None,
  48                     _name="unknown"):
  49     part = _writer.nextpart()
  50     part.addheader('Content-Transfer-Encoding','base64')
  51     body = part.startbody("%s; name=%s"%(_mimeType,_name))
  52     base64.encode(StringIO(_file),body)
  53 
  54     
  55 
  56 def attachCryptFile(_writer, _file,_mimeType=None,
  57                     _name="unknown"):
  58     part = _writer.nextpart()
  59     part.addheader('Content-Transfer-Encoding', 'base64')
  60     body = part.startbody('%s; name=%s'%(_mimeType,_name))
  61     obj = DES.new(" secret ",DES.MODE_ECB)
  62     pad = 8-(len(_file)%8)
  63     _file = _file+pad*" "
  64     crypt = obj.encrypt(_file)
  65     base64.encode(StringIO(crypt),body)
  66 
  67     
  68 
  69 
  70 
  71 def sendmail(_subject,_from,_to,_cc=None,_attachments=None):
  72     try:
  73         message = StringIO()
  74         writer = MimeWriter.MimeWriter(message)
  75         writer.addheader('MIME-Version', '1.0')
  76         writer.addheader('Subject', _subject)
  77         writer.addheader('To',_to)
  78 
  79         if _cc:
  80             writer.addheader('Cc',_cc)
  81 
  82         writer.startmultipartbody('mixed')
  83 
  84         
  85 
  86         # process attachments
  87         if _attachments:
  88             for _mode,_file,_mime,_name in _attachments:
  89                 if _mode=="text":
  90                     attachText(writer,_file.read(),_mime)
  91                 elif _mode=="attach":
  92                     attachPlainFile(writer,_file.read(),
  93                                     _mime,_name)
  94                 elif _mode=="crypt":
  95                     attachCryptFile(writer,_file.read(),
  96                                     _mime,_name)        
  97                 else:
  98                     raise Exception("Invalid Mode specified")
  99 
 100         # finish off
 101         writer.lastpart()
 102 
 103         # send the mail
 104         smtp = smtplib.SMTP(__server)
 105 
 106         # Uncomment the line below if you need authentication
 107 
 108         if __login:
 109             smtp.login(__login,__passwd)
 110 
 111 
 112         smtp.sendmail(_from,_to, message.getvalue())
 113         #print message.read()
 114 
 115         smtp.quit()
 116         syslog(LOG_INFO,"Email Ok")
 117 
 118     except:
 119         syslog(LOG_INFO,
 120                str(format_exception(sys.exc_info()[0],
 121                                     sys.exc_info()[1],
 122                                     sys.exc_info()[2])))

Exemplo de uso

   1 def main():
   2     # Alterar estes valores antes de instalar na Wagonlit!!!
   3     to = "deFulano@dominio.com.br"
   4     orig = "paraBeltrano@outroDominio.com.br"
   5     subject = "Teste de e-mail"
   6     filename = "f0001.ped"
   7 
   8     body = """
   9     Segue em anexo o arquivo %s com um pedido 
  10     criptografado. Por obséquio, salve o arquivo no diretório
  11     c:\gpr\pedidos (ou no diretório onde foi instalado o
  12     aplicativo de visualização distribuído pela GPr Sistemas)
  13     e dispare pedidos.py para visualizar seu conteúdo.
  14 
  15     Atenciosamente,
  16     GPr Sistemas Ltda
  17     """%(filename)
  18 
  19     attach = """
  20     Name:               Fulano de tal
  21     Endereço:           Rua da Amargura 1313
  22     Cartão de Crédito:  1243543412356
  23 
  24     etc etc etc
  25     """
  26 
  27     data1 = StringIO(body)
  28     data2 = StringIO(attach)
  29 
  30     sendmail(_subject = subject,
  31                      _from = orig,
  32                      _to = to,
  33                      _attachments = (('text', data1,
  34                                       'text/plain', None),
  35                                      ('attach',data2,
  36                                       'EncryptedContent.\
  37 ENCRYPTED',
  38                                       filename)))
  39        
  40 if __name__=="__main__":
  41     main()

Volta para CookBook.


RodrigoSenra