So senden Sie Mail über die Befehlszeilenleitung

9

Ich habe einen Cron-Befehl, der eine Datei ausführt, und ich versuche, die Ausgabe so einzurichten, dass sie mir eine E-Mail sendet. Ich verwende dies mit Skripten von Drittanbietern, bei denen ich die direkten Dateien nicht ändern möchte. Daher muss ich die Ausgabe weiterleiten, anstatt das PHP zu ändern.

Ich migriere von einem Server, der verwendet, mailzu einem Server, der verwendet sendmail. Ich habe Probleme herauszufinden, wie ein Betreff über eine Befehlszeile ordnungsgemäß an sendmail gesendet werden kann.

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" [email protected]
Webnet
quelle
sendmailist die Binärdatei, die von Ihrem System verwendet wird, um E-Mails weiterzuleiten, die von an gesendet werden mail. Es ist Teil einer Reihe von Programmen wie sendmail , postfix , exim und so weiter. Sie müssen also das entsprechende Paket für Mail installieren . Teilen Sie uns also die von Ihnen verwendete Linux-Distribution mit.
Adamo
Alle POSIX-kompatiblen Formen von UNIX / Linux sollten eine ausführbare Datei mit dem Namen "sendmail" bereitstellen und eine bestimmte Reihe von Optionen verwenden, die mit einer Teilmenge der Funktionen von sendmail kompatibel sind (einschließlich der Option -t, die in der Antwort von timday unten beschrieben wird). Exim, Postfix und qmail bieten diese - manchmal werden sie beispielsweise unter / usr / libexec / sendmail anstatt unter / usr / bin oder / usr / sbin installiert.
Jim Dennis

Antworten:

3

/ usr / sbin / sendmail

Das ist falsch.

Sie sollten einen mailBefehl haben, wo. Es könnte genannt werden mailx. Sollte im /bin/Verzeichnis sein. In der Regel sollten PHP-Skripte niemals etwas in /sbinoder aufrufen /usr/sbin. Die sbin-Programme sind normalerweise für root.

Außerdem verfügt PHP über eine integrierte Mail-Funktion .

ablackhat
quelle
Wenn es nicht ist mailoder mailxsein kann Mail. Aber selbst wenn diese nicht existieren, können Sie mutt installieren und ausführen, mutt -xwas emuliert mailx.
Adamo
Dies ist wahr ... um meinen Weg zu bestimmen, rannte ich which mailund er kehrte zurück /bin/mail.
Webnet
2
sendmail ist der bessere Ansatz (es ist ein Posix-Standard) ... aber es ist besser, sendmail -t zu verwenden (die Header aus dem Eingabestream übernehmen). Dies vermeidet viele mögliche Schwachstellen bei der Interpolation von Shell-Variablen, indem das Programm, das E-Mails sendet, nur mit dem Dienstprogramm sendmail interagieren kann, ohne überhaupt eine Shell aufzurufen. Weitere Informationen finden Sie in der Antwort "timday's".
Jim Dennis
13

Wenn ich auf meinen Debian-Systemen (die Exim anstelle von "echtem" sendmail haben, aber aus Kompatibilitätsgründen immer noch eine sendmail-Binärdatei haben) E-Mails von einem Skript aus senden möchte, mache ich etwas, das dem entspricht:

cat <<EOF | sendmail -t
To: [email protected]
Subject: Testing
From: [email protected]

This is a test message
EOF

Beachten Sie, dass die leere Zeile wichtig ist.

timday
quelle
1
Die leere Zeile wird verwendet, um den Kopfteil einer Nachricht vom Nachrichtentext zu trennen. Warum aber nicht sendmail -t <<EOF?
Adamo
@adamo: Weil es näher an dem Muster in der ursprünglichen Frage lag, mit '|' in sendmail zu leiten. (und an den Orten, an denen ich das selbst mache, ist es im Allgemeinen so etwas wie generate_test_message.sh | sendmail -t).
Tag
2
Dies ist der kanonische Ansatz für das sichere Versenden programmatischer E-Mails unter UNIX.
Jim Dennis
endlich ein funktionierendes Beispiel für sendmail! Danke!
Insidepower
Wenn das sendmailfehlschlagen und in STDERR schreiben würde, wie könnte ich dies als Variable erfassen, die später im Skript verwendet werden soll?
Streetster
1
echo -e "This is my body\nSecond line" 2>&1 | sed '1!b;s/^/To: [email protected]\nSubject: My Test Email Subject\n\n/' | sendmail -t

echo = Der Text der E-Mail.
sed stuff = Wendet die E-Mail-Header und wichtige doppelte Zeilen zwischen Text und Headern an.
sendmail -t = Leitet es direkt über sendmail weiter.

Praveen R.
quelle
-1
php -f file.php 2>&1 | sed 's/^/To: [email protected]\nSubject: My Test Email Subject\n\n/' | sendmail -t
bernstein
quelle
1
Hallo und willkommen bei Server Fault. Vielleicht könnten Sie Ihre Antwort etwas näher erläutern?
Slm