Jak skonfigurować Postfiks, aby przesyłać wszystkie przychodzące wiadomości e-mail do skryptu?

24

Korzystając z Postfix, chciałbym, aby wszystkie wiadomości przychodzące na dowolny adres (w tym te, które nie były mapowane na lokalnych użytkowników) były przesyłane potokowo do skryptu. Próbowałem skonfigurować mailbox_commandw /etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

Działa to świetnie, jeśli użytkownik jest użytkownikiem lokalnym, ale kończy się niepowodzeniem w przypadku „nieznanych” użytkowników, którzy nie mają aliasów. Próbowałem ustawić luser_relayużytkownika lokalnego, ale to uprzedza mailbox_command, więc polecenie się nie uruchamia. Próbowałem ustawić local_recipient_maps=(pusty ciąg znaków), ale wiadomość jest nadal odsyłana (nieznany użytkownik).

Czy istnieje magiczne wywołanie, którego mogę użyć, aby zachęcić wszystkich znanych i nieznanych użytkowników do przejścia do skryptu?

Pełne /etc/postfix/main.cfśledzenie - jest to domyślny Ubuntu 10.04, z wyjątkiem mailbox_commandwiersza:

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = ... snip ...
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = sassafras, ... snip ...,localhost.localdomain, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

mailbox_command = /path/to/my/script.py
użytkownik67641
źródło
Co potem po skrypcie? To brzmi jak czynność skanerów antywirusowych i filtrów antyspamowych. Może znajdziesz przewodnik na temat konfigurowania jednego z nich i wykorzystania jego konfiguracji w skrypcie?
DerfK
Wiadomości trafiają do aplikacji internetowej. Po skrypcie: baza danych, inne przetwarzanie, inne rzeczy, ale nie zwykłe wiadomości e-mail. Kluczowym pytaniem jest sprawienie, by nieznani użytkownicy nie odrzucali się - jest to poza normalnym scenariuszem wirus / spam, w którym odsyłano by niezmapowanych użytkowników.
user67641
@ user67641 Witam, czy muszę wstrzykiwać pocztę do Postfiksa w moim skrypcie lub dodając kilka wierszy w master.cf
merveotesi

Odpowiedzi:

32

Ok, właśnie uruchomiłem to - choć bardziej fryzjerskie, niż się spodziewałem. Upuściłem maildir_commandczęść i poszedłem transport_maps. Kluczem jest zrobienie 5 rzeczy:

  1. Skonfiguruj plik db do obsługi aliasów (i dodaj alias catch-all)
  2. Skonfiguruj plik db, aby zamapować „transport” dla danej domeny na specjalny moduł obsługi.
  3. Skompiluj pliki db do formatu db berkeley db, którego chce postfiks.
  4. Skonfiguruj moduł obsługi /etc/postfix/master.cfdo przesyłania wiadomości e-mail do skryptu.
  5. Ustaw /etc/postfix/main.cfużycie bazy danych transportu dla transport_mapsi aliasu bazy danych dla virtual_alias-maps.

(1) Utwórz, /etc/postfix/virtual_aliasesaby dodać alias catch-all - localusermusi być istniejącym użytkownikiem lokalnym:

@mydomain.tld   [email protected]

(2) Utwórz, /etc/postfix/transportaby dodać mapowanie transportu. „mytransportname” może być czymkolwiek chcesz; jest używany poniżej w master.cf:

mydomain.tld    mytransportname:

(3) Następnie, zarówno transporti virtual_aliasesmuszą być kompilowane do plików Berkeley DB:

$ sudo postmap /etc/postfix/virtual_aliases
$ sudo postmap /etc/postfix/transport

(4) Dodaj transport do /etc/postfix/master.cf:

mytransportname   unix  -       n       n       -       -       pipe
  flags=FR user=localuser argv=/path/to/my/script.py
  ${nexthop} ${user}

(5) W /etc/postfix/main.cf:

  ...
  transport_maps = hash:/etc/postfix/transport
  virtual_alias_maps = hash:/etc/postfix/virtual_aliases

I ... dobrze iść! Do licha.

użytkownik67641
źródło
1
niezwykle przydatna odpowiedź
merveotesi
1
Wirtualne mapy aliasów nie są potrzebne. Możesz to zrobić za pomocą relay_domains(w takim przypadku plik transportowy może filtrować na podstawie rzeczywistego adresu Do:).
Brilliand
Odkryłem, że możesz przekierowywać całą wirtualną pocztę do skryptu za pomocą virtual_transport = mailcaptcha:in main.cfi mailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}in master.cf. Zobacz postfix.org/transport.5.html i postfix.org/VIRTUAL_README.html .
Chloe
(4) powinno znajdować się w jednej linii, prawda? Również nie wymagać postfix restartlub reloadczy coś takiego? Ostatnia rzecz: czy istnieje plik dziennika, aby zobaczyć maile, które przybyły do ​​Postfiksa?
Basj
@Basj, plik dziennika to /var/log/mail.log.
fiedl
4

