Jak skonfigurować Postfix do przechowywania wiadomości e-mail w pliku zamiast przekazywania?

9

Chcę uruchomić kopię tymczasową serwera produkcyjnego w środowisku lokalnym. W systemie działa aplikacja PHP, która wysyła wiadomości e-mail do klientów w różnych scenariuszach i chcę się upewnić, że żadna wiadomość e-mail nigdy nie zostanie wysłana ze środowiska testowego.

Mogę dostosować kod, aby używał fałszywego nadawcy wiadomości e-mail, ale chciałbym uruchomić dokładnie ten sam kod, co w środowisku produkcyjnym. Mogę użyć innego MTA (Postfix to po prostu to, czego używamy w produkcji), ale chciałbym czegoś, co można łatwo skonfigurować pod Debian / Ubuntu :)

Tak więc chciałbym skonfigurować lokalną instalację Postfix do przechowywania wszystkich wiadomości e-mail w (jednym lub więcej) plikach zamiast ich przekazywania. Właściwie to nie obchodzi mnie, jak są przechowywane, o ile możliwe jest sprawdzenie wysłanej wiadomości e-mail. Działałaby nawet opcja konfiguracji, która mówi postfixowi, aby zachować pocztę e-mail w kolejce pocztowej (mogę wyczyścić kolejkę, gdy ponownie załaduję serwer pomostowy kopią z produkcji).

Wiem, że jest to możliwe, po prostu nie znalazłem żadnego dobrego rozwiązania online, które wydaje się być dość powszechną potrzebą.

Dzięki!

GomoX
źródło

Odpowiedzi:

12

Utworzyłem nowy transport za pomocą polecenia potoku, które zapisuje wiadomości e-mail w pliku.

Gruntownie:

  1. Utwórz użytkownika, który będzie właścicielem wiadomości e-mail (lub użyje istniejącego). Zadzwoniłem do mnieemail
  2. mkdir /home/email/bin
  3. Umieść następujący skrypt w /home/email/bin/mail_eater(używa PHP, ale możesz napisać własną wersję w dowolnym języku, który lubisz, po prostu dołącza stdin do pliku):

    #!/usr/bin/php
    <?php
    $fd = fopen("php://stdin", "r");
    $email = "";
    while (!feof($fd)) {
        $email .= fread($fd, 1024);
    }
    fclose($fd);
    $fh = fopen('/home/email/email.txt','a');
    fwrite($fh, $email."\n-------------------------------------------------------\n\n");
    fclose($fh);
    
  4. chmod a+x /home/email/bin/mail_eater
  5. touch /home/email/email.txt
  6. chmod a+r /home/email/email.txt
  7. Utwórz nowy transport przy użyciu tego pliku, dodając następujący wiersz w master.cf:

    file_route unix -    n    n    -    -    pipe user=email  argv=/home/email/bin/mail_eater
    
  8. Użyj tego jako domyślnego transportu w main.cf:

    default_transport = file_route
    

Tam :)

GomoX
źródło
3

Można umieścić te domeny do $mydestinationIN main.cf, więc postfix będzie go dostarczyć lokalnie.

Możesz skonfigurować różnych lokalnych użytkowników, jeśli chcesz lub możesz skonfigurować lokalny adres typu catch-all, aby dostarczać e-maile tylko do jednego konta, więcej szczegółów tutaj: http://www.postfix.org/ADDRESS_REWRITING_README.html#luser_relay

Dla wszystkich domen:

mydestination = pcre:/etc/postfix/mydestinations

i /etc/postfix/mydestinationspowinien zawierać

/.*/    ACCEPT

Nie mogę teraz przetestować, ale powinno działać.

