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.