Jak wysłać pocztę za pomocą wiersza poleceń

9

Mam polecenie cron, które uruchamia plik i próbuję skonfigurować dane wyjściowe, aby wysyłały mi e-maile. Używam tego ze skryptami innych firm, że nie chcę modyfikować plików bezpośrednich, więc muszę modyfikować dane wyjściowe zamiast modyfikować PHP.

Przeprowadzam migrację z serwera używającego mailna serwer używający sendmail. Próbuję dowiedzieć się, jak prawidłowo wysłać temat do sendmaila za pomocą wiersza polecenia.

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" [email protected]
Webnet
źródło
sendmailto plik binarny używany przez system do kierowania poczty przesyłanej do niego przez mail. Jest częścią pakietu programów takich jak sendmail , postfix , exim i tak dalej. Musisz więc zainstalować odpowiedni pakiet dla poczty . Więc powiedz nam, której dystrybucji używasz.
adamo
Wszystkie formy UNIX / Linux zgodne z POSIX powinny zapewniać niektóre pliki wykonywalne o nazwie „sendmail” i przyjmować określony zestaw opcji, które są kompatybilne z podzbiorem funkcji sendmaila (w tym opcja -t, opisana w odpowiedzi z dnia dzisiejszego poniżej). Exim, Postfix i qmail to wszystko - czasami będą instalowane pod / usr / libexec / sendmail, a nie na przykład / usr / bin lub / usr / sbin.
Jim Dennis

Odpowiedzi:

3

/ usr / sbin / sendmail

To jest źle.

Powinieneś mieć mailkomendę gdzieś. Można to nazwać mailx. Powinien być w /bin/katalogu. Zgodnie ze standardową praktyką skrypty php nigdy nie powinny wywoływać niczego w /sbinlub /usr/sbin. Programy sbin są zazwyczaj przeznaczone do rootowania.

Ponadto php ma wbudowaną funkcję poczty .

Ablackhat
źródło
Jeśli nie jest maillub mailxmoże być Mail. Ale nawet jeśli nie istnieją, możesz zainstalować mutt i uruchomić, mutt -xktóry emuluje mailx.
adamo
To prawda ... aby ustalić moją ścieżkę, pobiegłem which maili wróciła /bin/mail.
Webnet,
2
sendmail to lepsze podejście (jest to standard Posix) ... ale lepiej jest użyć sendmail -t (pobierz nagłówki ze strumienia wejściowego). Pozwala to uniknąć wielu możliwych luk w interpolacji zmiennych powłoki, umożliwiając programowi wysyłanie poczty do interakcji tylko z narzędziem sendmail, bez wywoływania jakiejkolwiek powłoki). Zobacz „odpowiedź dnia”, aby uzyskać więcej szczegółów.
Jim Dennis
13

Na moich systemach Debiana (które mają Exima zamiast „prawdziwego” sendmaila, ale nadal mają binarny sendmail dla kompatybilności), kiedy chcę wysłać pocztę ze skryptu, robię coś równoważnego:

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

This is a test message
EOF

Pamiętaj, że pusta linia jest ważna.

czas
źródło
1
Pusty wiersz służy do oddzielenia części nagłówka wiadomości od treści wiadomości. Dlaczego nie sendmail -t <<EOF?
adamo
@adamo: Ponieważ było bliżej wzorca w pierwotnym pytaniu, aby przesyłać do sendmaila za pomocą „|” (i w rzeczywistości miejsca, w których to robię, to na ogół coś takiego jak generate_test_message.sh | sendmail -t).
dnia
2
Jest to kanoniczne podejście do bezpiecznego programowego wysyłania poczty w systemie UNIX.
Jim Dennis
w końcu dostałem działający przykład dla sendmaila! Dziękuję Ci!
insidepower
jeśli sendmailmiałby się nie powieść i napisać do STDERR, jak mógłbym uchwycić to jako zmienną do późniejszego użycia w skrypcie?
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 = treść wiadomości e-mail.
sed stuff = Stosuje nagłówki wiadomości e-mail i ważną podwójną linię między treścią a nagłówkami.
sendmail -t = Potokuje bezpośrednio przez sendmail.

Praveen R.
źródło
-1
php -f file.php 2>&1 | sed 's/^/To: [email protected]\nSubject: My Test Email Subject\n\n/' | sendmail -t
Bernstein
źródło
1
Cześć, witamy w Server Fault. Być może mógłbyś nieco rozwinąć swoją odpowiedź?
slm