, , ,

Python: avisar por correo si una carpeta lleva días sin recibir ficheros nuevos

·

Python: avisar por correo si una carpeta lleva días sin recibir ficheros nuevos

Esta semana necesitábamos vigilar una carpeta: en concreto, saber si pasaban «n» días sin que llegara ningún fichero nuevo. Por eso programé un script sencillo de Python que nos envía un correo cuando ocurre. Vamos al ejemplo.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import datetime
import glob
import os
import smtplib

now = datetime.datetime.now()  # Fecha y hora actuales

list_of_files = glob.glob('c:/tmp/*')  # * significa todos; para un formato concreto, p. ej. *.csv
latest_file = max(list_of_files, key=os.path.getctime)  # Último fichero creado en la carpeta

newestFileCreationDate = datetime.datetime.fromtimestamp(os.path.getctime(latest_file))  # Fecha de creación del último fichero

dif = now - newestFileCreationDate  # Tiempo entre ahora y la última creación

logFile = "c:/tmp2/log.log"  # Fichero de registro

def checkFolder(dif, now, logFile):
    if dif > datetime.timedelta(days=5):  # ¿Hace más de 5 días que no llega ningún fichero?

        HOST = "192.16.0.1"  # IP de vuestro servidor SMTP
        SUBJECT = "¡Alerta! Al menos 5 días sin ficheros nuevos en la carpeta xxxxxxx"
        TO = "vuestrocorreo@vuestrodominio.com"
        FROM = "noreply@vuestrodominio.com"
        text = "%s - El fichero más reciente de la carpeta tiene %s de antigüedad" % (now, dif)
        BODY = "\r\n".join((
            "From: %s" % FROM,
            "To: %s" % TO,
            "Subject: %s" % SUBJECT,
            "",
            text
        ))
        server = smtplib.SMTP(HOST)
        server.sendmail(FROM, [TO], BODY.encode("utf-8"))
        server.quit()

        with open(logFile, "a") as file:  # Abrimos el registro en modo añadir
            file.write("%s - [AVISO] El fichero más reciente de la carpeta tiene %s de antigüedad\n" % (now, dif))

    else:  # Han pasado menos de 5 días
        with open(logFile, "a") as file:
            file.write("%s - [OK] El fichero más reciente de la carpeta tiene %s de antigüedad\n" % (now, dif))

checkFolder(dif, now, logFile)  # Llamamos a la función con los 3 argumentos

Para ejecutarlo cada día, podéis programarlo con el Programador de tareas de Windows o con cron en Linux.

Nota: el script original era para Python 2. Esta versión está adaptada a Python 3.

Traducción hecha con ayuda de IA a partir del artículo original.