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

Revisão 3e 2005-06-22 19:22:06

Excluir mensagem

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 __server = '127.0.0.1'  # alterar aqui com nome ou endereço servidor smtp
  32 
  33 
  34 # Atualmente  nao esta havendo autenticacao, preencha se necessario
  35 __login = ""
  36 __passwd = ""
  37 
  38 
  39 def attachText(_writer, _text,_mime):
  40     part = _writer.nextpart()
  41     body = part.startbody(_mime)
  42     body.write(_text)
  43 
  44 
  45 
  46 def attachPlainFile(_writer, _file, _mimeType=None, _name="unknown"):
  47     part = _writer.nextpart()
  48     part.addheader('Content-Transfer-Encoding','base64')
  49     body = part.startbody("%s; name=%s"%(_mimeType,_name))
  50     base64.encode(StringIO(_file),body)
  51 
  52     
  53 
  54 def attachCryptFile(_writer, _file,_mimeType=None,_name="unknown"):
  55     part = _writer.nextpart()
  56     part.addheader('Content-Transfer-Encoding', 'base64')
  57     body = part.startbody('%s; name=%s'%(_mimeType,_name))
  58     obj = DES.new(" secret ",DES.MODE_ECB)
  59     pad = 8-(len(_file)%8)
  60     _file = _file+pad*" "
  61     crypt = obj.encrypt(_file)
  62     base64.encode(StringIO(crypt),body)
  63 
  64     
  65 
  66 
  67 
  68 def sendmail(_subject,_from,_to,_cc=None,_attachments=None):
  69     try:
  70         message = StringIO()
  71         writer = MimeWriter.MimeWriter(message)
  72         writer.addheader('MIME-Version', '1.0')
  73         writer.addheader('Subject', _subject)
  74         writer.addheader('To',_to)
  75 
  76         if _cc:
  77             writer.addheader('Cc',_cc)
  78 
  79         writer.startmultipartbody('mixed')
  80 
  81         
  82 
  83         # process attachments
  84         if _attachments:
  85             for _mode,_file,_mime,_name in _attachments:
  86                 if _mode=="text":
  87                     attachText(writer,_file.read(),_mime)
  88                 elif _mode=="attach":
  89                     attachPlainFile(writer,_file.read(),_mime,_name)
  90                 elif _mode=="crypt":
  91                     attachCryptFile(writer,_file.read(),_mime,_name)    
  92                 else:
  93                     raise Exception("Invalid Mode specified")
  94 
  95         # finish off
  96         writer.lastpart()
  97 
  98         # send the mail
  99         smtp = smtplib.SMTP(__server)
 100 
 101         # Uncomment the line below if you need authentication
 102 
 103         if __login:
 104             smtp.login(__login,__passwd)
 105 
 106 
 107         smtp.sendmail(_from,_to, message.getvalue())
 108         #print message.read()
 109 
 110         smtp.quit()
 111         syslog(LOG_INFO,"Email Ok")
 112 
 113     except:
 114         syslog(LOG_INFO,str(format_exception(sys.exc_info()[0],sys.exc_info()[1],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) e
  13     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,'text/plain',None),
  34                                      ('attach',data2,'EncryptedContent.ENCRYPTED',filename)))
  35        
  36 if __name__=="__main__":
  37     main()

Volta para CookBook.


RodrigoSenra