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