From f27ea518355b9fb7b72828deb4d1163a3040a739 Mon Sep 17 00:00:00 2001 From: Sebastian Serfling Date: Mon, 31 Mar 2025 16:04:26 +0200 Subject: [PATCH] add succesd Mail --- mysql_timestamp_check.py | 92 +++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 48 deletions(-) diff --git a/mysql_timestamp_check.py b/mysql_timestamp_check.py index 98c7828..aa2e535 100644 --- a/mysql_timestamp_check.py +++ b/mysql_timestamp_check.py @@ -14,7 +14,7 @@ from dotenv import load_dotenv 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: 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. 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() @@ -83,37 +84,45 @@ def check_timestamp(connection, tables, timestamp_column, email_config, test_mod except mysql.connector.Error as 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.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 test_mode: - print("\n--- TEST MODUS: E-Mail würde gesendet werden ---") - print(f"Betreff: Warnung: Nicht aktuelle Tabellen in Datenbank {database}") - print("Inhalt:") - print("Hallo,") - print( - f"\ndie folgenden Tabellen in der Datenbank '{database}' haben keinen aktuellen Zeitstempel von gestern:") - 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 + subject = f"Warnung: Nicht aktuelle Tabellen in Datenbank {database}" + body_intro = ( + f"Hallo,\n\n" + f"die folgenden Tabellen in der Datenbank '{database}' haben keinen aktuellen Zeitstempel von gestern:\n" + ) + body_tables = "\n".join(f"- {table}" for table in outdated_tables) + body_footer = "\n\nBitte überprüfen Sie diese Tabellen.\n\nDies ist eine automatisch generierte Nachricht." else: - print("Alle Tabellen sind aktuell.") - send_email(outdated_tables, database, email_config) - return True + subject = f"Bestätigung: Alle Tabellen in Datenbank {database} sind aktuell" + body_intro = ( + 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"] receiver_email = email_config["receiver"] @@ -126,30 +135,19 @@ def send_email(outdated_tables, database, email_config): message = MIMEMultipart() message["From"] = sender_email message["To"] = receiver_email - message["Subject"] = f"Warnung: Nicht aktuelle Tabellen in Datenbank {database}" - - # 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. - """ + message["Subject"] = subject + # E-Mail-Inhalt zusammenfügen + body = f"{body_intro}{chr(10) if body_tables else ''}{body_tables}{body_footer}" message.attach(MIMEText(body, "plain")) try: # Verbindung zum SMTP-Server herstellen mit TLS context = ssl.create_default_context() server = smtplib.SMTP(smtp_server, smtp_port) - server.ehlo() # Kann bei manchen Servern erforderlich sein - server.starttls(context=context) # TLS-Verschlüsselung aktivieren mit sicherem Kontext - server.ehlo() # Nach TLS erneut ehlo senden + server.ehlo() + server.starttls(context=context) + server.ehlo() # Anmelden (falls erforderlich) if smtp_password: @@ -204,8 +202,7 @@ def main(): # Prüfe, ob erforderliche DB-Parameter vorhanden sind if not user or not password or not database: - print( - "Fehler: MySQL-Benutzer, Passwort und Datenbankname müssen entweder in der .env-Datei oder als Parameter angegeben werden!") + print("Fehler: MySQL-Benutzer, Passwort und Datenbankname müssen entweder in der .env-Datei oder als Parameter angegeben werden!") sys.exit(1) # Verbindung zur Datenbank herstellen @@ -236,12 +233,11 @@ def main(): # Wenn nicht im Testmodus, prüfe ob E-Mail-Parameter angegeben wurden if not test_mode: if not email_config["sender"] or not email_config["receiver"]: - print( - "Fehler: E-Mail-Absender und -Empfänger müssen entweder in der .env-Datei oder als Parameter angegeben werden!") + print("Fehler: E-Mail-Absender und -Empfänger müssen entweder in der .env-Datei oder als Parameter angegeben werden!") connection.close() sys.exit(1) - # Tabellen aus der Datenbanktabelle holen + # Tabellen aus der Datenbank holen tables = get_tables_from_db(connection) if not tables: @@ -253,7 +249,7 @@ def main(): timestamp_column = args.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( connection, tables, @@ -267,4 +263,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main()