Wer kennt es nicht mehrere Dateianhänge auf mehrere Mails aufteilen.
Zitat von Feifel am 8. Juni 2025, 14:29 UhrIch habe versucht mittels Bash Script die Arbeit etwas zu erleichtern. Ich habe manchmal mehrere Dateianhänge (>20) die ich per E-Mail versenden muss. Hierbei nervt es einfach immer auf die Gesamtgröße der Mailanhänge zu schauen um die maximale Mailgröße nicht zu überschreiten.
Funktionsweise:
Eingabeabfrage: Maximale E-Mail-Größe (in MB) Quellordner für PDFs Automatische Erstellung eines Zielordners (PDF_Mail_Pakete) Dateiverarbeitung: Findet alle PDFs im Quellordner Sortiert sie absteigend nach Größe Packt Dateien in Gruppen, bis das Größenlimit erreicht ist Überspringt einzelne Dateien, die zu groß sind Ausgabe: Erstellt nummerierte Mail-Ordner (Mail_1, Mail_2, etc.) Kopiert PDFs in die entsprechenden Ordner Erstellt Dateiliste.txt mit den enthaltenen Dateien Zeigt Fortschritt mit formatierten Dateigrößen an
Features:
Automatische Größenberechnung in MB Überspringen zu großer Einzeldateien mit Warnung Fortschrittsanzeige während der Verarbeitung Fehlerbehandlung bei ungültigen Eingaben Behandlung von Dateinamen mit Leerzeichen/Sonderzeichen Klare Zusammenfassung nach Abschluss
Verwendung:
Skript als pdf-mailer.sh speichern Ausführbar machen: chmod +x pdf-mailer.sh Ausführen: ./pdf-mailer.sh Anweisungen folgen
Beispielausgabe:
Mails mit 20MB max. Anhanggröße
Mail_1 erstellt: 19.84 MB
Mail_2 erstellt: 18.76 MBFertig! Es wurden 2 Pakete erstellt.
Alle Dateien befinden sich in: '/home/user/dokumente/PDF_Mail_Pakete'Jeder Mail-Ordner enthält:
Die zugehörigen PDF-Dateien Eine Dateiliste.txt mit den Dateinamen Falls jemand ein für mich sehr nützliches Script benötigt kann das Script gerne testen.
#!/bin/bash
# Funktion zur Formatierung von Bytes in MB
format_mb() {
echo "$1" | awk '{printf "%.2f MB", $1/1048576}'
}
# Maximale Größe pro Mail abfragen
read -p "Maximale Größe pro Mail (in MB): " max_size_mb
# Validierung der Eingabe
if ! [[ "$max_size_mb" =~ ^[0-9]+$ ]] || [[ "$max_size_mb" -le 0 ]]; then
echo "Ungültige Eingabe! Bitte eine positive Zahl eingeben."
exit 1
fi
# Umrechnung in Bytes
max_size_bytes=$((max_size_mb * 1024 * 1024))
# Quellordner auswählen
read -e -p "Pfad zum PDF-Quellordner: " source_dir
if [[ ! -d "$source_dir" ]]; then
echo "Fehler: '$source_dir' ist kein gültiges Verzeichnis!"
exit 1
fi
# Zielordner erstellen
target_dir="$source_dir/PDF_Mail_Pakete"
mkdir -p "$target_dir" || exit 1
# PDF-Dateien finden und sortieren
mapfile -t pdf_files < <(find "$source_dir" -maxdepth 1 -type f -iname "*.pdf" -exec du -b {} + | sort -rh)
# Variablen initialisieren
declare -a current_group
current_group_size=0
group_counter=1
# Verarbeitungsfunktion
process_group() {
group_dir="$target_dir/Mail_${group_counter}"
mkdir -p "$group_dir" || return 1
# PDFs kopieren und Liste erstellen
for file in "${current_group[@]}"; do
cp "$file" "$group_dir/" || return 1
basename "$file" >> "$group_dir/Dateiliste.txt"
done
echo "Paket $group_counter erstellt: $(format_mb $current_group_size)"
((group_counter++))
current_group=()
current_group_size=0
}
# Hauptverarbeitung
for entry in "${pdf_files[@]}"; do
file_size=$(echo "$entry" | awk '{print $1}')
file_path=$(echo "$entry" | cut -f2-)
# Prüfe auf zu große Einzeldateien
if [[ "$file_size" -gt "$max_size_bytes" ]]; then
echo "Warnung: '$file_path' ist zu groß ($(format_mb $file_size)) und wird übersprungen!"
continue
fi
# Füge Datei zur aktuellen Gruppe hinzu
if [[ $((current_group_size + file_size)) -le $max_size_bytes ]]; then
current_group+=("$file_path")
((current_group_size += file_size))
else
process_group || exit 1
current_group+=("$file_path")
current_group_size="$file_size"
fi
done
# Restliche Dateien verarbeiten
if [[ "${#current_group[@]}" -gt 0 ]]; then
process_group || exit 1
fi
# Zusammenfassung
echo -e "nFertig! Es wurden $((group_counter - 1)) Pakete erstellt."
echo "Alle Dateien befinden sich in: '$target_dir'"
Ich habe versucht mittels Bash Script die Arbeit etwas zu erleichtern. Ich habe manchmal mehrere Dateianhänge (>20) die ich per E-Mail versenden muss. Hierbei nervt es einfach immer auf die Gesamtgröße der Mailanhänge zu schauen um die maximale Mailgröße nicht zu überschreiten.
Funktionsweise:
Eingabeabfrage:
Maximale E-Mail-Größe (in MB)
Quellordner für PDFs
Automatische Erstellung eines Zielordners (PDF_Mail_Pakete)
Dateiverarbeitung:
Findet alle PDFs im Quellordner
Sortiert sie absteigend nach Größe
Packt Dateien in Gruppen, bis das Größenlimit erreicht ist
Überspringt einzelne Dateien, die zu groß sind
Ausgabe:
Erstellt nummerierte Mail-Ordner (Mail_1, Mail_2, etc.)
Kopiert PDFs in die entsprechenden Ordner
Erstellt Dateiliste.txt mit den enthaltenen Dateien
Zeigt Fortschritt mit formatierten Dateigrößen an
Features:
Automatische Größenberechnung in MB
Überspringen zu großer Einzeldateien mit Warnung
Fortschrittsanzeige während der Verarbeitung
Fehlerbehandlung bei ungültigen Eingaben
Behandlung von Dateinamen mit Leerzeichen/Sonderzeichen
Klare Zusammenfassung nach Abschluss
Verwendung:
Skript als pdf-mailer.sh speichern
Ausführbar machen: chmod +x pdf-mailer.sh
Ausführen: ./pdf-mailer.sh
Anweisungen folgen
Beispielausgabe:
Mails mit 20MB max. Anhanggröße
Mail_1 erstellt: 19.84 MB
Mail_2 erstellt: 18.76 MB
Fertig! Es wurden 2 Pakete erstellt.
Alle Dateien befinden sich in: '/home/user/dokumente/PDF_Mail_Pakete'
Jeder Mail-Ordner enthält:
Die zugehörigen PDF-Dateien
Eine Dateiliste.txt mit den Dateinamen
Falls jemand ein für mich sehr nützliches Script benötigt kann das Script gerne testen.
#!/bin/bash
# Funktion zur Formatierung von Bytes in MB
format_mb() {
echo "$1" | awk '{printf "%.2f MB", $1/1048576}'
}
# Maximale Größe pro Mail abfragen
read -p "Maximale Größe pro Mail (in MB): " max_size_mb
# Validierung der Eingabe
if ! [[ "$max_size_mb" =~ ^[0-9]+$ ]] || [[ "$max_size_mb" -le 0 ]]; then
echo "Ungültige Eingabe! Bitte eine positive Zahl eingeben."
exit 1
fi
# Umrechnung in Bytes
max_size_bytes=$((max_size_mb * 1024 * 1024))
# Quellordner auswählen
read -e -p "Pfad zum PDF-Quellordner: " source_dir
if [[ ! -d "$source_dir" ]]; then
echo "Fehler: '$source_dir' ist kein gültiges Verzeichnis!"
exit 1
fi
# Zielordner erstellen
target_dir="$source_dir/PDF_Mail_Pakete"
mkdir -p "$target_dir" || exit 1
# PDF-Dateien finden und sortieren
mapfile -t pdf_files < <(find "$source_dir" -maxdepth 1 -type f -iname "*.pdf" -exec du -b {} + | sort -rh)
# Variablen initialisieren
declare -a current_group
current_group_size=0
group_counter=1
# Verarbeitungsfunktion
process_group() {
group_dir="$target_dir/Mail_${group_counter}"
mkdir -p "$group_dir" || return 1
# PDFs kopieren und Liste erstellen
for file in "${current_group[@]}"; do
cp "$file" "$group_dir/" || return 1
basename "$file" >> "$group_dir/Dateiliste.txt"
done
echo "Paket $group_counter erstellt: $(format_mb $current_group_size)"
((group_counter++))
current_group=()
current_group_size=0
}
# Hauptverarbeitung
for entry in "${pdf_files[@]}"; do
file_size=$(echo "$entry" | awk '{print $1}')
file_path=$(echo "$entry" | cut -f2-)
# Prüfe auf zu große Einzeldateien
if [[ "$file_size" -gt "$max_size_bytes" ]]; then
echo "Warnung: '$file_path' ist zu groß ($(format_mb $file_size)) und wird übersprungen!"
continue
fi
# Füge Datei zur aktuellen Gruppe hinzu
if [[ $((current_group_size + file_size)) -le $max_size_bytes ]]; then
current_group+=("$file_path")
((current_group_size += file_size))
else
process_group || exit 1
current_group+=("$file_path")
current_group_size="$file_size"
fi
done
# Restliche Dateien verarbeiten
if [[ "${#current_group[@]}" -gt 0 ]]; then
process_group || exit 1
fi
# Zusammenfassung
echo -e "nFertig! Es wurden $((group_counter - 1)) Pakete erstellt."
echo "Alle Dateien befinden sich in: '$target_dir'"