Dlaczego procmail wysyła kopię wiadomości przychodzącej do nadawcy, jeśli napotka kod wyjścia?

3

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?

Mike B.
źródło
Niezwykle niejasne jest to, co tak naprawdę próbujesz osiągnąć. Czy mógłby Pan wyjaśnić, jakie działania powinien podjąć Procmail?
tripleee

Odpowiedzi:

3

Procmail dokłada wszelkich starań, aby poczta nie została utracona nawet w przypadku niepowodzenia dostawy. Zgodnie z informacją man procmaile-mail zostanie odesłany do nadawcy w ostateczności:

   ORGMAIL     Usually  the system mailbox (ORiGinal MAIL‐
               box).  If, for some  obscure  reason  (like
               `filesystem  full')  the  mail could not be
               delivered, then this mailbox  will  be  the
               last resort.  If procmail fails to save the
               mail in here (deep, deep trouble :-),  then
               the mail will bounce back to the sender

Istnieje jednak zmienna środowiskowa, którą można ustawić tak, aby poczta była odrzucana, a nie odrzucana:

   DELIVERED   If set to `yes' procmail will  pretend  (to
               the  mail  agent)  the mail has been deliv‐
               ered.  If mail cannot  be  delivered  after
               having  met this assignment (set to `yes'),
               the mail will be lost (i.e.,  it  will  not
               bounce).
John1024
źródło
0

Sprawdźmy twoje działanie:

:0
! `script`

Znaczenie backticks to „użyj danych wyjściowych scriptjako ciąg znaków tutaj”. Więc jeśli twój skrypt wyjdzie, [email protected]to przepis będzie faktycznie równoważny

:0
! [email protected]

co 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ę:

:0W
| script

Jest to w zasadzie taki sam jak formail -Dprzykł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:

:0
? script
! somewhere

który przekaże dalej, somewherejeśli kod wyjścia scriptwynosi zero (jak w przypadku sukcesu); lub ewentualnie

# Capture the output from script in WHERE
WHERE=`script`
# Also capture its exit code
ERR=$?

# Forward to $WHERE if $ERR is zero
:0
* ERR ?? ^^0^^
! $WHERE

(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 iopcją i odwrócenie statusu wyjścia za pomocą !):

:0
* ! ? grep -i "$SENDER" /home/foo/scripts/blah/blah2.txt
! somewhere
potrójny
źródło