Jedynym razem, gdy użyłem czegoś takiego, była skrzynka pocztowa konkretnego użytkownika. Wszystko, co było wymagane, to alias nazwy tego użytkownika do potoku i proces w aliasach:

pong: „| /usr/local/bin/gotit.pl”

To wysłało ruch przeznaczony dla „[email protected]” do skryptu perla, który napisałem, aby go przetworzyć.

gotit.pl (jako przykład, nie wybieraj mnie za kiepskie umiejętności programistyczne = =). Zadanie polegało na przetworzeniu wiadomości e-mail wysłanej na nasz serwer Exchange (na którą została udzielona automatyczna odpowiedź za pomocą kodu VB) w celu sprawdzenia, czy Exchange przetwarza wiadomości e-mail w odpowiednim czasie. Jeśli nie, serwer pocztowy wyśle ​​wiadomość e-mail z ostrzeżeniem do naszych pagerów i napisze plik blokady, abyśmy nie byli ciągle spamowani.

#! /usr/bin/perl -w
use vars qw ( $mung $sent $tvalue $remainder $delta $fout );
$mung = time;
while (<STDIN>) {
    ($sent, $tvalue, $remainder ) = split /: /, $_, 3;
    $tvalue =~ s/(\D+)//g;
    chomp($tvalue);
    $delta = $mung-$tvalue;
    if ( $sent =~ "Sent" ) {
        $fout = "/var/spool/mailcheck/$tvalue";
        next unless ( -e $fout );
        open (TMP, "> $fout") or die "Couldn't open output file: $!\n";
        print TMP "Received in: $delta seconds.\n";
                close TMP;
        last;
    }
}
Greeblesnort
źródło
Tak, po prostu przekieruj @ mydomain.tld do ponga, a wszystkie przychodzące main dla mydomain.tld zostaną potokowane.
Zaar Hai,
a dla tych z nas, którzy używają wielu domen wirtualnych, nie zapomnij przekierować go do pong @ localhost, aby nie dołączał domyślnej nazwy domeny do aliasu
therightstuff
0

Użyłem „płaskiego pliku” w starym stylu, Mailboxaby odbierać całą pocztę (a następnie przycinać ją co kilka godzin, jeśli jest duża), zamiast używać nowoczesnych maildir/folderów do przetwarzania poczty za pomocą skryptów. Mógłbyś też uruchomić plik logrotate na pliku. Przypuszczam, że można go zarządzać.

W ten sposób możesz po prostu skopiować całą pocztę do skrzynki pocztowej jako użytkownik lokalny.

Jonathan Ross
źródło
0

Po wielu problemach z głowami stworzyłem to rozwiązanie w oparciu o kilka różnych źródeł, co spowodowało o wiele mniej wysiłku, krytyczne kroki zostały skonfigurowane, virtual_alias_domainsa także virtual_alias_mapsupewniając się, że wirtualne mapowanie było po my-alias@localhostprostu my-alias. W moim przykładzie alias polecenia polega na potokowaniu wiadomości e-mail do punktu końcowego interfejsu API witryny, ale równie dobrze może potokować do czegoś innego.

Oto kroki, które musisz podjąć:

  • Skonfiguruj rekordy A i MX dla swojej domeny, rekord A @ wskazujący adres IP serwera, na którym będziesz otrzymywać e-maile, i MX z nazwą hosta @ i wartością 10 mail.your-domain-name
  • sudo apt-get install postfix
  • Wybierz „Witryna internetowa” i wprowadź nazwę swojej domeny (pełna kwalifikacja)
  • sudo vi /etc/postfix/main.cf
  • Dodaj mail.your-domain-name do listy mydestinationwartości
  • Dodać
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

do końca pliku

  • sudo apt-get vi /etc/aliases
curl_email: "|curl --data-binary @- http://your-domain-name/email"
  • sudo newaliases
  • sudo apt-get vi /etc/postfix/virtual_domains
example.net   #domain
example.com   #domain
your-domain-name   #domain

(pola #domain pomijają ostrzeżenia)

  • sudo postmap /etc/postfix/virtual_domains
  • sudo apt-get vi /etc/postfix/virtual
info@your-domain-name [email protected]
everyone@your-domain-name [email protected] [email protected]
email_processor@your-domain-name curl_email@localhost
@your-domain-name [email protected]
[email protected] [email protected]
  • sudo postmap /etc/postfix/virtual
  • sudo /etc/init.d/postfix reload
prawo
źródło