Postfix i fetchmail - jak ożenić?

Mam postawionego postfixa który wysyła pocztę przez relayhosta. Działa. Pobieranie poczty zrobiłem przez fetchmaila. Też działa. Potrzebuję jednak funkcjonalności automatycznego dodawania bcc do pobranej poczty przez fetchmaila. always_bcc w main.cf działa tylko wtedy gdy Postfix obsługuje kolejkę poczty od początku do końca, natomiast gdy korzystam z postfix lda to always_bcc nie wyłapuje tej poczty i nie przesyła kopii. Zgodnie z manualem “automatic BCC recipients are not generated for mail that Postfix forwards internally”. Jak zmusić postfixa albo fetchmaila do robienia kopii pobranej poczty z zewnętrznego serwera?

Tak bezpośrednio jak chcesz to się chyba nie da, ale możesz w fetchmailu jako mda podpiąć własny skrypt, który oryginalą wiadomość wrzuci do INBOXa i w miejsce, gdzie miałoby być BCC, a jeśli BCC idzie na zdalny serwer to wrzuci to do postfixa. Być może da się to uzyskać procmailem albo maildropem automatycznie, nie pamiętam, bo nie używałem tych narzędzi od kilku lat.

Ok, myślałem że jest na to jakieś gotowe rozwiązanie, wolę unikać rzeźby, ale jak nie będzie innego wyjścia… Wolałbym aby został fetchmail jako program do odbioru poczty bo jest do niego przyjemna wtyczka do roundcube do konfiguracji “per user”.

Fetchmail może zostać. W jego pliku konfiguracyjnym wskazujesz swój skrypt jako mda, który realizuje co co chcesz zrobić.

Ok, jako parametr mda mam teraz:
mda “/usr/lib/dovecot/deliver -m ${mailbox} -d ${src_user}”
W jaki sposób przekazać dodatkowy adres email do przesłania kopii? Mógłbym to polecenie wydać dwukrotnie z tym że drugie wywołanie dostanie stały mailbox i user. Ale czy kolejka poczty nie zostanie opróżniona przez pierwsze polecenie deliver i kolejne jego wywołanie nie będzie miało czego już kopiować? Niestety, nie mogę znaleźć na ten temat informacji a doświadczenia w tym jeszcze nie mam.

Sprawdź czy program deliver potrafi przekazać pocztę na 2 skrzynki, z głowy nie powiem o poszukać możesz sam. Jeśli nie potrafi, to wstaw w mda swój skrypt bashowy, który najpierw zapisze wiadomość do jakiegoś tymczasowego pliku (mktemp) albo zapisze w zmiennej i wywołaj na nim deliver 2 razy z różnymi wartościami -d.

Dzięki. Będę próbował. Nie wiem tylko co i jak w parametrze mda mam przekierować aby utworzyć plik tymczasowy z zawartością emaila i czy później proste wczytanie za pomocą

/usr/lib/dovecot/deliver -m ${mailbox} -d ${src_user} << mail.tmp

wystarczy aby prawidłowo dostarczyć pocztę. A coś czuję że nie bo zmienne src_user czy mailbox nie są globalne i będą niedostępne dla skryptu w mda.

Tworzeniem tymczasowego pliku (tudzież przechowaniem wewnątrz zmiennej) musi się zająć Twój skrypt. Dostaje on całą wiadomość więc masz w niej nagłówki, z których możesz wyciągnąć informację gdzie dostarczyć. Możesz też przekazać wartości zmiennych ${mailbox} i ${src_user} jako parametry tego skryptu i używać tych wartości wewnątrz.

Tak, tylko nie mam pojęcia jak to zrobić. wystarczy zwykły cat > mail.tmp? Ale cat czego?

EDIT: Ok, zwykły cat > plik wystarczył aby dostać zawartość maila. Teraz walka ze skryptem.

Jk się okazuje w parametrze mda można umieścić kilka poleceń oddzielonych średnikami. I prawie działa. Mam wpis

