SMTP-Mailversand aus Bash heraus mit mehreren Empfängern
Hallo Leute,
ich kämpfe heute relativ lange mit dem Problem aus einer Bash-Datei aus Linux eine eMail an mehrere Empäfnger zu versenden.
Ich habe ein Script gefunden und mit diesem klappt es auch wunderbar wenn man nur an ein Empfänger die eMail sendet. Will man mehrere so geht es nicht.
Ich habe mir auch das SMTP ein wenig angeschaut und denke das mehrere Empfänger einfach mehrere Zeilen "RCTP TO:" benötigen und daher habe ich mich mit Splitten des Mailempfänger-Strings (Delimiter ist ein Komma) beschäftigt und erstelle in einer Schleife so viele neue Zeilen mit "RCTP TO:" wie es Mailadressen im String gibt.
Leider klappt es nicht und daher gebe ich nun auf und frage hier nach Rat.
Hier ist das Script was ich gefunden und an meine Umgebung angepasst habe:
Die Werte werden diesem Script als Parameter übergeben. Dieses Script erledigt die Aufgabe korrekt.
Wie mache ich es nun daß ich mehrere Empfänger-Adressen (Kommagetrennt) übergeben kann so daß alle eine Mail bekommen und zwar nicht als CC sondern als direkte Empfänger. Wer die Mail bekommen hat darf jeder Empfänger dabei ruhig sehen.
Ich hoffe hier jemanden zu finden der mir helfen kann.
Schon einmal im voraus vielen Dank dafür!
ich kämpfe heute relativ lange mit dem Problem aus einer Bash-Datei aus Linux eine eMail an mehrere Empäfnger zu versenden.
Ich habe ein Script gefunden und mit diesem klappt es auch wunderbar wenn man nur an ein Empfänger die eMail sendet. Will man mehrere so geht es nicht.
Ich habe mir auch das SMTP ein wenig angeschaut und denke das mehrere Empfänger einfach mehrere Zeilen "RCTP TO:" benötigen und daher habe ich mich mit Splitten des Mailempfänger-Strings (Delimiter ist ein Komma) beschäftigt und erstelle in einer Schleife so viele neue Zeilen mit "RCTP TO:" wie es Mailadressen im String gibt.
Leider klappt es nicht und daher gebe ich nun auf und frage hier nach Rat.
Hier ist das Script was ich gefunden und an meine Umgebung angepasst habe:
#!/bin/sh
function checkStatus {
expect=250
if [ $# -eq 3 ] ; then
expect="${3}"
fi
if [ $1 -ne $expect ] ; then
echo "Error: ${2}"
exit
fi
}
MyHost="hostname meines SMTP-Servers"
#read -p "Enter your mail host: " MailHost
MailHost="HostnameMeinesSMTPServers"
MailPort=25
#read -p "From: " FromAddr
FromAddr = $1
#read -p "To: " ToAddr
ToAddr = $2
#read -p "Subject: " Subject
Subject=$3
#read -p "Message: " Message
Message=$4
exec 3<>/dev/tcp/${MailHost}/${MailPort}
read -u 3 sts line
checkStatus "${sts}" "${line}" 220
echo "HELO ${MyHost}" >&3
read -u 3 sts line
checkStatus "$sts" "$line"
echo "MAIL FROM: ${FromAddr}" >&3
read -u 3 sts line
checkStatus "$sts" "$line"
echo "RCPT TO: ${ToAddr}" >&3
read -u 3 sts line
checkStatus "$sts" "$line"
echo "DATA" >&3
read -u 3 sts line
checkStatus "$sts" "$line" 354
echo "Subject: ${Subject}" >&3
echo "${Message}" >&3
echo "." >&3
read -u 3 sts line
checkStatus "$sts" "$line"
Die Werte werden diesem Script als Parameter übergeben. Dieses Script erledigt die Aufgabe korrekt.
Wie mache ich es nun daß ich mehrere Empfänger-Adressen (Kommagetrennt) übergeben kann so daß alle eine Mail bekommen und zwar nicht als CC sondern als direkte Empfänger. Wer die Mail bekommen hat darf jeder Empfänger dabei ruhig sehen.
Ich hoffe hier jemanden zu finden der mir helfen kann.
Schon einmal im voraus vielen Dank dafür!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 2264922397
Url: https://administrator.de/contentid/2264922397
Ausgedruckt am: 25.11.2024 um 09:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo,
ernsthaft?
unter Linux mail command examples – send mails from command line (erster Google-Treffer) findest Du ein Beispiel, dass Du "eigentlich" nur per copy & paste übernehmen musst...?!?
Gruß,
Jörg
ernsthaft?
unter Linux mail command examples – send mails from command line (erster Google-Treffer) findest Du ein Beispiel, dass Du "eigentlich" nur per copy & paste übernehmen musst...?!?
Gruß,
Jörg
Zitat von @kaineanung:
Hallo,
der Server, auf dem diese Basch als Cronjob laufen soll, ist für uns eine "Blackbox". Da werden wir nichts installieren oder anderweitig ändern sondern eben nur diese Basch-Datei als Cronjob ablegen.
Daher gehen nur Lösungen mit "Bordmitteln" und da wäre eben das o.g. Script welches auch funktioniert solange es ein Email-Empfänger gibt.
Hallo,
der Server, auf dem diese Basch als Cronjob laufen soll, ist für uns eine "Blackbox". Da werden wir nichts installieren oder anderweitig ändern sondern eben nur diese Basch-Datei als Cronjob ablegen.
Daher gehen nur Lösungen mit "Bordmitteln" und da wäre eben das o.g. Script welches auch funktioniert solange es ein Email-Empfänger gibt.
mail und mailx sind bei (fast) jedem Unix-System dabei, quasi als Bordmittel"
Jupp.
Das habe ich gemacht und bekomme trotzdem einen Fehler.
Ich habe im o.g. Script einfach an der Stelle
eine Schleife eingebaut gehabt die so oft schleift wie Elemente aus dem Splitten des ToAddr-Strings mit Komma-Delimiter entstehen. Ich habe zwar 2 Mails rausbekommen aber in der Shell trotzdem Fehlermeldungen bekommen gehabt. Habe ich Rückgängig gemacht. Darf ich das an der Stelle 'einfach so' machen oder muss ich dazwischen noch irgendwelche Zeilen mit Steuerbefehlen/Nummern o.ä. einfügen?
Ich sehe nach "RCTP TO:" in diversen Beispielen immer irgednwelche Zeilen mit der Nummer 250. Ich kann es mir aber nicht erklären was das ist und ob ich das auch brauche usw.
Ich habe im o.g. Script einfach an der Stelle
echo "RCPT TO: ${ToAddr}" >&3
eine Schleife eingebaut gehabt die so oft schleift wie Elemente aus dem Splitten des ToAddr-Strings mit Komma-Delimiter entstehen. Ich habe zwar 2 Mails rausbekommen aber in der Shell trotzdem Fehlermeldungen bekommen gehabt. Habe ich Rückgängig gemacht. Darf ich das an der Stelle 'einfach so' machen oder muss ich dazwischen noch irgendwelche Zeilen mit Steuerbefehlen/Nummern o.ä. einfügen?
Ich sehe nach "RCTP TO:" in diversen Beispielen immer irgednwelche Zeilen mit der Nummer 250. Ich kann es mir aber nicht erklären was das ist und ob ich das auch brauche usw.
Die 250 muß kommen!
250 bedeutet: Requested mail action okay, completed
https://en.wikipedia.org/wiki/List_of_SMTP_server_return_codes#Common_st ...
Den Return Code muß Du natürlich auswerten (oder ignorieren, wenn Dir Fehler egal sind).
Also nochmals:
Darf ich an der Stelle "RCTP TO:" einfach so oft diese Zeilen einfügen wie ich brauche um mehrere Empfänger anzugeben?
Darf ich an der Stelle "RCTP TO:" einfach so oft diese Zeilen einfügen wie ich brauche um mehrere Empfänger anzugeben?
Ja.
Wenn ich max1@gmx.net und max2.gmx.net als Empfänger habe, dann sol ldas wie folgt an der Stelle ausschauen:
Wenn ich das genau so mache dann kommen eben diese 2 Mails auch an, ich bekomme aber an der Stelle der Ausgabe des Echos auf der Shell diverse Fehlermeldungen (ich muss das nochmals so machen und dann melde ich die Meldungen hier).
.
ToAddr="max1@gmx.net,max2.gmx.net"
# Nun Splitten und das Ergebnis ist dann ein string-array Namens strarr
.
read -u 3 sts line
checkStatus "$sts" "$line"
for ((n=0; n < ${#strarr[*]}; n++))
do
echo "RCPT TO: ${strarr[n]}" >&3
done
read -u 3 sts line
checkStatus "$sts" "$line"
.
.
.
Wenn ich das genau so mache dann kommen eben diese 2 Mails auch an, ich bekomme aber an der Stelle der Ausgabe des Echos auf der Shell diverse Fehlermeldungen (ich muss das nochmals so machen und dann melde ich die Meldungen hier).
Wäre gut die Fehlermeldungen zu sehen.
Kann mir aber jemand sagen das der Weg so auf jeden Fall richtig ist oder übersehe ich da was?
Du bist auf dem richtigen Weg, aber ich würde trotzdem mailx nehmen.
Ich kenne mich mit Shell und Linux noch nicht so toll aus und weiß z.B. nicht was die
Befehle machen und wohin die Ausgabe bei
read -u 3 sts line
checkStatus "$sts" "$line"
Der list aus der "Verbindund2 den Rückgabecode und überprüft mit der Prozedur checkStatus, die weiter oben definiert ist, die Werte. Wenn da keine 250 kommt, gibt er den Errorcode aus.
echo 2$irgendwas">&3
Wenn mir das mal jemand kurz erklären könnte wäre das super.
Das bedeutet nur, daß er eine Pipe umleitet.
Habe gerda keien Zeit, das im einzelnen auseinaderzuklabüsern.
beschreibe Doch einfach das ursprüngliche Problem. villleicht gibt es eine einfachere Lösung.
lks
lks
Hallo,
Eben. Nach dem Kommentar war ich auch gedanklich "raus". Ich meine - eine reine bash hat nicht mal 'n Netzwerkstack...
Zumal so 'n lokaler postfix in Verbindung mit mail bzw. mailx wirklich Ideal-Standard ist und notwenige Spielereien (wie z.B. das Umschreiben der Absenderadresse via genericstab, SMTP-Auth usw.) erst ermöglicht.
Ich haue den Krempel i.d.R. in eine temporäre Logdatei und verschicke die dann so:
cat /dies/ist/meine/logdatei.txt | mail -s "Na, ob das wohl geklappert hat?" empfänger@adresse.toplevel
Gruß,
Jörg
Gruß,
Jörg
Zitat von @Lochkartenstanzer:
mail und mailx sind bei (fast) jedem Unix-System dabei, quasi als Bordmittel"
mail und mailx sind bei (fast) jedem Unix-System dabei, quasi als Bordmittel"
Eben. Nach dem Kommentar war ich auch gedanklich "raus". Ich meine - eine reine bash hat nicht mal 'n Netzwerkstack...
Zumal so 'n lokaler postfix in Verbindung mit mail bzw. mailx wirklich Ideal-Standard ist und notwenige Spielereien (wie z.B. das Umschreiben der Absenderadresse via genericstab, SMTP-Auth usw.) erst ermöglicht.
Ich haue den Krempel i.d.R. in eine temporäre Logdatei und verschicke die dann so:
cat /dies/ist/meine/logdatei.txt | mail -s "Na, ob das wohl geklappert hat?" empfänger@adresse.toplevel
Gruß,
Jörg
Gruß,
Jörg
Hallo,
einfach mal in der Root-Shell „mai“ eingeben und TAB drücken. Wenn unter den Vorschlägen mail oder mailx steht…
Hast Du eins von den Beiden?
Gruß,
Jörg
einfach mal in der Root-Shell „mai“ eingeben und TAB drücken. Wenn unter den Vorschlägen mail oder mailx steht…
Hast Du eins von den Beiden?
Gruß,
Jörg
Zitat von @kaineanung:
Ich bin relativ neu in der Linuxwelt. Wie kann ich unter CentOS herausfinden ob dieses mail oder mailx installiert ist?
Ich bin relativ neu in der Linuxwelt. Wie kann ich unter CentOS herausfinden ob dieses mail oder mailx installiert ist?
which mail oder which mailx sagen Dir, ob es da ist.
Vorsicht: es handelt sich dabei um einene email-server (zimbra) der selber mailprogramme am laufen hat und nicht das sich da was in die Quere kommt..
Noch besser. Der hat alles an Board und sollte damit umgehen können.
lks
Zitat von @kaineanung:
Leider hat der Server keine dieser beiden Programme..
Ich habe nun eine Anfrage beim Support des Mailservers laufen ob die mir was dazu sagen können...
Leider hat der Server keine dieser beiden Programme..
Ich habe nun eine Anfrage beim Support des Mailservers laufen ob die mir was dazu sagen können...
Kann ich kaum glauben. İch vermute eher, daß die nicht im suchpfad sind.
lks
Hallo,
sudo yum install mailx
Das mailx wird dann vermutlich auf den sendmail zugehen.
Zimbra verwendet einen eigenen MTA, der liegt, je nach Version, unter:
/opt/zimbra/common/sbin/sendmail
oder
/opt/zimbra/postfix/sbin/sendmail
In der Regel gibt es eine /etc/mail.rc o.Ä., in der man den MTA für mailx auf den modifizierten Zimbra-MTA umbiegen kann.
Gruß,
Jörg
sudo yum install mailx
Das mailx wird dann vermutlich auf den sendmail zugehen.
Zimbra verwendet einen eigenen MTA, der liegt, je nach Version, unter:
/opt/zimbra/common/sbin/sendmail
oder
/opt/zimbra/postfix/sbin/sendmail
In der Regel gibt es eine /etc/mail.rc o.Ä., in der man den MTA für mailx auf den modifizierten Zimbra-MTA umbiegen kann.
Gruß,
Jörg
Mail ein anderer quit-n-dirty-Ansatz:
Das parametrisieren, Schleifen bauen und Fehler auswerten überlasse ich mal Dir.
lks
#!/bin/bash
DATUM=`date -Ins`
echo $DATUM
tmpfile=/tmp/tmpmail.$DATUM
echo $tmpfile
echo >$tmpfile "HELO meinHostname"
echo >>$tmpfile "MAIL FROM: meineAdresse"
echo >>$tmpfile "RCPT TO: ziel1"
echo >>$tmpfile "RCPT TO: ziel2"
echo >>$tmpfile "RCPT TO: ziel3"
echo >>$tmpfile "RCPT TO: ziel4"
echo >>$tmpfile "RCPT TO: ziel5"
echo >>$tmpfile "DATA"
echo >>$tmpfile "From: meineAdresse"
echo >>$tmpfile "To: ziel1, ziel2, ziel3, ziel4, ziel5"
echo >>$tmpfile "Date: `date`"
echo >>$tmpfile "Subject: Test message"
echo >>$tmpfile ""
echo >>$tmpfile "Test message."
echo >>$tmpfile "."
echo >>$tmpfile "QUIT"
nc <$tempfile zielhost zielport
Das parametrisieren, Schleifen bauen und Fehler auswerten überlasse ich mal Dir.
lks