mail_import.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from config import DSN, MAILBOX
  2. from model import StatusMeldung
  3. from datetime import date, time
  4. from email.message import EmailMessage
  5. from sqlalchemy import create_engine
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy.exc import IntegrityError
  8. from imap_tools import MailBox
  9. import json
  10. class MailImport:
  11. def open_mailbox(self) -> MailBox:
  12. return MailBox(MAILBOX["server"]).login(
  13. MAILBOX["user"], MAILBOX["password"], MAILBOX["folder"]
  14. )
  15. def mail_import(self):
  16. with (
  17. Session(create_engine(DSN)) as self.session,
  18. self.open_mailbox() as mb,
  19. ):
  20. messages = mb.fetch(mark_seen=True, limit=100)
  21. imported = []
  22. for msg in messages:
  23. status = self.get_status_message(msg)
  24. if status is None:
  25. continue
  26. self.session.add(status)
  27. try:
  28. self.session.commit()
  29. except IntegrityError as e:
  30. self.session.rollback()
  31. print(e.args[0])
  32. imported.append(msg.uid)
  33. # mb.delete(imported)
  34. def get_status_message(self, msg: EmailMessage) -> StatusMeldung:
  35. subject = msg.subject.split(";")
  36. if len(subject) < 5:
  37. print(msg.subject)
  38. return None
  39. attachments = dict([(att.filename, att.payload) for att in msg.attachments])
  40. fehlerbericht_json = json.loads(attachments.get("fehlerbericht.json", ""))
  41. fehlerbericht_import = json.dumps(fehlerbericht_json)
  42. aufgabe = ""
  43. if len(subject) > 5:
  44. if subject[5][-4:] == ".bat":
  45. aufgabe = subject[5]
  46. elif ":" in subject[5]:
  47. aufgabe = "manuell"
  48. if ":" not in subject[1]:
  49. aufgabe = subject[1]
  50. subject[1] = "00:00"
  51. if aufgabe == "":
  52. files = [f["Name"] for f in fehlerbericht_json if ".bat" in f["Name"]]
  53. if len(files) > 0:
  54. aufgabe = files[0]
  55. return StatusMeldung(
  56. datum=date.fromisoformat(subject[3]),
  57. kunde=subject[0],
  58. aufgabe=aufgabe,
  59. start=time.fromisoformat(subject[1]),
  60. ende=time.fromisoformat(subject[2]),
  61. fehlerbericht_import=fehlerbericht_import,
  62. anzahl=int(subject[4]),
  63. )
  64. def cleanup(self):
  65. pass
  66. if __name__ == "__main__":
  67. mi = MailImport()
  68. mi.mail_import()
  69. mi.cleanup()