from datetime import datetime import imaplib import email import os import logging import re from email.header import decode_header import json def sanitize_filename(filename): # Entfernt ungültige Zeichen aus dem Dateinamen filename = re.sub(r'[^\w\s.-]', '', filename) # Entfernt alle Zeichen außer Buchstaben, Zahlen, Leerzeichen, Punkt, Bindestrich und Unterstrich filename = filename.replace(' ', '_') # Ersetzt Leerzeichen durch Unterstriche return filename def decode_email_header(header): decoded_header = '' for part in decode_header(header): if part[1] is not None: decoded_header += part[0].decode(part[1]) else: decoded_header += part[0] return decoded_header def process_emails(server, port, user, password, remote_folder, local_folder, since): # Logging einrichten logging.basicConfig(filename='email_log.log', level=logging.INFO) # Ordner für Anhänge erstellen, falls er nicht existiert if not os.path.exists(local_folder): os.makedirs(local_folder) # IMAP-Verbindung herstellen mail = imaplib.IMAP4_SSL(server, port) mail.login(user, password) # Remote-Ordner auswählen mail.select(remote_folder) # Suchkriterien festlegen (z.B. alle E-Mails) _, messages = mail.search(None, f'(SINCE "{since}")') # Nachrichten-IDs extrahieren msg_ids = messages[0].split() print("IDs:", msg_ids) # Nachrichten verarbeiten for msg_id in msg_ids: # Nachricht abrufen _, msg = mail.fetch(msg_id, '(RFC822)') raw_message = msg[0][1] # Nachricht parsen message = email.message_from_bytes(raw_message) print("Betreff:", message['Subject']) print("Absender:", message['From']) print("Empfänger:", message['Date']) # Anhänge speichern for part in message.walk(): if part.get_content_maintype() == 'multipart': continue if part.get('Content-Disposition') is None: continue filename = part.get_filename() if filename: # Dateinamen dekodieren, falls er kodiert ist if isinstance(filename, bytes): filename = filename.decode('utf-8', errors='ignore') else: filename = decode_email_header(filename) # Dateinamen bereinigen und mit der Nachrichten-ID erweitern sanitized_filename = sanitize_filename(filename) # Stelle sicher, dass die Dateiendung korrekt ist if '.' not in sanitized_filename: if part.get_content_type() == 'application/pdf': sanitized_filename += '.pdf' elif part.get_content_type() == 'image/jpeg': sanitized_filename += '.jpg' elif part.get_content_type() == 'image/png': sanitized_filename += '.png' # Fügen Sie weitere Dateitypen hinzu, falls erforderlich attachment_filename = f"{msg_id.decode()}_{sanitized_filename}" filepath = os.path.join(local_folder, attachment_filename) try: with open(filepath, 'wb') as f: f.write(part.get_payload(decode=True)) logging.info(f'Anhang gespeichert: {attachment_filename}') except Exception as e: logging.error(f"Fehler beim Speichern des Anhangs {attachment_filename}: {e}") # Verbindung schließen mail.close() mail.logout() if __name__ == "__main__": with open('config.json', 'r') as f: config = json.load(f) for key, item in enumerate(config['accounts']): print(key, item) for folder in item['remote_folders']: print(item['user'], folder, item['since']) process_emails(item['server'], item['port'], item['user'], item['password'], folder, item['local_folder'], item['since']) config['accounts'][key]["since"] = datetime.now().strftime("%d-%b-%Y") with open('config.json', 'w') as f: json.dump(config, f)