!! ultima actualización !!

22/02/2011

viernes 17 de diciembre de 2010

Python script: como enviar email con archivo de texto adjunto

Esta semana he creado un script en Python para:

  1. Leer contenido de carpeta (path) en busca de un patrón de nombre de fichero.
  2. Enviar por email los ficheros con el mismo patrón.
  3. Eliminar los ficheros enviados.

Para cumplir este objetivo he creado el programa en el fichero send-attachment.py y las variables de configuración en conf.py. Con cambiar los valores en conf.py podemos enviar el fichero que contenga el patrón (pattern) deseado a las direcciones de email (to_addr) que necesitemos. En caso de no encontrar ningún fichero con el patrón introducido, el programa envía un email a la dirección (alert) indicada para alertar del problema.
El envío de email se hace a través de una cuenta autenticada (from_addr) en el mismo servidor SMTP (email_server). Es por esto que recomiendo ejecutar el script con el fichero de configuración seguro, con permisos de lectura SOLO para el usuario que lo ejecuta: chmod 600 conf.py.
A continuación los ficheros comentados.

  • send-attachment.py

#!/usr/bin/python
# librerias
import smtplib
import mimetypes
import os
import datetime
import email
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import encoders
# configuracion personal
import conf
counter = 0


# programa principal
for dirname, dirnames, filenames in os.walk(conf.path):
for filename0 in filenames:
if conf.pattern in filename0:
counter = 1


# cabezera del email
m = MIMEMultipart()
m["To"] = conf.to_addr
m["From"] = conf.from_addr
m["Subject"] = conf.subject_header


date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" )
body = '''This is the email body.
Sent on %s.''' % (date)
m.attach(MIMEText(body))


# adjuntamos fichero de texto
fp = open(conf.path filename0, 'rb')
msg = MIMEBase('multipart', 'encrypted')
msg.set_payload(fp.read())
fp.close()


encoders.encode_base64(msg)
msg.add_header('Content-Disposition', 'attachment', filename=filename0)
m.attach(msg)


# envio del email
s = smtplib.SMTP()
s.set_debuglevel(conf.debuglevel)
s.connect(conf.email_server, conf.email_port)
s.login(conf.from_addr, conf.passwd)
s.sendmail(conf.from_addr, conf.to_addr, m.as_string())
s.quit()
# eliminamos el fichero enviado
os.remove(conf.path filename0)


# better something than nothing
if counter == 0:
m = MIMEMultipart()
m["To"] = conf.alert
m["From"] = conf.from_addr
m["Subject"] = conf.subject_alert


date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" )
body = '''Error sending email attachment.
Sent on %s.''' % (date)
m.attach(MIMEText(body))
# sending email
s = smtplib.SMTP()
s.set_debuglevel(conf.debuglevel)
s.connect(conf.email_server, conf.email_port)
s.login(conf.from_addr, conf.passwd)
s.sendmail(conf.from_addr,conf.alert, m.as_string())
s.quit()


  • conf.py

debuglevel = 0 # 1 FOR TESTING PURPOSES ONLY!!!


pattern = '.txt' # formato del nombre de fichero a enviar
path = '/path/where/files/to/send/' # carpeta donde esta el fichero a enviar


from_addr = "from@XXX.XX" # direccion email origen
passwd = "XXXXXXXX" # contraseña del email origen
email_server = "XXX.XXX.XXX.XXX" # IP o dominio del servidor SMTP
email_port = XX # puerto del servidor STMP


to_addr = "to@XXX.XX" # direccion email destino
subject_header = 'enviado' # asunto del email




alert = "to_alert@XXX.XX" # direccion email destino para la alerta
subject_alert = 'alerta' # asunto del email alerta

Saludos!