mail_import.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from typing import Optional
  2. from sqlalchemy import Column, create_engine, String
  3. from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
  4. from imap_tools import MailBox
  5. import re
  6. from dataclasses import dataclass
  7. import json
  8. @dataclass
  9. class StatusMail:
  10. datum: str
  11. kunde: str
  12. start: str
  13. ende: str
  14. aufgabe: str = ""
  15. betreff: str = ""
  16. fehlerbericht: object = None
  17. anzahl: int = 0
  18. bearbeitet: int = 0
  19. kommentar_id: int = 0
  20. class Base(DeclarativeBase):
  21. pass
  22. class StatusMeldung(Base):
  23. __tablename__ = 'status_meldung'
  24. id: Mapped[int] = mapped_column(primary_key=True)
  25. name: Mapped[str] = mapped_column(String(30))
  26. fullname: Mapped[Optional[str]]
  27. id=Column(Integer, primary_key=True)
  28. title=Column('title', String(32))
  29. in_stock=Column('in_stock', Boolean)
  30. quantity=Column('quantity', Integer)
  31. price=Column('price', Numeric)
  32. class MailImport:
  33. database = 'mysql+pymysql://gaps:Gcbs12ma@192.168.2.41/tasks'
  34. mailbox = ('imap.1und1.de', "status@global-cube.de", "(6QNLU=7m3R?f2?6]JO4WH(K")
  35. def __init__(self):
  36. self.engine = create_engine(self.database)
  37. def mail_import(self):
  38. with MailBox(self.mailbox[0]).login(self.mailbox[1], self.mailbox[2]) as mb:
  39. mb.folder.set("Test")
  40. messages = mb.fetch(mark_seen=True, limit=100, headers_only=False)
  41. for msg in messages:
  42. subject = msg.subject.split(";")
  43. if len(subject) < 5:
  44. print(msg.subject)
  45. continue
  46. status = StatusMail(datum=subject[3], kunde=subject[0], start=subject[1], ende=subject[2], anzahl=subject[4], betreff=msg.subject)
  47. if len(subject) > 5:
  48. if subject[5][-4:] == ".bat":
  49. status.aufgabe = subject[5]
  50. elif ":" in subject[5]:
  51. status.aufgabe = "manuell"
  52. attachments = dict([(att.filename, att.payload) for att in msg.attachments])
  53. status.fehlerbericht = json.dumps(json.loads(attachments.get("fehlerbericht.json", "")), indent=2)
  54. self.insert_status_raw(status)
  55. def insert_status_raw(self, content: StatusMail):
  56. with self.engine.connect() as con:
  57. query = f"INSERT INTO ping (kunde, pingtime, uptime) VALUES ('{kunde}', '{int(current_date)}', '{uptime}')"
  58. con.execute(query)
  59. def cleanup(self):
  60. pass
  61. if __name__ == '__main__':
  62. mi = MailImport()
  63. mi.mail_import()
  64. mi.cleanup()