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

Revisão 2e 2005-06-22 17:41:52

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

#  ___ GPr Sistemas ____________________________________
#
#  Modulo: gpmail.py
#  Data de Criação:     2003-02-26
#  Data de Atualização: 2003-12-05
#
#  Desenvolvedores: João Chaves/Rod Senra
#  Interpretador:   Python 2.3.2  ou superior

import sys
import smtplib
import MimeWriter
import mimetypes
import base64
import StringIO
import getopt
import os.path
import sys
import urllib2
from StringIO import StringIO
from Crypto.Cipher import DES   # Opcional
from syslog import *
from traceback import format_exception


__version__ = '0.4'


# Configurações

__server = '127.0.0.1'  # alterar aqui com nome ou endereço servidor smtp


# Atualmente  nao esta havendo autenticacao, preencha se necessario
__login = ""
__passwd = ""


def attachText(_writer, _text,_mime):
    part = _writer.nextpart()
    body = part.startbody(_mime)
    body.write(_text)



def attachPlainFile(_writer, _file, _mimeType=None, _name="unknown"):
    part = _writer.nextpart()
    part.addheader('Content-Transfer-Encoding','base64')
    body = part.startbody("%s; name=%s"%(_mimeType,_name))
    base64.encode(StringIO(_file),body)

    

def attachCryptFile(_writer, _file,_mimeType=None,_name="unknown"):
    part = _writer.nextpart()
    part.addheader('Content-Transfer-Encoding', 'base64')
    body = part.startbody('%s; name=%s'%(_mimeType,_name))
    obj = DES.new(" secret ",DES.MODE_ECB)
    pad = 8-(len(_file)%8)
    _file = _file+pad*" "
    crypt = obj.encrypt(_file)
    base64.encode(StringIO(crypt),body)

    



def sendmail(_subject,_from,_to,_cc=None,_attachments=None):
    try:
        message = StringIO()
        writer = MimeWriter.MimeWriter(message)
        writer.addheader('MIME-Version', '1.0')
        writer.addheader('Subject', _subject)
        writer.addheader('To',_to)

        if _cc:
            writer.addheader('Cc',_cc)

        writer.startmultipartbody('mixed')

        

        # process attachments
        if _attachments:
            for _mode,_file,_mime,_name in _attachments:
                if _mode=="text":
                    attachText(writer,_file.read(),_mime)
                elif _mode=="attach":
                    attachPlainFile(writer,_file.read(),_mime,_name)
                elif _mode=="crypt":
                    attachCryptFile(writer,_file.read(),_mime,_name)    
                else:
                    raise Exception("Invalid Mode specified")

        # finish off
        writer.lastpart()

        # send the mail
        smtp = smtplib.SMTP(__server)

        # Uncomment the line below if you need authentication

        if __login:
            smtp.login(__login,__passwd)


        smtp.sendmail(_from,_to, message.getvalue())
        #print message.read()

        smtp.quit()
        syslog(LOG_INFO,"Email Ok")

    except:
        syslog(LOG_INFO,str(format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])))

Exemplo de uso

def main():
    # Alterar estes valores antes de instalar na Wagonlit!!!
    to = "deFulano@dominio.com.br"
    orig = "paraBeltrano@outroDominio.com.br"
    subject = "Teste de e-mail"
    filename = "f0001.ped"

    body = """
    Segue em anexo o arquivo %s com um pedido 
    criptografado. Por obséquio, salve o arquivo no diretório
    c:\gpr\pedidos (ou no diretório onde foi instalado o
    aplicativo de visualização distribuído pela GPr Sistemas) e
    dispare pedidos.py para visualizar seu conteúdo.

    Atenciosamente,
    GPr Sistemas Ltda
    """%(filename)

    attach = """
    Name:               Fulano de tal
    Endereço:           Rua da Amargura 1313
    Cartão de Crédito:  1243543412356

    etc etc etc
    """

    data1 = StringIO(body)
    data2 = StringIO(attach)

    sendmail(_subject = subject,
                     _from = orig,
                     _to = to,
                     _attachments = (('text',data1,'text/plain',None),
                                     ('attach',data2,'EncryptedContent.ENCRYPTED',filename)))
       
if __name__=="__main__":
    main()

Volta para CookBook.


RodrigoSenra