Senden einer E-Mail von einem Linux-Shell-Skript

120

Ich möchte eine E-Mail von einem Linux Shell-Skript senden. Was ist der Standardbefehl, um dies zu tun, und muss ich spezielle Servernamen einrichten?

appshare.co
quelle
8
Versuchen Sie, auf Superuser zu fragen [ superuser.com ] oder, noch besser, Unix und Linux SE [ unix.stackexchange.com ].
Dan Moulding
3
Mögliches Duplikat des Shell-Skripts zum Senden einer E-Mail
Ciro Santilli 5 冠状 病 病 六四 事件 5

Antworten:

119

Wenn der Server gut konfiguriert ist, z. B. über einen laufenden MTA, können Sie einfach den Befehl mail verwenden.

Um beispielsweise den Inhalt einer Datei zu senden, können Sie Folgendes tun:

$ cat /path/to/file | mail -s "your subject" your@email.com

man mail für mehr Details.

Francesco Laurita
quelle
7
Was bedeutet "mta" hier, gibt es einen vollständigen Namen oder einen Link? Das möchte ich als Anfänger wissen. Da mir die Erfahrung dazu fehlt.
Zen
5
@Zen MTA steht für Mail Transport Agent. Postfix, Sendmail, Qmail usw.
Francesco Laurita
@Zen Zum größten Teil können Sie MTA als SMTP- oder IMAP-Server bezeichnen.
user151841
1
Wenn Sie sich nicht sicher sind, wie Sie installieren / konfigurieren sollen, und Ubuntu: verwenden sudo apt-get install mailutilsund die Internetseite auswählen : E-Mails werden direkt über SMTP gesendet und empfangen. .
user1717828
86

Wenn Sie einen sauberen und einfachen Ansatz in bash wollen, und Sie wollen nicht verwenden cat, echoetc., wäre der einfachste Weg:

mail -s "subject here" email@address.com <<< "message"

<<<wird verwendet, um die Standardeingabe umzuleiten. Es ist schon lange ein Teil von Bash.

Peter O.
quelle
6
echo -e "Einige \ nMultiline und Tab \ t msg" | mail -s "Betreff" [email protected]
Pipo
cat << END...END | mail -s "subject" [email protected]
ulidtko
Hey, das hat super für mich funktioniert, danke! Wie würde ich mehrere Adressen angeben, an die geliefert werden soll?
E. Owen
1
@ E.Owen Sie können die Option -t verwenden, um an mehrere durch Leerzeichen getrennte Adressen zu senden
Jon
25

Wenn sowohl exim als auch ssmtp ausgeführt werden, können Probleme auftreten. Wenn Sie also nur einen einfachen MTA ausführen möchten, nur um einen einfachen SMTP-Client zum Senden von E-Mail-Benachrichtigungen zu haben, müssen Sie den eventuell vorinstallierten MTA wie exim oder postfix zuerst löschen und ssmtp neu installieren.

Dann ist es ganz einfach, nur 2 Dateien (revaliases und ssmtp.conf) zu konfigurieren - siehe ssmtp doc - und die Verwendung in Ihrem Bash- oder Bourne-Skript ist wie folgt:

#!/bin/sh  
SUBJECT=$1  
RECEIVER=$2  
TEXT=$3  

SERVER_NAME=$HOSTNAME  
SENDER=$(whoami)  
USER="noreply"

[[ -z $1 ]] && SUBJECT="Notification from $SENDER on server $SERVER_NAME"  
[[ -z $2 ]] && RECEIVER="another_configured_email_address"   
[[ -z $3 ]] && TEXT="no text content"  

MAIL_TXT="Subject: $SUBJECT\nFrom: $SENDER\nTo: $RECEIVER\n\n$TEXT"  
echo -e $MAIL_TXT | sendmail -t  
exit $?  

Vergessen Sie natürlich nicht, Ihre Firewall-Ausgabe für den SMTP-Port (25) zu öffnen.