mda “cat > /tmp/mail.tmp; /usr/lib/dovecot/deliver -m ${mailbox} -d ${src_user} < /tmp/mail.tmp; /usr/lib/dovecot/deliver -m ${mailbox} -f fetchmail -d 'adres@mail.pl < /tmp/mail.tmp; rm -f /tmp/mail.tmp”";

I to działa prawie dobrze. Otóż, drugie polecenie /usr/lib/dovecot/deliver -m ${mailbox} -f fetchmail -d ‘adres@mail.pl’ < /tmp/mail.tmp działa gdy wydam je z konsoli, jednak mail nie jest dostarczany przez mta na adres@mail.pl gdy wywoływany jest ze skryptu fetchmaila. Pozostałe polecenia wykonywane są poprawnie, łącznie z tworzeniem i kasowaniem pliku z tymczasowym mailem. Co może być przyczyną takiego zachowania? Zamiana poleceń miejscami nie zmienia faktu że poczta jest dostarczana na docelowy adres ale nie na dodatkowy.

Deliver zastąpiłem sendmailem dla dostarczania na stałą skrzynkę. Działa jak chciałem, nie trzeba skryptów, wszystko dało się ująć w parametrze mda oddzielone średnikami.
Powiedzcie mi jeszcze czy pomysł ze stałą nazwą mail.tmp jest słuszny (łatwy w implementacji w jednej linijce) czy raczej go jakoś go zrandomizować?

Tak, tylko nie mam pojęcia jak to zrobić. wystarczy zwykły cat > mail.tmp? Ale cat czego?

Jasne, że wystarczy. Wtedy to jest cat z stdin.

Powiedzcie mi jeszcze czy pomysł ze stałą nazwą mail.tmp jest słuszny (łatwy w implementacji w jednej linijce) czy raczej go jakoś go zrandomizować?

Oczywiście zrandomizować, bo w tym samym momencie może przyjść kilka maili.

Działa jak chciałem, nie trzeba skryptów, wszystko dało się ująć w parametrze mda oddzielone średnikami

Pod oddzieleniu średnikami to właściwie jest już skrypt :wink:

Nie prościej ustawić alias na relayu lub pobrać wiadomość i wysłać ją do BCC? W jaki sposób BCC ma działać skoro MTA tylko przekazuje maile, a nie je dostarcza.

Jeśli masz do tego dovecot, to filtry sieve i włącz sobie managesieve. W master.cf możesz określić odbiorców, ale filtry lepiej Ci to ogarną. Skoro masz dovecot to bym nie robił takiej rzeźby z postfiksem.

1 polubienie

Ok, możesz coś więcej o tym napisać? Nie oczekuję gotowca, ale jestem w tym początkujący i tak nie do końca wiem o czym mowa.

Zadaniem MTA jest przekazywanie maili. Jeśli wysyłasz maila, MUA kieruje go do MTA, następnie MTA kieruje do MDA, jeśli to ten sam serwer lub przekazuje do innego MTA. Dlatego BCC Ci nie zadziała po stonie postfiksa. To zdziała, gdy ktoś przekaże wiadomość do Twojego MTA.

Gdy MDA otrzymuje wiadomość od MTA może przetworzyć ją zgodnie z regułami filtrów - przekazać dalej, wysłać kopię, oznaczyć, usunąć itd.

W Dovecot konfiguruje się to w ustawieniach sieve i managesieve. Potem piszesz skrypty sieve, które umieszczasz w folderze odbiorcy lub robi to za Ciebie, np. Roundcue (wtyczka managesieve).

Co do aliasów. To działa tak, że masz wirtualny adres, jeśli coś na ten adres przyjdzie, kopia wysyłana jest zdefiniowanych w aliasie odbiorców. Możesz też zrobić dla prawdziwego adresu przekierowanie z zachowaniem kopii. Jeśli coś przyjdzie do odbiorcy1, wyślij kopię do odbiorcy2.

Napisz mniej więcej jak to masz zrobione. Dlaczego relay, a nie bezpośrednio. Ten relay to po prostu inny serwer, np. jakaś ogólnodostępna usługa czy może mail gateway?

