Esta semana he creado un script en Python para:

  1. Leer el contenido de una carpeta (path) en busca de un patrón de nombre de fichero.
  2. Enviar por email los ficheros que coincidan con el 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 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!