From 0c214f4c5a06a860fbb3855fc4973a9fc644a701 Mon Sep 17 00:00:00 2001 From: Florian Kaiser Date: Fri, 9 May 2025 08:36:55 +0200 Subject: [PATCH] Added Readme and helper scripts --- README.md | 83 ++++++++++++++++++++++++++++++++++++++++++++ delete_duplicates.py | 32 +++++++++++++++++ get_folders.py | 23 ++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 README.md create mode 100644 delete_duplicates.py create mode 100644 get_folders.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..dc5230c --- /dev/null +++ b/README.md @@ -0,0 +1,83 @@ +# Mail Attachments Extractor + +Extrahiere E-Mail-Anhänge automatisch aus beliebigen E-Mail-Konten und speichere sie lokal. Unterstützt das Löschen von Duplikaten und das Anzeigen verfügbarer Ordner. + +--- + +## 1. Konfiguration + +Erstelle eine Konfigurationsdatei namens `config.json` auf Basis der Vorlage `config.example.json`: + +```json +{ + "accounts": [ + { + "server": "E-Mail-Server", + "port": "E-Mail-Port", + "user": "Benutzername", + "password": "Passwort", + "remote_folders": ["Kommagetrennte Liste der Ordner auf dem E-Mail-Server"], + "local_folder": "Lokaler Ordner für die gespeicherten Dateien", + "since": "Datum im Format 09-May-2025" + } + ] +} +``` + +**Hinweis:** + +- `remote_folders` enthält die Namen der Ordner, aus denen Anhänge geladen werden sollen. +- `since` gibt das früheste Datum an, ab dem E-Mails berücksichtigt werden. + +--- + +## 2. E-Mail-Anhänge laden + +Lädt alle Anhänge gemäß der Konfiguration herunter: + +```bash +python3 main.py +``` + + +--- + +## 3. Duplikate löschen +Findet und entfernt doppelte Dateien im Zielordner – unabhängig vom Dateinamen: + +```bash +python3 delete_duplicates.py /zu/verarbeitender/Ordner + +oder + +python3 delete_duplicates.py C:\zu\verarbeitender\Ordner +``` + +**Hinweis:** +Aktuell werden die Dateien nicht gelöscht sondern nur umbenannt zu `deleted_Dateiname` + +--- + +## 4. Verfügbare Ordner anzeigen + +### 4.1 Ordner abrufen + +Zeigt alle verfügbaren Ordner des aktuellen E-Mail-Kontos an: + +```bash +python3 get_folders.py +``` + + +### 4.2 Beispielausgabe + +``` +(\HasChildren) "/" INBOX +(\HasNoChildren \UnMarked \Trash) "/" INBOX/Trash +(\HasNoChildren \UnMarked \Junk) "/" INBOX/Junk +(\HasNoChildren \Sent) "/" INBOX/Sent +(\HasNoChildren \UnMarked \Drafts) "/" INBOX/Drafts +``` + +Die relevanten Ordnernamen sind die letzten Einträge jeder Zeile, z.B. `INBOX`, `INBOX/Trash` usw. + diff --git a/delete_duplicates.py b/delete_duplicates.py new file mode 100644 index 0000000..eb2ad38 --- /dev/null +++ b/delete_duplicates.py @@ -0,0 +1,32 @@ +import os +import hashlib +import sys + +# Pfad zum Verzeichnis, das überprüft werden soll +if (len(sys.argv)) != 2: + exit(-1) + +directory_path = sys.argv[1] + +# Dictionary zum Speichern der Dateiinhalte und ihrer Namen +file_contents = {} + +# Durchlaufen aller Dateien im Verzeichnis +for filename in os.listdir(directory_path): + file_path = os.path.join(directory_path, filename) + + # Überprüfen, ob es sich um eine Datei handelt + if os.path.isfile(file_path): + # Hash-Wert des Dateiinhalts berechnen + with open(file_path, 'rb') as file: + content_hash = hashlib.md5(file.read()).hexdigest() + + # Überprüfen, ob der Dateiinhalt bereits vorhanden ist + if content_hash in file_contents: + # Datei umbenennen, wenn sie doppelt ist + new_filename = f"deleted_{filename}" + os.rename(file_path, os.path.join(directory_path, new_filename)) + print(f"Datei {filename} umbenannt in {new_filename}") + else: + # Dateiinhalt im Dictionary speichern + file_contents[content_hash] = filename diff --git a/get_folders.py b/get_folders.py new file mode 100644 index 0000000..2893925 --- /dev/null +++ b/get_folders.py @@ -0,0 +1,23 @@ +import argparse +import imaplib +import email +import os +import json + +if __name__ == "__main__": + with open('config.json', 'r') as f: + config = json.load(f) + + for key, item in enumerate(config['accounts']): + print(key, item) + # IMAP-Verbindung herstellen + mail = imaplib.IMAP4_SSL(item['server'], item['port']) + mail.login(item['user'], item['password']) + + status, folders = mail.list() + for folder in folders: + print(folder.decode()) + + # Verbindung schließen + mail.logout() +