Na maszynie stoi iRedMail, skonfigurowany do wysyłania poczty przez serwer obsługujący domenę firmy jako proxy. Always_bcc tu załatwia sprawę jeśli chodzi o kopię wysyłanej poczty. Jednak iredmail to rozwiązanie bez obsługi pobierania poczty z zewnętrznych serwerów. Dlatego fetchmail konfigurowany “z palca”. Chcę, aby dla wszystkich zdefiniowanych użytkowników na iredmailu poczta pobierana przez fetchmaila z zewnętrznego serwera obsługującego domenę firmy była robiona kopia na jedno konto archiwum. Rozwiązanie musi być automatyczne, bez konieczności dodawania aliasów dla każdego usera w iredmailu. Dlatego kombinowałem z fetchmailem aby podczas ew aktualizacji iredmaila konfiguracja nie “wyparowała”. Ta “rzeżba” z fetchmailem działa, testowałem z wieloma mailami na raz, z różnymi wielkościami maili, ale nie jestem pewien czy obsłuży wszystkie okoliczności jakie mogą się wydarzyć. A wolałbym uniknąć problemów z dostarczaniem poczty do skrzynek.

O Bożeno! Dlatego nie lubię gotowców. Postawienie postfix z dovecot to jakies 3 - 4 godziny roboty i robisz z tym co chesz.

To proxy to jest coś jak mail gateway, czy to poprostu inny serwer poczty, bo faktycznie trochę to rzeźba?

Nie w iRedMail. Pisałem o aliasach na tym całym proxy. Tam ustawiasz przekierowanie poczty na iRedMail, a dale robisz sobie np. regulki sieve. Wowczas nie masz rzeźby i nie ma prawa nic wyparować.

Tak, mail gateway, uzupełnienie funkcjonalności której brakuje na nadrzędnym serwerze.

Co do postawienia postfix+dovecot - owszem, dla kogoś kto zna te serwery to 3-4 godziny, dla kogoś “nowego” to zadanie na długie dni. Wiem jak działają serwery poczty, z exchange problemów nie mam. Iredmail konfiguruje roundcube, backend poczty, firewall, fail2ban i całkiem sporo skryptów diagnostycznych. Na pewno będzie to bezpieczniejsze niż samodzielna rzeźba początkującego w rozwiązaniu linuksowym serwera pocztowego.

Dlatego wolę jednak uzupełnienie konfiguracji fetchmaila która teraz wydaje się działać tak jak powinna. Plugin i skrypt pobrany stąd https://plugins.roundcube.net/packages/pf4public/fetchmail . Opis na stronie niepełny, polecenie utworzenia dodatkowych tabel w bazie mysql niekompletne, ale dało się to ogarnąć.
Skrypt uruchamiający fetchmaila z crona jest stąd https://github.com/postfixadmin/postfixadmin/blob/master/ADDITIONS/fetchmail.pl . Linijka mta ma obecnie postać:
cat > /tmp/mail-${mailbox}; /usr/sbin/sendmail archive@mail.com < /tmp/mail-${mailbox}; /usr/lib/dovecot/deliver -d ${mailbox} < /tmp/mail-${mailbox}; rm -f /tmp/mail-${mailbox}

Nie wiem jak zrandomizować nazwę pliku tymczasowego. Gdy dawałem inne polecenia przed cat (związane z mktemp) to skrypt nie dostarczał maili.

Jeśli to mail gateway, to coś jest nie tak, albo źle do tego podchodzisz.

Mail gateway powinien przekazywać wiadomosci, a klienci nigdy nie powinni podłączać się do mail gateway.

Hmm, mail gateway - czyli maszyna która służy jedynie za router dla jednej domeny. Do wysyłania poczty wykorzystuje tzw. smarthosta. Tak rozumiem mail gateway. Ale mniejsza o to. System wdrożony, 25 użytkowników z 30GB poczty działa bezproblemowo. Fetchmail również nie ma problemów z dostarczaniem poczty do właściwych skrzynek jak i do archiwum.