1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- 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()
|