Initial commit
This commit is contained in:
commit
521c763ae9
11
.env.example
Normal file
11
.env.example
Normal file
@ -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=
|
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
__pycache__/*
|
||||
tmp/*
|
||||
venv/*
|
||||
.env
|
11
README.md
Normal file
11
README.md
Normal file
@ -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
|
||||
```
|
152
main.py
Normal file
152
main.py
Normal file
@ -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)
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
python-dotenv
|
||||
PyPDF2
|
Loading…
Reference in New Issue
Block a user