Konfigurowanie podwójnego przekazywania SMTP
Zarządzanie wieloma serwerami poczty e-mail z identycznymi kontami użytkowników może być wyzwaniem. W tym scenariuszu, gdy wiadomość e-mail jest wysyłana do użytkownika w witrynie example.com, musi zostać odebrana zarówno przez serwer james, jak i serwer winmail, co gwarantuje, że treść wiadomości e-mail pozostanie niezmieniona.
Typowe rozwiązania, takie jak konfiguracja wielu rekordów MX w DNS, nie sprawdzają się, ponieważ mogą kierować witrynę example.com tylko na jeden serwer na raz. Używanie Postfixa do przekazywania wiadomości e-mail na oba serwery bez lokalnej pamięci okazało się skomplikowane, co doprowadziło do rozwiązań takich jak skrypty za pomocą smtplib, które mogą nie być niezawodne. Przeanalizujmy lepsze alternatywy.
Komenda | Opis |
---|---|
import smtplib | Importuje bibliotekę protokołu Simple Mail Transfer Protocol do wysyłania wiadomości e-mail przy użyciu języka Python. |
import sys | Importuje moduł parametrów i funkcji specyficznych dla systemu, używany do pobierania argumentów wiersza poleceń. |
from email.mime.text import MIMEText | Importuje klasę MIMEText w celu tworzenia tekstowych wiadomości e-mail. |
from email.mime.multipart import MIMEMultipart | Importuje klasę MIMEMultipart w celu tworzenia wieloczęściowych wiadomości e-mail. |
msg.attach(MIMEText('text', 'plain')) | Dołącza treść zwykłego tekstu do wiadomości e-mail. |
with smtplib.SMTP(server) as smtp | Otwiera połączenie z serwerem SMTP i zapewnia jego prawidłowe zamknięcie po wysłaniu wiadomości e-mail. |
postmap /etc/postfix/transport | Generuje binarną bazę danych z pliku mapy transportu, używaną przez Postfix do routingu poczty. |
systemctl reload postfix | Ładuje ponownie konfigurację Postfixa bez zatrzymywania usługi, stosując wprowadzone zmiany. |
Zrozumienie integracji Postfix i Python
Dostarczone skrypty służą do przekazywania wiadomości e-mail do dwóch serwerów SMTP, zapewniając, że oba serwery otrzymają tę samą wiadomość e-mail. Skrypt Pythona, multi_forward.py, używa import smtplib biblioteka do obsługi wysyłania wiadomości e-mail. Importuje sys aby uzyskać argumenty wiersza poleceń, takie jak nadawca i odbiorca. Skrypt konstruuje wiadomość e-mail za pomocą from email.mime.text import MIMEText I from email.mime.multipart import MIMEMultipart , aby utworzyć i dołączyć treść wiadomości e-mail. Następnie przegląda listę serwerów SMTP i wysyła wiadomość e-mail do każdego z nich with smtplib.SMTP(server) as smtp.
Po stronie Postfixa konfiguracja obejmuje modyfikację pliku /etc/postfix/master.cf plik definiujący niestandardową usługę transportową, multi_forward, który używa skryptu Python. The /etc/postfix/main.cf plik jest aktualizowany w celu uwzględnienia mapy transportu, która jest określona w /etc/postfix/transport. Komenda postmap /etc/postfix/transport tworzy binarną bazę danych z mapy transportowej, oraz systemctl reload postfix stosuje zmiany konfiguracji bez zatrzymywania usługi Postfix. Ta konfiguracja gwarantuje, że każda wiadomość e-mail wysłana do witryny example.com zostanie przetworzona przez skrypt Pythona i przekazana do obu serwerów SMTP.
Przesyłaj wiadomości e-mail do wielu serwerów SMTP za pomocą języka Python
Używanie języka Python do obsługi przesyłania dalej SMTP
# multi_forward.py
import smtplib
import sys
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
sender = sys.argv[1]
recipient = sys.argv[2]
def forward_email(sender, recipient):
msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = recipient
msg['Subject'] = 'Forwarded email'
msg.attach(MIMEText('This is the body of the email', 'plain'))
# SMTP servers
smtp_servers = ['james.example.com', 'winmail.example.com']
for server in smtp_servers:
with smtplib.SMTP(server) as smtp:
smtp.sendmail(sender, recipient, msg.as_string())
if __name__ == '__main__':
forward_email(sender, recipient)
Konfigurowanie Postfixa do używania skryptu Pythona
Konfiguracja Postfixa do niestandardowego przekazywania poczty
# /etc/postfix/master.cf
multi_forward unix - n n - - pipe
flags=Rhu user=nobody argv=/usr/local/bin/multi_forward.py ${sender} ${recipient}
# /etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
# /etc/postfix/transport
example.com multi_forward:
# Update transport map
postmap /etc/postfix/transport
# Reload Postfix
systemctl reload postfix
Zwiększanie funkcjonalności Postfixa za pomocą dodatkowych narzędzi
Inne podejście do przekazywania wiadomości e-mail do wielu serwerów SMTP polega na użyciu dodatkowych narzędzi i konfiguracji Postfix. Jednym z takich narzędzi jest Postfix sender_dependent_relayhost_maps, co umożliwia określenie różnych hostów przekazujących na podstawie adresu nadawcy. Chociaż ta funkcja jest zwykle używana do kierowania poczty wychodzącej przez różne hosty przekazujące, można ją dostosować do naszego przypadku użycia po pewnej kreatywnej konfiguracji. Na przykład kombinacja virtual_alias_maps I recipient_bcc_maps można wykorzystać do powielania wiadomości e-mail i przesyłania ich na różne adresy, które następnie są kierowane do odpowiednich serwerów.
Dodatkowo integracja Postfixa z filtrem poczty, np Amavisd-new Lub Procmail mogłoby zapewnić większą elastyczność w obsłudze i kierowaniu wiadomości e-mail. Filtry te mogą przetwarzać wiadomości e-mail przechodzące przez Postfix, umożliwiając tworzenie niestandardowych skryptów lub reguł powielania i przekazywania wiadomości do wielu miejsc docelowych. Chociaż ta konfiguracja może być bardziej złożona niż użycie prostego skryptu w języku Python, może zapewnić większą niezawodność i skalowalność w środowiskach wymagających solidnych możliwości przetwarzania poczty e-mail.
Często zadawane pytania i rozwiązania dotyczące przekazywania poczty e-mail Postfix
- Jak mogę skonfigurować wiele rekordów MX w DNS?
- Niestety rekordy MX DNS obsługują tylko mapowanie na jeden serwer na każdy poziom priorytetu, więc to podejście nie sprawdzi się w przypadku jednoczesnego przesyłania dalej do wielu serwerów.
- Jaki jest cel transport_maps dyrektywa?
- The transport_maps dyrektywa w Postfixie określa mapowanie adresów e-mail lub domen na określone metody i miejsca docelowe transportu poczty.
- Móc sender_dependent_relayhost_maps pomóc w tej sytuacji?
- Tak, sender_dependent_relayhost_maps może kierować wiadomości e-mail przez różne hosty przekaźnikowe w oparciu o adres nadawcy, ale należy je twórczo dostosować do przekazywania do wielu serwerów.
- Jak virtual_alias_maps pracować w Postfixie?
- The virtual_alias_maps dyrektywa pozwala Postfixowi mapować adresy e-mail na inne adresy, umożliwiając przekazywanie i przekierowywanie wiadomości e-mail.
- Jaka jest rola recipient_bcc_maps?
- The recipient_bcc_maps dyrektywa pozwala Postfixowi automatycznie dodawać odbiorców BCC do przychodzących wiadomości e-mail, co jest przydatne przy duplikowaniu wiadomości.
- Mogę uzyć Amavisd-new z Postfixem do przesyłania wiadomości e-mail?
- Tak, Amavisd-new można zintegrować z Postfixem, aby zastosować niestandardowe reguły filtrowania i przekazywania, zapewniając większą kontrolę nad przetwarzaniem wiadomości e-mail.
- Co to jest master.cf plik używany do?
- The master.cf plik w Postfixie definiuje procesy dostarczania poczty i ich konfiguracje, w tym niestandardowe usługi transportowe.
- Jak zaktualizować plik transport map Baza danych?
- Użyj postmap /etc/postfix/transport polecenie utworzenia lub aktualizacji binarnej bazy danych z pliku mapy transportu.
- Dlaczego ponowne załadowanie Postfixa jest ważne?
- Ponowne ładowanie Postfixa za pomocą systemctl reload postfix stosuje zmiany konfiguracyjne bez zatrzymywania usługi, zapewniając płynne działanie.
- Co jest smtplib używany w Pythonie?
- The smtplib Biblioteka w Pythonie służy do wysyłania wiadomości e-mail za pośrednictwem protokołu SMTP, umożliwiając skryptom programową obsługę transmisji wiadomości e-mail.
Ostatnie przemyślenia na temat przesyłania dalej przez dwa serwery
Konfigurowanie Postfixa do przekazywania wiadomości do wielu serwerów SMTP obejmuje kombinację niestandardowych skryptów i szczegółowych konfiguracji Postfixa. Chociaż początkowe próby użycia DNS lub prostych skryptów w języku Python mogą nie zapewnić wymaganej niezawodności, integracja zaawansowanych funkcji i narzędzi Postfix, takich jak Amavisd-new lub Procmail, może zapewnić solidniejsze rozwiązanie. Starannie konfigurując mapy transportu, mapy aliasów wirtualnych i mapy BCC odbiorców, możesz zapewnić płynne i wydajne przekazywanie wiadomości zarówno do serwerów James, jak i Winmail. Takie podejście gwarantuje, że infrastruktura poczty e-mail pozostanie odporna i zdolna do obsługi złożonych wymagań dotyczących routingu.