2009-02-17 20 views
10

Mam dość typowe wymagania dla procmaila, ale nie jestem w stanie uzyskać wyników w jakiś sposób. Mam plik procmailrc z tej treści:Chcesz, aby procmail uruchamiał niestandardowy skrypt python, za każdym razem, gdy pojawia się nowa poczta

:0 
* ^To.*@myhost 
| /usr/bin/python /work/scripts/privilege_emails_forward.py 

Gdzie mój skrypt niestandardowy python (privilege_emails_forward.py) będzie skanowanie za pośrednictwem wiadomości e-mail aktualnie odbieranego i zrobić kilka operacji na zawartości poczty. Ale nie jestem w stanie sprawić, aby skrypt został wykonany przy pierwszym ujęciu (nie wspominając o skanowaniu zawartości wiadomości).

  • Czy jest to właściwy sposób wywołania zewnętrznego programu (python), gdy tylko pojawi się nowa wiadomość?
  • I jak mój program Pythona (privilege_emails_forward.py) otrzyma pocztę jako dane wejściowe? Mam na myśli jako sys.argv lub stdin ????

Odpowiedz

11

To jest po prostu w porządku, po prostu umieścić fw:0 (:0 fw). Twój program python otrzyma pocztę na stdin. Musisz "echo" ewentualnie przekształconej poczty na stdout.

fw oznacza

  • f że potok jako filtr.
  • w Zaczekaj, aż filtr lub program się zakończy i sprawdź jego kod (zwykle ignorowany); jeśli filtr się nie powiedzie, tekst nie zostanie przefiltrowany.

Mój kontroler SPAM (bogofilter) po prostu działa w ten sposób. Dodaje nagłówki, a później reguły procmail robią coś w zależności od tych nagłówków.

+0

Próbowałem też. Ale nadal to nie działa Nie wiem dlaczego :(Oto mój skrypt procmailrc: : 0 fw * ^To.*@myhost |/usr/bin/python /work/scripts/privilege_emails_forward.py –

+0

spróbuj VERBOSE = yes i spójrz na plik dziennika procmail, być może zauważysz błąd! –

+0

Johannes! Ponieważ to pole tekstowe komentarza nie wystarcza do wydrukowania danych wyjściowych dziennika procmaila, podałem dane wyjściowe jako ANSWER. –

5

log excerpt wyraźnie stwierdza, że ​​twój skrypt jest wykonywany, nawet jeśli nie pokazuje pożądanego efektu. Spodziewam się, że procmail zarejestruje błąd, jeśli wykonanie się nie powiedzie.

W każdym razie upewnij się, że użytkownik (uid), z którego procmail jest wykonywany ma odpowiednie uprawnienia do wykonania skryptu. Drut skrypt do procmail tylko jeśli udało testy z czymś takim (zastąpić „procmail” z prawidłowym UID):

 
# sudo -u procmail /bin/sh -c '/bin/cat /work/scripts/mail.txt | /usr/bin/python /work/scripts/privilege_emails_forward.py' 

zależności od konfiguracji sudo, trzeba by uruchomić to jako root. Aha i upewnij się, że używasz bezwzględnych ścieżek plików.

+0

Niesamowita papryka! Próbowałem uruchomić skrypt, który dałeś z procmailem zamienionym na webmail (cur wynajęcia użytkownika), Mój skrypt został wykonany. Ale kiedy otrzymam pocztę (czy to od kogokolwiek), mój procmail uruchamia procmailrc, prawda? Więc kto będzie właściwym użytkownikiem do uruchomienia skryptu? –

+0

Papryka! Aby wyjaśnić jednoznacznie, mój niestandardowy skrypt python ma wystarczające uprawnienia (777), wciąż nie jest wykonywany automatycznie po otrzymaniu wiadomości –

+1

Aby dowiedzieć się, z jakiego użytkownika uruchamiany jest twój skrypt procmail, zamień wiersz skryptu w swoim procmailrc na następujący: "|/usr/bin/id -un>/tmp/procmailuser "Don" zapomina o symbolu rury z przodu! Następnie sprawdź, czy "cat/tmp/procmailuser" powinien ujawnić użytkownika. – paprika