add succesd Mail

master
Sebastian Serfling 2025-03-31 16:04:26 +02:00
parent 1f282a848a
commit f27ea51835
1 changed files with 44 additions and 48 deletions

View File

@ -14,7 +14,7 @@ from dotenv import load_dotenv
def get_tables_from_db(connection): def get_tables_from_db(connection):
""" """
Holt die Liste der zu überprüfenden Tabellen, die 'RAW.' im Namen enthalten Holt die Liste der zu überprüfenden Tabellen, die 'history.' im Namen enthalten
Returns: Returns:
list: Liste der Tabellennamen list: Liste der Tabellennamen
@ -48,7 +48,8 @@ def check_timestamp(connection, tables, timestamp_column, email_config, test_mod
""" """
Überprüft, ob der letzte Zeitstempel in jeder angegebenen Tabelle von gestern ist. Überprüft, ob der letzte Zeitstempel in jeder angegebenen Tabelle von gestern ist.
Sendet eine E-Mail mit den Namen der Tabellen, die nicht aktuell sind oder Sendet eine E-Mail mit den Namen der Tabellen, die nicht aktuell sind oder
gibt die Nachricht auf der Konsole aus, wenn test_mode=True. eine Bestätigungsmail, wenn alle Tabellen aktuell sind. Im Testmodus wird
nur auf der Konsole ausgegeben.
""" """
cursor = connection.cursor() cursor = connection.cursor()
@ -83,37 +84,45 @@ def check_timestamp(connection, tables, timestamp_column, email_config, test_mod
except mysql.connector.Error as err: except mysql.connector.Error as err:
print(f"Fehler beim Überprüfen der Tabelle {table}: {err}") print(f"Fehler beim Überprüfen der Tabelle {table}: {err}")
outdated_tables.append(f"{table} (Fehler: {err}") outdated_tables.append(f"{table} (Fehler: {err})")
# Cursor schließen # Cursor schließen
cursor.close() cursor.close()
# Wenn es nicht aktuelle Tabellen gibt, sende eine E-Mail oder gib Meldung aus # E-Mail Inhalt und Betreff anpassen, je nachdem ob es fehlerhafte Tabellen gibt oder nicht
if outdated_tables: if outdated_tables:
if test_mode: subject = f"Warnung: Nicht aktuelle Tabellen in Datenbank {database}"
print("\n--- TEST MODUS: E-Mail würde gesendet werden ---") body_intro = (
print(f"Betreff: Warnung: Nicht aktuelle Tabellen in Datenbank {database}") f"Hallo,\n\n"
print("Inhalt:") f"die folgenden Tabellen in der Datenbank '{database}' haben keinen aktuellen Zeitstempel von gestern:\n"
print("Hallo,") )
print( body_tables = "\n".join(f"- {table}" for table in outdated_tables)
f"\ndie folgenden Tabellen in der Datenbank '{database}' haben keinen aktuellen Zeitstempel von gestern:") body_footer = "\n\nBitte überprüfen Sie diese Tabellen.\n\nDies ist eine automatisch generierte Nachricht."
for table in outdated_tables:
print(f"- {table}")
print("\nBitte überprüfen Sie diese Tabellen.")
print("\nDies ist eine automatisch generierte Nachricht.")
print("--- ENDE TEST MODUS ---\n")
else:
send_email(outdated_tables, database, email_config)
return False
else: else:
print("Alle Tabellen sind aktuell.") subject = f"Bestätigung: Alle Tabellen in Datenbank {database} sind aktuell"
send_email(outdated_tables, database, email_config) body_intro = (
return True f"Hallo,\n\n"
f"alle zu überprüfenden Tabellen in der Datenbank '{database}' enthalten aktuelle Zeitstempel von gestern.\n"
)
body_tables = ""
body_footer = "\n\nDies ist eine automatisch generierte Nachricht."
# Wenn Testmodus aktiviert, Ausgabe auf Konsole
if test_mode:
print("\n--- TEST MODUS: E-Mail würde gesendet werden ---")
print(f"Betreff: {subject}")
print("Inhalt:")
print(body_intro + body_tables + body_footer)
print("--- ENDE TEST MODUS ---\n")
else:
send_email(subject, body_intro, body_tables, body_footer, email_config)
return not outdated_tables
def send_email(outdated_tables, database, email_config): def send_email(subject, body_intro, body_tables, body_footer, email_config):
""" """
Sendet eine E-Mail mit der Liste der nicht aktuellen Tabellen. Sendet eine E-Mail mit dem angegebenen Betreff und Inhalt.
""" """
sender_email = email_config["sender"] sender_email = email_config["sender"]
receiver_email = email_config["receiver"] receiver_email = email_config["receiver"]
@ -126,30 +135,19 @@ def send_email(outdated_tables, database, email_config):
message = MIMEMultipart() message = MIMEMultipart()
message["From"] = sender_email message["From"] = sender_email
message["To"] = receiver_email message["To"] = receiver_email
message["Subject"] = f"Warnung: Nicht aktuelle Tabellen in Datenbank {database}" message["Subject"] = subject
# E-Mail-Inhalt
body = f"""
Hallo,
die folgenden Tabellen in der Datenbank '{database}' haben keinen aktuellen Zeitstempel von gestern:
{chr(10).join('- ' + table for table in outdated_tables)}
Bitte überprüfen Sie diese Tabellen.
Dies ist eine automatisch generierte Nachricht.
"""
# E-Mail-Inhalt zusammenfügen
body = f"{body_intro}{chr(10) if body_tables else ''}{body_tables}{body_footer}"
message.attach(MIMEText(body, "plain")) message.attach(MIMEText(body, "plain"))
try: try:
# Verbindung zum SMTP-Server herstellen mit TLS # Verbindung zum SMTP-Server herstellen mit TLS
context = ssl.create_default_context() context = ssl.create_default_context()
server = smtplib.SMTP(smtp_server, smtp_port) server = smtplib.SMTP(smtp_server, smtp_port)
server.ehlo() # Kann bei manchen Servern erforderlich sein server.ehlo()
server.starttls(context=context) # TLS-Verschlüsselung aktivieren mit sicherem Kontext server.starttls(context=context)
server.ehlo() # Nach TLS erneut ehlo senden server.ehlo()
# Anmelden (falls erforderlich) # Anmelden (falls erforderlich)
if smtp_password: if smtp_password:
@ -204,8 +202,7 @@ def main():
# Prüfe, ob erforderliche DB-Parameter vorhanden sind # Prüfe, ob erforderliche DB-Parameter vorhanden sind
if not user or not password or not database: if not user or not password or not database:
print( print("Fehler: MySQL-Benutzer, Passwort und Datenbankname müssen entweder in der .env-Datei oder als Parameter angegeben werden!")
"Fehler: MySQL-Benutzer, Passwort und Datenbankname müssen entweder in der .env-Datei oder als Parameter angegeben werden!")
sys.exit(1) sys.exit(1)
# Verbindung zur Datenbank herstellen # Verbindung zur Datenbank herstellen
@ -236,12 +233,11 @@ def main():
# Wenn nicht im Testmodus, prüfe ob E-Mail-Parameter angegeben wurden # Wenn nicht im Testmodus, prüfe ob E-Mail-Parameter angegeben wurden
if not test_mode: if not test_mode:
if not email_config["sender"] or not email_config["receiver"]: if not email_config["sender"] or not email_config["receiver"]:
print( print("Fehler: E-Mail-Absender und -Empfänger müssen entweder in der .env-Datei oder als Parameter angegeben werden!")
"Fehler: E-Mail-Absender und -Empfänger müssen entweder in der .env-Datei oder als Parameter angegeben werden!")
connection.close() connection.close()
sys.exit(1) sys.exit(1)
# Tabellen aus der Datenbanktabelle holen # Tabellen aus der Datenbank holen
tables = get_tables_from_db(connection) tables = get_tables_from_db(connection)
if not tables: if not tables:
@ -253,7 +249,7 @@ def main():
timestamp_column = args.timestamp_column timestamp_column = args.timestamp_column
print(f"Überprüfe Zeitstempel in Spalte: {timestamp_column}") print(f"Überprüfe Zeitstempel in Spalte: {timestamp_column}")
# Timestamp-Überprüfung durchführen # Timestamp-Überprüfung durchführen und entsprechende E-Mail senden
check_timestamp( check_timestamp(
connection, connection,
tables, tables,
@ -267,4 +263,4 @@ def main():
if __name__ == "__main__": if __name__ == "__main__":
main() main()