E-Mail-Postfächer automatisiert leeren mit Python
Das Skript im Detail
Das Skript ist in Python geschrieben und nutzt die Bibliotheken imaplib und smtplib, um eine Verbindung zum E-Mail-Server herzustellen, E-Mails zu löschen und anschließend einen Statusbericht per E-Mail zu versenden.
Laden der Umgebungsvariablen
Zunächst werden die benötigten Umgebungsvariablen aus einer .env-Datei geladen. Dies ermöglicht es, sensible Informationen wie Serveradressen und Zugangsdaten getrennt vom Code zu verwalten:
import os
def load_env(file_path):
"""Liest die .env-Datei und setzt Umgebungsvariablen."""
if os.path.exists(file_path):
with open(file_path) as f:
for line in f:
line = line.strip()
if not line or line.startswith('#'):
continue
key, value = line.split('=', 1)
os.environ[key] = value
# Pfad zur .env-Datei definieren
current_dir = os.path.dirname(__file__)
env_file_path = os.path.join(current_dir, '.env')
load_env(env_file_path)
# Zugriff auf die Umgebungsvariablen
IMAP_SERVER = os.environ.get('IMAP_SERVER')
IMAP_USER = os.environ.get('IMAP_USER')
IMAP_PASSWORD = os.environ.get('IMAP_PASSWORD')
SMTP_SERVER = os.environ.get('SMTP_SERVER')
SMTP_USER = os.environ.get('SMTP_USER')
SMTP_PASSWORD = os.environ.get('SMTP_PASSWORD')
STATUS_EMAIL = os.environ.get('STATUS_EMAIL')
Löschen der E-Mails
Die Funktion delete_emails stellt eine Verbindung zum IMAP-Server her, durchsucht den Posteingang nach allen E-Mails und markiert sie zum Löschen. Anschließend wird der Löschvorgang mit expunge durchgeführt:
import imaplib
def delete_emails(log):
try:
log_message(f"Login-Daten für das E-Mail-Konto {IMAP_USER} abgerufen.", log)
# Verbindung zum E-Mail-Server herstellen
mail = imaplib.IMAP4_SSL(IMAP_SERVER)
mail.login(IMAP_USER, IMAP_PASSWORD)
log_message("Erfolgreich eingeloggt.", log)
# Posteingang öffnen
mail.select("inbox")
result, data = mail.search(None, 'ALL')
email_ids = data[0].split()
# Anzahl ungelesener E-Mails ermitteln
result_unread, data_unread = mail.search(None, 'UNSEEN')
unread_count = len(data_unread[0].split())
log_message(f"Posteingang geöffnet, {len(email_ids)} E-Mails gefunden ({unread_count} ungelesen).", log)
# Alle E-Mails löschen
log_message("Lösche E-Mails... ", log)
for email_id in email_ids:
mail.store(email_id, '+FLAGS', '\\Deleted')
mail.expunge() # E-Mails dauerhaft löschen
deleted_count = len(email_ids)
log_message(f"OK! {deleted_count} E-Mails gelöscht.", log)
mail.logout()
log_message("Beende Verbindung.", log)
return deleted_count
except Exception as e:
error_msg = f"Fehler: {e}"
log_message(error_msg, log)
return -1
Versand des Statusberichts
Nach Abschluss des Löschvorgangs wird ein Statusbericht per E-Mail versendet. Die Funktion send_status_email erstellt dazu eine E-Mail mit dem Log des Skripts und sendet diese über den SMTP-Server:
import smtplib
from email.mime.text import MIMEText
def send_status_email(deleted_count, log):
try:
subject = "Bericht zum E-Mail-Löschvorgang"
body = "\n".join(log)
if deleted_count == -1:
body = "Während des E-Mail-Löschvorgangs ist ein Fehler aufgetreten."
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = SMTP_USER
msg['To'] = STATUS_EMAIL
# Status-E-Mail senden
server = smtplib.SMTP(SMTP_SERVER, 587)
server.starttls()
server.login(SMTP_USER, SMTP_PASSWORD)
server.sendmail(SMTP_USER, STATUS_EMAIL, msg.as_string())
server.quit()
except Exception as e:
print(f"Fehler beim Senden der Status-E-Mail: {e}")
Hauptprogramm
Im Hauptteil des Skripts wird das Log initialisiert, die Funktion zum Löschen der E-Mails aufgerufen und anschließend der Statusbericht versendet:
if __name__ == "__main__":
log = [] # Liste zum Speichern der Log-Nachrichten
deleted_count = delete_emails(log)
send_status_email(deleted_count, log)Dieses Skript bietet eine effiziente Lösung, um regelmäßig E-Mails aus einem Postfach zu entfernen und somit Speicherplatz freizugeben. Durch die Automatisierung dieses Prozesses wird sichergestellt, dass das Postfach nicht überläuft und der E-Mail-Versand reibungslos funktioniert.
Python eignet sich besonders gut für solche Aufgaben, da es eine niedrige Einstiegshürde bietet und sich flexibel außerhalb fest definierter Kontexte wie TYPO3 oder Symfony einsetzen lässt. Während Frameworks in diesen Umgebungen oft spezialisierte Werkzeuge wie Command-Line-Utilities für solche Aufgaben mitbringen, ist es in vielen Fällen schneller und pragmatischer, ein eigenständiges Python-Skript zu schreiben. Es erfordert keine aufwendige Integration, ist leicht verständlich und lässt sich problemlos in bestehende Workflows einfügen – genau wie in diesem Fall.



