import asyncio import logging from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.interval import IntervalTrigger from app.mail_processor import process_mailbox from app.smb_processor import process_smb_share logger = logging.getLogger(__name__) JOB_ID = "mail_processor" scheduler = AsyncIOScheduler() _is_processing = False async def _run_processor(): global _is_processing if _is_processing: logger.info("Verarbeitung läuft bereits, überspringe diesen Durchlauf") return _is_processing = True try: logger.info("Starte automatische Email-Verarbeitung...") result = await process_mailbox() logger.info(f"Email-Verarbeitung abgeschlossen: {result}") logger.info("Starte automatische SMB-Verarbeitung...") smb_result = await process_smb_share() logger.info(f"SMB-Verarbeitung abgeschlossen: {smb_result}") except Exception as e: logger.error(f"Fehler bei automatischer Verarbeitung: {e}") finally: _is_processing = False def start_scheduler(): if not scheduler.running: scheduler.start() logger.info("Scheduler gestartet") def configure_job(interval_minutes: int, enabled: bool): existing = scheduler.get_job(JOB_ID) if existing: scheduler.remove_job(JOB_ID) if enabled and interval_minutes > 0: scheduler.add_job( _run_processor, trigger=IntervalTrigger(minutes=interval_minutes), id=JOB_ID, name="Email-Verarbeitung", replace_existing=True, ) logger.info(f"Scheduler konfiguriert: alle {interval_minutes} Minuten") else: logger.info("Scheduler deaktiviert") def get_scheduler_status() -> dict: job = scheduler.get_job(JOB_ID) if job and job.next_run_time: return { "enabled": True, "next_run": job.next_run_time.strftime("%d.%m.%Y %H:%M:%S"), "is_processing": _is_processing, } return { "enabled": False, "next_run": None, "is_processing": _is_processing, }