hornetbzz
quelle
Wo kann ich die Portnummer in diesem Skript ändern? Auf meinem Server funktioniert der SMTP-Port über 8181.
Manix
Ich würde dies in dieser Shell nicht tun, sonst werden Sie früher oder später stecken bleiben. Sie können es in der Konfigurationsdatei tun: Siehe unix.stackexchange.com/a/132731
hornetbzz
1
Warum werden Zeilenumbrüche bearbeitet, wenn ich ein einfaches Echo $ MAIL_TXT mache?
KernelPanic
1
@ Marko: Bitte sehen Sie Mann Echo mit -e Option: Interpretation von Backslash
Escape aktivieren
Entschuldigung, habe den Parameter -e falsch gemacht
KernelPanic
10

Eine weitere Option für ein Bash-Skript:

mailbody="Testmail via bash script"
echo "From: [email protected]" > /tmp/mailtest
echo "To: [email protected]" >> /tmp/mailtest
echo "Subject: Mailtest subject" >> /tmp/mailtest
echo "" >> /tmp/mailtest
echo $mailbody >> /tmp/mailtest
cat /tmp/mailtest | /usr/sbin/sendmail -t
  • Die Datei /tmp/mailtestwird bei jeder Verwendung dieses Skripts überschrieben.
  • Der Speicherort von sendmail kann je nach System unterschiedlich sein.
  • Wenn Sie dies in einem Cron-Skript verwenden, müssen Sie den absoluten Pfad für den Befehl sendmail verwenden.
SPRBRN
quelle
1
Downvoted, da mehr als ein Prozess das Skript gleichzeitig aufrufen kann. Dies kann zu einer beschädigten / falschen tmp-Datei führen. Außerdem wird die / tmp-Datei nicht jedes Mal überschrieben, wenn sie verwendet wird - sie wächst tatsächlich mit jeder E-Mail, die alle vorherigen E-Mails enthält. Nicht gut.
Taterhead
1
Das erste Schreiben in / tmp / mailtest ist ein Überschreiben, sodass alles entfernt wird, was zuvor darin enthalten war. Dennoch ist diese Methode aus den anderen von Ihnen beschriebenen Gründen nicht ideal.
Simon
8

Im Allgemeinen möchten Sie den mailBefehl verwenden, um Ihre Nachricht mit lokalem MTA zu senden (der sie entweder über SMTP an das Ziel übermittelt oder einfach an einen leistungsstärkeren SMTP-Server weiterleitet, z. B. an Ihren ISP). Wenn Sie keinen lokalen MTA haben (obwohl es für ein UNIX-ähnliches System etwas ungewöhnlich ist, einen wegzulassen), können Sie entweder einen minimalistischen MTA wie ssmtp verwenden .

ssmtpist recht einfach zu konfigurieren. Grundsätzlich müssen Sie nur angeben, wo sich der SMTP-Server Ihres Anbieters befindet:

# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=mail

Eine andere Möglichkeit besteht darin, eines von unzähligen Skripten zu verwenden, die sich direkt mit dem SMTP-Server verbinden, und zu versuchen, dort eine Nachricht zu posten, z. B. Smtp-Auth-E-Mail-Skript , SMTP-CLI , SendEmail usw.

GreyCat
quelle
"ssmtp" wurde auf dem Computer installiert, so dass ich es nicht ausprobieren konnte, aber trotzdem danke
appshare.co
5

Wenn Sie zugeben, dass Sie einen SMTP-Server verwenden möchten, können Sie Folgendes tun:

export SUBJECT=some_subject
export smtp=somehost:someport
export EMAIL=someaccount@somedomain
echo "some message" | mailx -s "$SUBJECT" "$EMAIL"

Ändern somehost, someportund someaccount@somedomaindie tatsächlichen Werte , die Sie verwenden würden. In diesem Beispiel wird keine Verschlüsselung und keine Authentifizierung durchgeführt.

