from config import DSN, MAILBOX from model import StatusMeldung from datetime import date, time from email.message import EmailMessage from sqlalchemy import create_engine from sqlalchemy.orm import Session from sqlalchemy.exc import IntegrityError from imap_tools import MailBox import json class MailImport: def open_mailbox(self) -> MailBox: return MailBox(MAILBOX["server"]).login( MAILBOX["user"], MAILBOX["password"], MAILBOX["folder"] ) def mail_import(self): with ( Session(create_engine(DSN)) as db_session, self.open_mailbox() as mb, ): messages = mb.fetch(mark_seen=True, limit=500) imported = [] for msg in messages: status = self.get_status_message(msg) if status is None: continue db_session.add(status) try: db_session.commit() except IntegrityError as e: db_session.rollback() print(e.args[0]) imported.append(msg.uid) # mb.delete(imported) def get_status_message(self, msg: EmailMessage) -> StatusMeldung: subject = msg.subject.split(";") if len(subject) < 5: print(msg.subject) return None attachments = dict([(att.filename, att.payload) for att in msg.attachments]) fehlerbericht_json = json.loads(attachments.get("fehlerbericht.json", "")) fehlerbericht_import = json.dumps(fehlerbericht_json) aufgabe = "" if len(subject) > 5: if subject[5][-4:] == ".bat": aufgabe = subject[5] elif ":" in subject[5]: aufgabe = "manuell" if ":" not in subject[1]: aufgabe = subject[1] subject[1] = "00:00" if aufgabe == "": files = [f["Name"] for f in fehlerbericht_json if ".bat" in f["Name"]] if len(files) > 0: aufgabe = files[0] return StatusMeldung( datum=date.fromisoformat(subject[3]), kunde=subject[0], aufgabe=aufgabe, start=time.fromisoformat(subject[1]), ende=time.fromisoformat(subject[2]), fehlerbericht_import=fehlerbericht_import, anzahl=int(subject[4]), ) def cleanup(self): pass if __name__ == "__main__": mi = MailImport() mi.mail_import() mi.cleanup()