Added Readme and helper scripts

This commit is contained in:
Florian Kaiser 2025-05-09 08:36:55 +02:00
parent b648c0f6b9
commit 0c214f4c5a
3 changed files with 138 additions and 0 deletions

83
README.md Normal file
View File

@ -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.

32
delete_duplicates.py Normal file
View File

@ -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

23
get_folders.py Normal file
View File

@ -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()