from typing import Optional from sqlalchemy import Column, create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column from imap_tools import MailBox import re from dataclasses import dataclass import json @dataclass class StatusMail: datum: str kunde: str start: str ende: str aufgabe: str = "" betreff: str = "" fehlerbericht: object = None anzahl: int = 0 bearbeitet: int = 0 kommentar_id: int = 0 class Base(DeclarativeBase): pass class StatusMeldung(Base): __tablename__ = 'status_meldung' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(30)) fullname: Mapped[Optional[str]] id=Column(Integer, primary_key=True) title=Column('title', String(32)) in_stock=Column('in_stock', Boolean) quantity=Column('quantity', Integer) price=Column('price', Numeric) class MailImport: database = 'mysql+pymysql://gaps:Gcbs12ma@192.168.2.41/tasks' mailbox = ('imap.1und1.de', "status@global-cube.de", "(6QNLU=7m3R?f2?6]JO4WH(K") def __init__(self): self.engine = create_engine(self.database) def mail_import(self): with MailBox(self.mailbox[0]).login(self.mailbox[1], self.mailbox[2]) as mb: mb.folder.set("Test") messages = mb.fetch(mark_seen=True, limit=100, headers_only=False) for msg in messages: subject = msg.subject.split(";") if len(subject) < 5: print(msg.subject) continue status = StatusMail(datum=subject[3], kunde=subject[0], start=subject[1], ende=subject[2], anzahl=subject[4], betreff=msg.subject) if len(subject) > 5: if subject[5][-4:] == ".bat": status.aufgabe = subject[5] elif ":" in subject[5]: status.aufgabe = "manuell" attachments = dict([(att.filename, att.payload) for att in msg.attachments]) status.fehlerbericht = json.dumps(json.loads(attachments.get("fehlerbericht.json", "")), indent=2) self.insert_status_raw(status) def insert_status_raw(self, content: StatusMail): with self.engine.connect() as con: query = f"INSERT INTO ping (kunde, pingtime, uptime) VALUES ('{kunde}', '{int(current_date)}', '{uptime}')" con.execute(query) def cleanup(self): pass if __name__ == '__main__': mi = MailImport() mi.mail_import() mi.cleanup()