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" test@email.com

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 .


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: recipient@example.com
Subject: Testing
From: sender@example.com

This is a test message
EOF

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


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: test@email.com\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.


-1
php -f file.php 2>&1 | sed 's/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

1
Cześć, witamy w Server Fault. Być może mógłbyś nieco rozwinąć swoją odpowiedź?
slm
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.