Bitte oder Registrieren, um Beiträge und Themen zu erstellen.

Wer kennt es nicht mehrere Dateianhänge auf mehrere Mails aufteilen.

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'"