kaineanung
Goto Top

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:

#!/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!

Content-ID: 2264922397

Url: https://administrator.de/contentid/2264922397

Ausgedruckt am: 25.11.2024 um 09:11 Uhr

Lochkartenstanzer
Lochkartenstanzer 23.03.2022 aktualisiert um 19:49:41 Uhr
Goto Top
Moin,

Darf man fragen, warum Du nicht einfach mail oder mailx benutzt?

lks

PS: einfach mehrere "rcpt to" abschicken. face-smile
117471
117471 23.03.2022 um 19:55:26 Uhr
Goto Top
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
kaineanung
kaineanung 24.03.2022 um 11:24:51 Uhr
Goto Top
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.

@Lochkartenstanzer
Reicht es einfach nur so oft "RCTP TO" reinzusetzen wie Empfänger da sind?
Das habe ich gemacht und bekomme trotzdem einen Fehler.
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.

Also nochmals:
Darf ich an der Stelle "RCTP TO:" einfach so oft diese Zeilen einfügen wie ich brauche um mehrere Empfänger anzugeben?
Wenn ich max1@gmx.net und max2.gmx.net als Empfänger habe, dann sol ldas wie folgt an der Stelle ausschauen:

.
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).
Kann mir aber jemand sagen das der Weg so auf jeden Fall richtig ist oder übersehe ich da was?
Ich kenne mich mit Shell und Linux noch nicht so toll aus und weiß z.B. nicht was die
read -u 3 sts line
checkStatus "$sts" "$line"  
Befehle machen und wohin die Ausgabe bei
echo 2$irgendwas">&3  
ausgegeben wird (also ">&3"?)?

Wenn mir das mal jemand kurz erklären könnte wäre das super.
Lochkartenstanzer
Lochkartenstanzer 24.03.2022 um 11:37:20 Uhr
Goto Top
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.

mail und mailx sind bei (fast) jedem Unix-System dabei, quasi als Bordmittel"


@Lochkartenstanzer
Reicht es einfach nur so oft "RCTP TO" reinzusetzen wie Empfänger da sind?

Jupp.

Das habe ich gemacht und bekomme trotzdem einen Fehler.
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?

Ja.

Wenn ich max1@gmx.net und max2.gmx.net als Empfänger habe, dann sol ldas wie folgt an der Stelle ausschauen:

.
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
read -u 3 sts line
checkStatus "$sts" "$line"  
Befehle machen und wohin die Ausgabe bei

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  
ausgegeben wird (also ">&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
117471
117471 24.03.2022 um 15:39:22 Uhr
Goto Top
Hallo,

Zitat von @Lochkartenstanzer:

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
kaineanung
kaineanung 24.03.2022 um 22:57:26 Uhr
Goto Top
Ich bin relativ neu in der Linuxwelt. Wie kann ich unter CentOS herausfinden ob dieses mail oder mailx installiert 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..
117471
117471 25.03.2022 um 00:28:06 Uhr
Goto Top
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
Lochkartenstanzer
Lochkartenstanzer 25.03.2022 um 06:59:19 Uhr
Goto Top
Zitat von @kaineanung:

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
kaineanung
kaineanung 25.03.2022 um 12:55:17 Uhr
Goto Top
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...

Wenn es so bleibt wie bisher dann muss ich mit o.g. Script wohl auskommen face-sad
Lochkartenstanzer
Lochkartenstanzer 25.03.2022 um 13:02:24 Uhr
Goto Top
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...


Kann ich kaum glauben. İch vermute eher, daß die nicht im suchpfad sind.

lks
117471
117471 25.03.2022 um 13:14:55 Uhr
Goto Top
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
Lochkartenstanzer
Lochkartenstanzer 25.03.2022 aktualisiert um 14:36:01 Uhr
Goto Top
Mail ein anderer quit-n-dirty-Ansatz:

#!/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