Esta semana he creado un script en Python para:
- Leer el contenido de una carpeta (
path
) en busca de un patrón de nombre de fichero. - Enviar por email los ficheros que coincidan con el patrón.
- 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 solo 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 de alerta (alert
) indicada para notificar el problema.
El envío de email se realiza a través de una cuenta autenticada (from_addr
) en el mismo servidor SMTP (email_server
). Por esto, recomiendo ejecutar el script con el fichero de configuración de forma segura, con permisos de lectura solo para el usuario que lo ejecuta: chmod 600 conf.py
.
A continuación, los ficheros comentados.
send-attachment.py
Link to heading
#!/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
Link to heading
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" # contrasea del email origen
email_server = "XXX.XXX.XXX.XXX" # IP o dominio del servidor SMTP
email_port = 25 # 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!