Laurentiu Roescu
źródło
Nie wiem, jak wyglądają domeny docelowe (pochodzą z prawdziwej bazy danych klientów). Sprawdzę jednak link.
GomoX
Dzięki za aktualizację, opublikowałem własne rozwiązanie problemu, ponieważ wydaje się ono „czystsze”, ale wygląda na to, że powinno również działać.
GomoX
Aby działać zgodnie z przeznaczeniem, wymaga to również ustawienia local_recipient_maps = . Jest to opisane w linku, który podałeś, ale myślę, że należy to również wspomnieć w odpowiedzi.
jojman
2

try (w main.cf):

defer_transports = smtp

możesz wtedy zobaczyć kolejkę postqueue -pi oglądać zawartość za pomocąpostcat

Arek B.
źródło
0

W zależności od dystrybucji możesz spojrzeć na „nullmailer”. Jest to przekaźnikowy MTA, który przekazuje do innego SMTP w sieci lub zdalnie. Może to być bardzo nieprawidłowy SMTP, w takim przypadku prawdopodobnie umieściłby go tylko w kolejce w folderze na komputerze.

W debian i ubuntu jest to dostępne jako zamiennik MTA dla twojego systemu.

jishi
źródło
0

Jest to skopiowane i nieco zmodyfikowane z mojego bloga http://blog.malowa.de/2011/04/postfix-as-spam-trap-server.html :

Nie musisz nawet konfigurować Postfix, aby działał jako nullmailer. Postfix jest dostarczany ze zgrabnym narzędziem o nazwie, smtp-sinkktóre załatwia sprawę. smtp-sink ma głównie służyć jako narzędzie testowe dla klientów SMTP, którzy potrzebują serwera do zabawy. Możesz więc skonfigurować go tak, aby rejestrował całą rozmowę, a nawet zrzucał każdą otrzymaną wiadomość do pliku. Ten ostatni jest potrzebny dla nullmailera.

Nie ma pliku konfiguracyjnego do skonfigurowania smtp-sink. Wszystko odbywa się za pomocą opcji wiersza polecenia.

smtp-sink -c -d "%Y%m%d%H/%M." -f . -u postfix -R /tmp/ -B "550 5.3.0 The recipient does not like your mail. Don't try again." -h spamtrap.example.com 25 1024

Przyjrzyjmy się bliżej każdemu parametrowi.

-u postfix
Runs the program under the user "postfix"
-R /tmp/
Sets the output directory to /tmp/. In this directory the mails will be stored. If you have a high spam volume (hundreds of Spam per minute) it is recommended to write the mails to a ramdisk
-d "%Y%m%d%H/%M."
Writes the mail to a directory of the format "YearMonthDayHour" and in this directory the files are name "Month.RandomID". Note that the dates are in UTC
-c
Write statistics about connection counts and message counts to stdout while running
-f .
Reject the mail after END-OF-DATA. But the mail will be saved. Cool, isn't it?!
-B "550 5.3.0 The recipient does not like your mail. Don't try again"
This is the rejection message after END-OF-DATA.
-h spamtrap.example.com
Announce the hostname spamtrap.example.com
25
The port to listen on. Can be prepended with an IP or host if you want to bind on a special interface.
1024
The backlog count of connections that can wait in the TCP/IP stack before they get a free slot for sending mail.

Możesz znaleźć więcej informacji na stronie podręcznika smtp-sink, ale są one ważne, aby uruchomić pułapkę spamu typu catch-all. W tej konfiguracji program akceptuje dowolną pocztę o dowolnym rozmiarze od dowolnego nadawcy do dowolnego odbiorcy z IPv4 i IPv6. Jedynymi ograniczeniami jest to, że możliwe jest tylko 256 jednoczesnych połączeń z 1024 połączeniami w kolejce, a program jest oznaczony jako eksperymentalny. Więc nie używaj smtp-sink w środowisku produkcyjnym.

Opcja -B jest poprawna tylko w nowszych wersjach Postfix. W 2.7.1 brakuje. W 2.8.2 jest obecny. Gdzieś pomiędzy tym został wprowadzony.

mailq
źródło