Germano
quelle
Und was tun, wenn mailxnicht installiert?
Nalply
2

Der mailBefehl macht das (wer hätte das gedacht ;-). Öffnen Sie Ihre Shell und geben Sie ein man mail, um die Handbuchseite für den mailBefehl für alle verfügbaren Optionen aufzurufen.

DarkDust
quelle
2
Ich habe das getan, aber es gibt keine Option, einen zu verwendenden Server anzugeben
appshare.co
1
Dies ist Teil Ihrer lokalen Mail Transfer Agent-Konfiguration, z. B. Sendmail oder Postfix.
DarkDust
2

Sie brauchen nicht einmal einen MTA. Das SMTP-Protokoll ist einfach genug, um es direkt auf Ihren SMTP-Server zu schreiben. Sie können sogar über SSL / TLS kommunizieren, wenn Sie das OpenSSL-Paket installiert haben. Überprüfen Sie diesen Beitrag: https://33hops.com/send-email-from-bash-shell.html

Das obige Beispiel zeigt, wie Sie Text- / HTML-E-Mails senden, die sofort funktionieren. Wenn Sie Anhänge hinzufügen möchten, kann die Sache etwas komplizierter werden. Sie müssen die Binärdateien mit base64 codieren und zwischen Grenzen einbetten. Dies ist ein guter Ort, um Nachforschungen anzustellen: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP

Daniel J.
quelle
2

Unter Linux kann das Mail- Dienstprogramm zum Senden von Anhängen mit der Option "-a" verwendet werden. Lesen Sie die Manpages, um mehr über die Option zu erfahren. Zum Beispiel sendet folgender Code einen Anhang:

mail -s "DAS IST SUBJEKT" -a Anhang.txt [email protected] <<< "Hallo Kumpel, bitte finden Sie Fehlerberichte."

krish___na
quelle
Willkommen bei SO. Vielen Dank für die Beantwortung. Bitte lesen Sie die Informationen darüber, wie Sie eine gute Antwort schreiben und entsprechend ändern können. Viel Spaß SO ;-)
ZF007
2

SENDEN SIE DIE MAIL VON LINUX AN GMAIL

POSTFIX VERWENDEN

1: Software installieren

Debian und Ubuntu:

apt-get update && apt-get install postfix mailutils

OpenSUSE:

zypper update && zypper install postfix mailx cyrus-sasl

Fedora:

dnf update && dnf install postfix mailx

CentOS:

yum update && yum install postfix mailx cyrus-sasl cyrus-sasl-plain

Arch Linux:

pacman -Sy postfix mailutils

FreeBSD:

portsnap fetch extract update

cd /usr/ports/mail/postfix

make config

Wählen Sie in der Konfiguration die SASL-Unterstützung aus

make install clean

pkg install mailx

2. Konfigurieren Sie Google Mail

/ etc / postfix. Erstellen oder bearbeiten Sie die Passwortdatei:

vim /etc/postfix/sasl_passwd

Ich benutze VIM. Du kannst jeden Dateibearbeiter wie Nano, Cat ... verwenden.

> Ubuntu, Fedora, CentOS, Debian, OpenSUSE, Arch Linux:

füge das hinzu

Wo Benutzer durch Ihren Mail-Namen und Passwort ersetzen, ist Ihr Google Mail- Passwort

[smtp.gmail.com]:587    user@gmail.com:password

Speichern und schließen Sie die Datei und machen Sie sie nur über root zugänglich: da es sich um einen vertraulichen Inhalt handelt, der Ihr Passwort enthält

chmod 600 /usr/local/etc/postfix/sasl_passwd

> FreeBSD:

Verzeichnis / usr / local / etc / postfix.

vim /usr/local/etc/postfix/sasl_passwd

Fügen Sie die Zeile hinzu:

[smtp.gmail.com]:587    user@gmail.com:password

Speichern und nur über root zugänglich machen:

