mail_import.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from datetime import date, time
  2. from email.message import EmailMessage
  3. from sqlalchemy import Integer, create_engine, String, Date, Time
  4. from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
  5. from sqlalchemy.dialects.mysql.base import LONGTEXT
  6. from sqlalchemy.exc import IntegrityError
  7. from imap_tools import MailBox
  8. import json
  9. class Base(DeclarativeBase):
  10. pass
  11. class StatusMeldung(Base):
  12. __tablename__ = "status_meldung"
  13. datum: Mapped[date] = mapped_column(Date, primary_key=True)
  14. kunde: Mapped[str] = mapped_column(String(50), primary_key=True)
  15. aufgabe: Mapped[str] = mapped_column(String(30))
  16. start: Mapped[time] = mapped_column(Time, primary_key=True)
  17. ende: Mapped[time] = mapped_column(Time)
  18. fehlerbericht: Mapped[LONGTEXT] = mapped_column(LONGTEXT)
  19. anzahl: Mapped[int] = mapped_column(Integer, default=0)
  20. bearbeitet: Mapped[int] = mapped_column(Integer, default=0)
  21. kommentar_id: Mapped[int] = mapped_column(Integer, default=0)
  22. class MailImport:
  23. database = "mysql+pymysql://gaps:Gcbs12ma@192.168.2.41/tasks"
  24. mailbox = ("imap.1und1.de", "status@global-cube.de", "(6QNLU=7m3R?f2?6]JO4WH(K")
  25. def __init__(self):
  26. self.engine = create_engine(self.database)
  27. def open_mailbox(self) -> MailBox:
  28. return MailBox(self.mailbox[0]).login(self.mailbox[1], self.mailbox[2])
  29. def mail_import(self):
  30. with (
  31. Session(self.engine) as self.session,
  32. self.open_mailbox() as mb,
  33. ):
  34. mb.folder.set("Test")
  35. messages = mb.fetch(mark_seen=True, limit=100, headers_only=False)
  36. imported = []
  37. for msg in messages:
  38. status = self.get_status_message(msg)
  39. self.session.add(status)
  40. try:
  41. self.session.commit()
  42. imported.append(msg.uid)
  43. except IntegrityError as e:
  44. self.session.rollback()
  45. print(e.args[0])
  46. # mb.delete(imported)
  47. def get_status_message(self, msg: EmailMessage) -> StatusMeldung:
  48. subject = msg.subject.split(";")
  49. if len(subject) < 5:
  50. print(msg.subject)
  51. return None
  52. attachments = dict([(att.filename, att.payload) for att in msg.attachments])
  53. fehlerbericht_json = json.loads(attachments.get("fehlerbericht.json", ""))
  54. fehlerbericht = json.dumps(fehlerbericht_json, indent=2)
  55. aufgabe = ""
  56. if len(subject) > 5:
  57. if subject[5][-4:] == ".bat":
  58. aufgabe = subject[5]
  59. elif ":" in subject[5]:
  60. aufgabe = "manuell"
  61. if ":" not in subject[1]:
  62. aufgabe = subject[1]
  63. subject[1] = "00:00"
  64. if aufgabe == "":
  65. files = [f["Name"] for f in fehlerbericht_json if ".bat" in f["Name"]]
  66. if len(files) > 0:
  67. aufgabe = files[0]
  68. return StatusMeldung(
  69. datum=date.fromisoformat(subject[3]),
  70. kunde=subject[0],
  71. aufgabe=aufgabe,
  72. start=time.fromisoformat(subject[1]),
  73. ende=time.fromisoformat(subject[2]),
  74. fehlerbericht=fehlerbericht,
  75. anzahl=int(subject[4]),
  76. )
  77. def cleanup(self):
  78. pass
  79. if __name__ == "__main__":
  80. mi = MailImport()
  81. mi.mail_import()
  82. mi.cleanup()