From 521c763ae93f4144669d5fc4dfa1a7fec0cbfb10 Mon Sep 17 00:00:00 2001 From: Florian Kaiser Date: Sun, 7 Jul 2024 10:02:01 +0200 Subject: [PATCH] Initial commit --- .env.example | 11 ++++ .gitignore | 4 ++ README.md | 11 ++++ main.py | 152 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 2 + 5 files changed, 180 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 main.py create mode 100644 requirements.txt diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f118792 --- /dev/null +++ b/.env.example @@ -0,0 +1,11 @@ +IMAP_SERVER= +EMAIL_ACCOUNT= +EMAIL_PASSWORD= +MAILBOX= +CHECK_INTERVAL= +SAVE_FOLDER= +SMTP_SERVER= +SMTP_PORT= +SMTP_ACCOUNT= +SMTP_PASSWORD= +TO_EMAIL= \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..237fda6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__/* +tmp/* +venv/* +.env \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..86f1b79 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Dräger-Handyalarm-Bridge + +## Usage +``` +python3 -m venv venv +source venv/bin/activate.fish + +pip install -r requirements.txt + +python3 main.py +``` diff --git a/main.py b/main.py new file mode 100644 index 0000000..22084ea --- /dev/null +++ b/main.py @@ -0,0 +1,152 @@ +REGEX = r'SDS_ILS_BEGINN(#D#Leitstelle:\s+)(.*)(m|o|i)(RTW|NAW|KTW) (.*) \$GPSN(.*)E(.*)SDS_ILS_ENDE' +DRAEGER_TEMPLATE = "{EINSATZNUMMER}#{EINSATZSTICHWORT}#{KLARTEXT}#{ERGAENZUNG}#{ERWEITERUNG}#{SONDERINFO}#{GEO_LON}#{GEO_LAT}#{EINSATZORT}#{ORTSTEIL}#{STRASSE}#{HAUSNUMMER}#{OBJEKTNAME}#{GMANUMMER}#{SACHVERHALT}#{EINSATZKRÄFTE}#{EINSATZMITTEL}#{WACHEN}#{FAHRZEUGE}#{RICs}#{WINDRICHTUNG}#{WINDGESCHWINDIGKEIT}#{ALARMAUSLÖSUNG}#{MELDERNAME}#{MELDERINFO}#" + +from dotenv import load_dotenv +import datetime +from email.mime.text import MIMEText +from email.utils import formatdate +import re + +import imaplib +import email +from email.header import decode_header +import smtplib +import os +import time +import PyPDF2 + +load_dotenv(override=True) + +# Konfigurationsparameter +IMAP_SERVER = os.environ.get("IMAP_SERVER", default=None) +EMAIL_ACCOUNT = os.environ.get("EMAIL_ACCOUNT", default=None) +EMAIL_PASSWORD = os.environ.get("EMAIL_PASSWORD", default=None) +MAILBOX = os.environ.get("MAILBOX", default=None) +CHECK_INTERVAL = int(os.environ.get("CHECK_INTERVAL", default=None)) # in Sekunden +SAVE_FOLDER = os.environ.get("SAVE_FOLDER", default=None) +SMTP_SERVER = os.environ.get("SMTP_SERVER", default=None) +SMTP_PORT = int(os.environ.get("SMTP_PORT", default=None)) +SMTP_ACCOUNT = os.environ.get("SMTP_ACCOUNT", default=None) +SMTP_PASSWORD = os.environ.get("SMTP_PASSWORD", default=None) +TO_EMAIL = os.environ.get("TO_EMAIL", default=None) + +def read_pdf(file_path): + with open(file_path, 'rb') as file: + reader = PyPDF2.PdfReader(file) + text = '' + for page in reader.pages: + text += page.extract_text() + + return text + +def get_draeger_string(text): + match = re.findall(REGEX, text.replace("\n", "")) + + data = {} + data['EINSATZNUMMER'] = "NULL" + data['EINSATZSTICHWORT'] = "Wachalarm" + data['KLARTEXT'] = match[0][1] + " " + match[0][4] + data['ERGAENZUNG'] = "NULL" + data['ERWEITERUNG'] = "NULL" + data['SONDERINFO'] = "NULL" + data['GEO_LON'] = match[0][6][:2] + '.' + match[0][6][2:] + data['GEO_LAT'] = match[0][5][:2] + '.' + match[0][5][2:] + data['EINSATZORT'] = "NULL" + data['ORTSTEIL'] = "NULL" + data['STRASSE'] = "NULL" + data['HAUSNUMMER'] = "NULL" + data['OBJEKTNAME'] = "NULL" + data['GMANUMMER'] = "NULL" + data['SACHVERHALT'] = "NULL" + data['EINSATZKRÄFTE'] = "NULL" + data['EINSATZMITTEL'] = "NULL" + data['WACHEN'] = "NULL" + data['FAHRZEUGE'] = "NULL" + data['RICs'] = "NULL" + data['WINDRICHTUNG'] = "NULL" + data['WINDGESCHWINDIGKEIT'] = "NULL" + data['ALARMAUSLÖSUNG'] = "NULL" + data['MELDERNAME'] = "NULL" + data['MELDERINFO'] = "NULL" + + return DRAEGER_TEMPLATE.format(**data) + +def build_mail(subject, body): + msg = MIMEText(body) + msg['From'] = SMTP_ACCOUNT + msg['To'] = TO_EMAIL + msg['Subject'] = subject + msg['Message-ID'] = email.utils.make_msgid(domain='bez-stuttgart.dlrg.de') + + current_time = datetime.datetime.now() + msg['Date'] = formatdate(timeval=current_time.timestamp()) + + msg['MIME-Version'] = "1.0" + msg['X-Sender'] = SMTP_ACCOUNT + + return msg + +def send_email(msg): + try: + with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as server: + server.set_debuglevel(1) + server.login(SMTP_ACCOUNT, SMTP_PASSWORD) + server.sendmail(SMTP_ACCOUNT, TO_EMAIL, msg.as_string()) + print('Email sent successfully') + except Exception as e: + print(f'Failed to send email: {e}') + +def check_email(): + try: + mail = imaplib.IMAP4_SSL(IMAP_SERVER) + mail.login(EMAIL_ACCOUNT, EMAIL_PASSWORD) + mail.select(MAILBOX) + + status, messages = mail.search(None, 'UNSEEN') + + mail_ids = messages[0].split() + + for mail_id in mail_ids: + status, msg_data = mail.fetch(mail_id, '(RFC822)') + + for response_part in msg_data: + if isinstance(response_part, tuple): + msg = email.message_from_bytes(response_part[1]) + subject, encoding = decode_header(msg["Subject"])[0] + + print(subject) + if (subject == "Nachricht von DLRG Stuttgart"): # Only Mails from Handyalarm + if isinstance(subject, bytes): + subject = subject.decode(encoding if encoding else 'utf-8') + + from_ = msg.get("From") + print(f'Neue E-Mail von {from_} mit Betreff: {subject}') + + for part in msg.walk(): + if part.get_content_maintype() == 'multipart': + continue + if part.get('Content-Disposition') is None: + continue + + filename = part.get_filename() + if filename: + filepath = os.path.join(SAVE_FOLDER, filename) + with open(filepath, 'wb') as f: + f.write(part.get_payload(decode=True)) + + if filename.endswith('.pdf'): + pdf_text = read_pdf(filepath) + draeger_text = get_draeger_string(pdf_text) + mail = build_mail('Test', draeger_text) + + send_email(mail) + mail.logout() + except Exception as e: + print(f'Fehler: {e}') + +if __name__ == "__main__": + # send_email("Test", "Test") + while True: + print("Loop") + check_email() + time.sleep(CHECK_INTERVAL) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c690da3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +python-dotenv +PyPDF2 \ No newline at end of file