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)