Mam bardzo prosty proces procmail, który pobiera wiadomość e-mail i przekierowuje ją do skryptu:
LOGFILE=/home/foo/procmail-log
VERBOSE=yes
MAILDIR=/var/spool/mail/foo
DEFAULT=/var/spool/mail/foo
SHELL=/bin/sh
:0
! `/home/foo/scripts/blah/blah.sh`
Skrypt powłoki ma warunek, który greps pliku dla adresu e-mail nadawcy, a jeśli go znajdzie, kończy działanie:
grep i "$SENDER" /home/foo/scripts/blah/blah2.txt
if [[ $? -eq 0 ]] ; then
exit 1
fi
Kiedy tak się stanie, chcę, aby procmail po prostu porzucił / odrzucił wiadomość.
Co ciekawe, jeśli to się uruchomi, procmail przyjmuje wartość, którą właśnie grepowałem, i próbuję wysłać na nią wiadomość e-mail.
W dzienniku procmail widzę:
procmail: Notified comsat: "foo@:/usr/sbin/sendmail -oi [email protected] [email protected]"
From [email protected] Thu Feb 6 22:31:47 2014
Subject: Test
Folder: /usr/sbin/sendmail -oi [email protected] sender 3165
procmail: Executing "/usr/sbin/sendmail,-oi,[email protected],[email protected]"
Dlaczego to robi? Czy jest jakiś sposób, aby skonfigurować procmail, aby tego nie robił? Chcę tylko, żeby zrezygnował i upuścił wcześniej przetwarzany e-mail. Próbowałem różnych kodów wyjścia (0, 1, 77), ale procmail zawsze robi to samo. Jakieś pomysły?
Odpowiedzi:
Procmail dokłada wszelkich starań, aby poczta nie została utracona nawet w przypadku niepowodzenia dostawy. Zgodnie z informacją
man procmail
e-mail zostanie odesłany do nadawcy w ostateczności:Istnieje jednak zmienna środowiskowa, którą można ustawić tak, aby poczta była odrzucana, a nie odrzucana:
źródło
Sprawdźmy twoje działanie:
Znaczenie backticks to „użyj danych wyjściowych
script
jako ciąg znaków tutaj”. Więc jeśli twój skrypt wyjdzie,[email protected]
to przepis będzie faktycznie równoważnyco oznacza przekazanie wiadomości do
[email protected]
. Zachowanie, które opisujesz, nie powinno być w ogóle zaskakujące; Procmail robi dokładnie to, co mu każesz.Jeśli po prostu chcesz całkowicie odrzucić wiadomość, jeśli skrypt zwraca sukces, możesz wypróbować tę sztuczkę:
Jest to w zasadzie taki sam jak
formail -D
przykład tłumienia duplikatów ; jeśli skrypt zwróci status wyjścia pomyślnego, wiadomość zostanie uznana za dostarczoną; ale ponieważ skrypt nie dostarcza go nigdzie, tak naprawdę został utracony. (Oczywiście będziesz musiał zmienić logikę skryptu, aby kod wyjściowy był odwrotnością tego, co jest teraz).Jeśli chcesz uporządkować składnię za Ciebie, oto ogólniejsza próba zrobienia tego, co wydaje ci się, że robisz:
który przekaże dalej,
somewhere
jeśli kod wyjściascript
wynosi zero (jak w przypadku sukcesu); lub ewentualnie(Istnieje tutaj kilka tajemniczych szczegółów nietypowej składni Procmaila.
??
Operand sprawdza wartość nazwanej zmiennej;^^
kotwica dopasowuje początek / koniec łańcucha wejściowego.)Jeśli twój skrypt nie jest bardziej skomplikowany, równie dobrze możesz go wstawić. (Zwróć uwagę na poprawkę składni z myślnikiem przed
i
opcją i odwrócenie statusu wyjścia za pomocą!
):źródło