Wie sende ich mit dem Mail-Befehl vom Terminal aus E-Mails an mehrere Empfänger, wobei jeder einen anderen Anhang erhält?

Wie sende ich mit dem Mail-Befehl vom Terminal aus E-Mails an mehrere Empfänger, wobei jeder einen anderen Anhang erhält?

Hier ist mein Szenario. Ich habe eine txt-Datei. emailADD.txt. Sie enthält in jeder Zeile E-Mail-IDs

[email protected]
[email protected]
[email protected]

Und ich habe Dateien in einem Ordner

abc.pdf
def.pdf
hij.pdf

und so weiter

ich möchte ein Skript, das eine E-Mail mit dem ersten Anhang an die erste ID sendet. Dann eine weitere E-Mail mit dem zweiten Anhang an die zweite ID und so weiter.

Sowohl die E-Mail-IDs als auch die Anhänge werden in alphabetischer Reihenfolge gespeichert. Die Anzahl der gespeicherten E-Mail-IDs und Anhänge ist gleich.

Bitte vorschlagen.

Ich habe diese Idee von jesse_b, aber sie beinhaltet keine unterschiedlichen Anhänge für jede E-Mail-ID.

#!/bin/bash
file=/location/of/emailAdd.txt

while 
    read -r email; 
    do
      #printf '%s\n' 'Hello, world!' | sudo mail -s 'This is the email subject' "$email"
    done < "$file"

Antwort1

Ich denke, es wäre einfacher, mit der Schleife durch die Anhänge zu beginnen und dabei die Empfänger zu extrahieren, da die Shell den Glob in alphabetischer Reihenfolge erweitert. Ihr Skript könnte folgendermaßen aussehen:

#!/usr/bin/env sh

line=1

for i in *.pdf
do
    echo "$i"
    recipient="$(awk -v line="$line" 'NR==line' emailADD.txt)"
    if [ -n "$recipient" ]
    then
        printf "recipient: %s\n" "$recipient"
        line=$((line+1))
        printf '%s\n' 'Hello, world!' | echo mail -s 'This is the email subject' -a "$i" "$recipient"
    fi
done

Entfernen Sie es echo, um den Befehl tatsächlich auszuführen mail, aber führen Sie ihn zuerst damit aus, um sicherzustellen, dass er das gewünschte Ergebnis liefert.

Antwort2

Wenn Sie eine Unmenge an E-Mails versenden, können Sie die Leistung verbessern, indem Sie das Öffnen von emailADD.txt einmal pro Anhang vermeiden. Wenn Sie Bash verwenden, können Sie <()die Anhänge verarbeiten, ohne ihre Namen in einer Datei zu speichern:

$ paste emailADD.txt <(ls folder/) | while read -r email pdf; do printf '%s\n' 'Hello, world!' | echo mail -s 'This is the email subject' -a "$pdf" "$email"; done

Sie können es entfernen, echosobald es den Anschein hat, dass es Ihren Wünschen entspricht.

Wenn Sie dies jedoch nicht automatisch/regelmäßig ausführen, sollten Sie den Text der vollständigen Befehle (einschließlich printf) generieren, die Ausgabe in eine Datei umleiten und dann die Befehle in dieser Datei ausführen. Dies ermöglicht die Überprüfung der Befehle, vermeidet Überraschungen, wenn sich emailADD.txt oder die Anhangsliste während der Ausführung ändert, und gibt Ihnen einen Bericht über das, was getan wurde (der gespeichert oder verworfen werden kann). So:

$ paste emailADD.txt <(ls folder/) | while read -r email pdf; do echo "printf '%s\n' 'Hello, world' | mail -s 'This is the email subject' -a '$pdf' '$email' " ; done >| cmds

verwandte Informationen