#!/usr/bin/env python #-*- coding: iso8859-15 -*- ########################################################## # EMAIL v0.1 # ########################################################## # Autor: Juan Miguel Taboada Godoy # # Fecha: Szczecin, 21 de diciembre de 2005 # # Descripción: Envío de emails con adjuntos # # Versión: 2005122100 # # # # Codigo fuente bajo licencia GNU/GPL # # Centrologic (Computational Logistic Center) # # http://www.centrologic.com - info@centrologic.com # ########################################################## ## \internal ## \defgroup EMAIL EMAIL: Libreria para el envio de emails con ficheros adjuntos ## \version 16/11/2006 1535 Szczecin # Librerías que voy a necesitar {{{1 import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase #from email.MIMEImage import MIMEImage from email.MIMEText import MIMEText from email.Utils import COMMASPACE, formatdate from email import Encoders import os # }}}1 # Cabecera de la función {{{1 ## \ingroup EMAIL ## \internal ## Envia un email\n # ## Ejemplos de uso \n ## - Modo de uso 1: \n ## # Genero los datos para enviar el email (CON ARCHIVOS) \n ## ede="info\@centrologic.com" \n ## epara="juanjo\@centrologic.com" \n ## easunto="Hola caracola" \n ## etexto="Esto es una prueba con Hola Caracola" \n ## ehost="195.235.30.34" \n ## earchivos=["/home/br0th3r/fichero1.pdf","/home/br0th3r/fichero2.pdf"] \n ## # Mando el email \n ## sendMessage(de=ede,para=epara,asunto=easunto,texto=etexto,host=ehost,archivos=earchivos) \n ## ## - Modo de uso 2: \n ## # Genero los datos para enviar el email (SIN ARCHIVOS) \n ## ede="info\@centrologic.com" \n ## epara="juanjo\@centrologic.com" \n ## easunto="Hola caracola" \n ## etexto="Esto es una prueba con Hola Caracola" \n ## ehost="195.235.30.34" \n ## # Mando el email \n ## sendMessage(de=ede,para=epara,asunto=easunto,texto=etexto,host=ehost) ## \param [in] de Remitente ## \param [in] para Destinatario (es una lista Python) ## \param [in] cc Enviar copias (es una lista Python) ## \param [in] asunto Asunto del email ## \param [in] texto Cuerpo y texto del email ## \param [in] archivos Lista de archivos a adjuntar (es una lista Python) ## \param [in] host IP del servidor (de no indicar ninguno se usa el servidor local de correo) ## \param [in] port Puerto del servidor (de no indicar ninguno se usa el puerto 25) ## \param [in] charsettexto Charset a usar (de no indicar ninguno se usa "iso-8859-1") ## \param [in] loginUserName Nombre del usuario para el acceso SMTP (de no indicar ninguon se usa "") ## \param [in] loginPassword Clvae del usuario para el acceso SMTP (de no indicar ninguno se usa "") ## \return Devuelve el email formateado si no se indica el host de destino, o bien devuelve el resultado del envio del email ## \exception socket.error \n ## IP invalida: Tipo 0.0.0.0: [socket.error,(22,'Invalid argument')] -> Invalida \n ## IP invalida: Tipo 1.2.3.4: [socket.error,(110,'Connection timeout')] -> No responde \n ## Puerto invalido: [socket.error,(110,'Connection timeout')] ## \exception smtplib.SMTPAuthenticationError \n ## User invalido: [smtplib.SMTPAuthenticationError:(535, 'Authentication failed.')] ## Pass invalida: [smtplib.SMTPAuthenticationError:(535, 'Authentication failed.')] ## \exception smtplib.SMTPSenderRefused \n ## Origen invalido: [smtplib.SMTPSenderRefused: (517, 'Syntax error.', '"Grafista "')] ## \exception smtplib.SMTPRecipientsRefused \n ## Destino invalido: [smtplib.SMTPRecipientsRefused: {'Juanjo ': (513, 'Syntax error.')}] ## \exception TypeError \n ## Error en el MIME: [TypeError,"Could not guess image MIME subtype"] def sendEmail(de, para=[], cc=[], asunto='Asunto',texto='Cuerpo.', archivos=[], host='', port='25', charsettexto='iso-8859-1', loginUserName='', loginPassword=''): # }}}1 # Declaración del MIME y adjunto el cuerpo del mensaje {{{1 if archivos: # MIMEMultipart msg = MIMEMultipart() # Añado el cuerpo del mensaje msg.attach(MIMEText(texto)) else: # MIMEText (con cuerpo del mensaje) msg = MIMEText(texto, _charset=charsettexto) # }}}1 # Cargo las cabeceras {{{1 # From {{{2 msg['From']=de # }}}2 # To {{{2 if isinstance(para,(str,unicode)): para=[para] msg['To']=COMMASPACE.join(para) # }}}2 # CC {{{2 if cc: if isinstance(cc,(str,unicode)): cc=[cc] msg['Cc']=COMMASPACE.join(cc) para.extend(cc) # }}}2 # Fecha {{{2 msg['Date']=formatdate(localtime=True) # }}}2 # Asunto {{{2 msg['Subject']=asunto # }}}2 # }}}1 # Para cada archivo a adjuntar lo cargo en el email {{{1 for archivo in archivos: # Comprueba si es una tupla (y extrae los datos) {{{2 if (type(archivo)==type((1,2))): # Tipo del fichero mimetype=archivo[1] # Nombre del fichero archivo=archivo[0] else: mimetype="" # }}}2 # MIMETypes conocidos {{{2 if (mimetype=="png"): # PNG file (maintype,subtype)=('image',"png"); elif (mimetype=="jpg"): # JPG file (maintype,subtype)=('image',"jpg"); elif (mimetype=="pdf"): # PDF file (maintype,subtype)=('application',"pdf"); else: # Other type (maintype,subtype)=('application',"octect-stream"); # }}}2 # Indico el MIMETYPE será octect-stream para usar con Base64 part=MIMEBase(maintype,subtype) #part=MIMEImage(open(archivo,"rb").read()) # Cargo el fichero part.set_payload(open(archivo,"rb").read()) # Codifico a Base64 el fichero Encoders.encode_base64(part) # Incluyo la cabecera de fichero adjunto part.add_header('Content-Disposition','attachment; filename="%s"' % os.path.basename(archivo)) # Cargo el adjunto en el mensaje msg.attach(part) # }}}1 # Si no se ha definido un host devuelvo el email tal cual {{{1 if not host: # Devuelvo el email creado y termino resultado=msg.as_string(0) # }}}1 # Si se ha definido un host envío el email al SMTP {{{1 else: # Indico el Servidor SMTP indicado smtp=smtplib.SMTP(host,port) # Si se dio un usuario y clave if loginUserName and loginPassword: # Cargo los datos de login smtp.login(loginUserName,loginPassword) # Envío el email resultado=smtp.sendmail(de,para, msg.as_string()) # Desconecto del servidor SMTP smtp.close() # }}}1 # Devuelvo el resultado del envío {{{1 return resultado # }}}1