chmod 600 /usr/local/etc/postfix/sasl_passwd

3. Postfix-Konfiguration

Konfigurationsdatei main.cf

6 Parameter müssen wir im Postfix einstellen

Ubuntu, Arch Linux, Debian:

bearbeiten

 vim /etc/postfix/main.cf

Ändern Sie die folgenden Werte:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

smtp_sasl_security_options, die in der Konfiguration auf leer gesetzt werden , um sicherzustellen, dass keine mit Google Mail inkompatiblen Sicherheitsoptionen verwendet werden.

speichern und schließen

wie für

OpenSUSE:

vim /etc/postfix/main.cf

ändern

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/ca-bundle.pem

Außerdem muss die Datei master.cf konfiguriert werden

ändern:

vim /etc/postfix/master.cf

wie durch Kommentieren dieser Zeile (# entfernen)

#tlsmgr unix - - n 1000? 1 tlsmg

speichern und schließen

Fedora, CentOS:

vim /etc/postfix/main.cf

ändern

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

FreeBSD:

vim /usr/local/etc/postfix/main.cf

ändern:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/mail/certs/cacert.pem

Speichern und schließen Sie diese

4. Passwortdatei verarbeiten:

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian:

postmap /etc/postfix/sasl_passwd

für freeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Starten Sie Postfix neu

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian:

systemctl restart postfix.service

für FreeBSD:

service postfix onestart
nano /etc/rc.conf

hinzufügen

postfix_enable=YES

Speichern und dann starten

service postfix start

5. Aktivieren Sie "Weniger sichere Apps" in Google Mail mithilfe des folgenden Links

https://support.google.com/accounts/answer/6010255

6. Senden Sie eine Test-E-Mail

mail -s "subject" recever@domain.com

Drücken Sie Enter

Fügen Sie nach Ihren Wünschen einen E-Mail- Text hinzu. Drücken Sie die Eingabetaste und dann Strg + D, um eine ordnungsgemäße Beendigung zu erreichen

wenn es nicht funktioniert , die alle Schritte überprüft erneut und überprüfen , ob u „ermöglicht weniger sicher app“ in Ihrem gmail

Starten Sie dann postfix neu, wenn Sie daran etwas ändern

Erstellen Sie für das Shell-Skript die .sh-Datei und fügen Sie den Befehl 6 step als Ihre Anforderung hinzu

Zum Beispiel nur für eine Probe

#!/bin/bash
REALVALUE=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
THRESHOLD=80

if [ "$REALVALUE" -gt "$THRESHOLD" ] ; then
    mail -s 'Disk Space Alert' mailid@domainname.com << EOF
Your root partition remaining free space is critically low. Used: $REALVALUE%
EOF
fi

Das Skript sendet eine E-Mail, wenn die Festplattennutzung über den von der THRESHOLD-Variable angegebenen Prozentsatz steigt (hier 80%).

Chandan A.
quelle
Sollte der Name dieser Antwort nicht "SENDEN SIE DIE MAIL VON LINUX AN [email protected] VIA GMAIL" lauten?
Cameron Hudson
1

Sie können den Befehl 'email' oder 'emailx' verwenden.

(1) $ vim /etc/mail.rc # oder # vim /etc/nail.rc

set from = xxx@xxx.com #
set smtp = smtp.exmail.gmail.com #gmail's smtp server 
set smtp-auth-user = xxx@xxx.com #sender's email address
set smtp-auth-password = xxxxxxx #get from gmail, not your email account passwd
set smtp-auth=login

Denn wenn es nicht von einem autorisierten Konto gesendet wird, wird die E-Mail an die Junk-Mail-Liste gesendet.

(2) $ echo "Bitte denken Sie daran, nicht verwendete Themen zu entfernen!" | mail -s "Abfallthemen" -a a.txt [email protected] #senden an Gruppenbenutzer '[email protected]'

TINGTING WANG
quelle