Added Readme and helper scripts
This commit is contained in:
parent
b648c0f6b9
commit
0c214f4c5a
83
README.md
Normal file
83
README.md
Normal 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
32
delete_duplicates.py
Normal 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
23
get_folders.py
Normal 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()
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user