Ställa in dubbel SMTP-vidarebefordran
Att hantera flera e-postservrar med identiska användarkonton kan vara utmanande. I det här scenariot, när ett e-postmeddelande skickas till en användare på example.com, måste det tas emot av både james- och winmail-servrar, vilket säkerställer att e-postinnehållet förblir oförändrat.
Vanliga lösningar, som att konfigurera flera MX-poster i DNS, misslyckas eftersom de bara kan dirigera example.com till en enda server åt gången. Att använda Postfix för att vidarebefordra e-post till båda servrarna utan lokal lagring har visat sig komplicerat, vilket leder till lösningar som scripting med smtplib, vilket kanske inte är tillförlitligt. Låt oss utforska bättre alternativ.
Kommando | Beskrivning |
---|---|
import smtplib | Importerar Simple Mail Transfer Protocol-biblioteket för att skicka e-post med Python. |
import sys | Importerar den systemspecifika parametrar och funktionsmodulen, som används för att hämta kommandoradsargument. |
from email.mime.text import MIMEText | Importerar klassen MIMEText för att skapa textbaserade e-postmeddelanden. |
from email.mime.multipart import MIMEMultipart | Importerar MIMEMultipart-klassen för att skapa flerdelade e-postmeddelanden. |
msg.attach(MIMEText('text', 'plain')) | Bifogar en oformaterad text till e-postmeddelandet. |
with smtplib.SMTP(server) as smtp | Öppnar en anslutning till SMTP-servern och säkerställer att den är ordentligt stängd efter att ha skickat e-postmeddelandet. |
postmap /etc/postfix/transport | Genererar en binär databas från transportkartfilen, som används av Postfix för e-postdirigering. |
systemctl reload postfix | Laddar om Postfix-konfigurationen utan att stoppa tjänsten och tillämpar eventuella ändringar. |
Förstå Postfix och Python-integration
De medföljande skripten är utformade för att vidarebefordra e-post till två SMTP-servrar, vilket säkerställer att båda servrarna får samma e-post. Python-skriptet, multi_forward.py, använder import smtplib bibliotek för att hantera e-postsändning. Den importerar sys för att få kommandoradsargument, som avsändare och mottagare. Skriptet konstruerar e-postmeddelandet med hjälp av from email.mime.text import MIMEText och from email.mime.multipart import MIMEMultipart för att skapa och bifoga e-posttexten. Den itererar sedan över en lista med SMTP-servrar och skickar e-postmeddelandet till var och en som använder with smtplib.SMTP(server) as smtp.
På Postfix-sidan innebär konfigurationen att modifiera /etc/postfix/master.cf fil för att definiera den anpassade transporttjänsten, multi_forward, som använder Python-skriptet. De /etc/postfix/main.cf filen uppdateras för att inkludera en transportkarta, som specificeras i /etc/postfix/transport. Kommandot postmap /etc/postfix/transport skapar en binär databas från transportkartan, och systemctl reload postfix tillämpar konfigurationsändringarna utan att stoppa Postfix-tjänsten. Denna inställning säkerställer att all e-post som skickas till example.com bearbetas av Python-skriptet och vidarebefordras till båda SMTP-servrarna.
Vidarebefordra e-postmeddelanden till flera SMTP-servrar med Python
Använder Python för att hantera SMTP-vidarebefordran
# 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)
Konfigurera Postfix för att använda Python-skriptet
Postfix-konfiguration för anpassad vidarebefordran av e-post
# /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
Förbättra Postfix-funktionalitet med ytterligare verktyg
Ett annat tillvägagångssätt för att uppnå vidarebefordran av e-post till flera SMTP-servrar involverar användning av ytterligare Postfix-verktyg och konfigurationer. Ett sådant verktyg är Postfix sender_dependent_relayhost_maps, som gör det möjligt att specificera olika relävärdar baserat på avsändarens adress. Även om den här funktionen vanligtvis används för att dirigera utgående e-post genom olika relävärdar, kan den anpassas för vårt användningsfall med en viss kreativ konfiguration. Till exempel en kombination av virtual_alias_maps och recipient_bcc_maps kan användas för att duplicera e-postmeddelanden och vidarebefordra dem till olika adresser, som sedan dirigeras till respektive servrar.
Dessutom integrerar Postfix med ett e-postfilter som Amavisd-new eller Procmail skulle kunna ge mer flexibilitet vid hantering och dirigering av e-post. Dessa filter kan behandla e-postmeddelanden när de passerar Postfix, vilket möjliggör anpassade skript eller regler för att duplicera och vidarebefordra meddelanden till flera destinationer. Även om den här installationen kan vara mer komplex än att använda ett enkelt Python-skript, kan det erbjuda större tillförlitlighet och skalbarhet för miljöer som kräver robusta e-postbearbetningsmöjligheter.
Vanliga frågor och lösningar för Postfix e-postvidarebefordran
- Hur kan jag konfigurera flera MX-poster i DNS?
- Tyvärr stöder DNS MX-poster bara mappning till en server per prioritetsnivå, så detta tillvägagångssätt fungerar inte för vidarebefordran till flera servrar samtidigt.
- Vad är syftet med transport_maps direktiv?
- De transport_maps direktiv i Postfix anger mappningen av e-postadresser eller domäner till specifika e-posttransportmetoder och destinationer.
- Burk sender_dependent_relayhost_maps hjälp i detta scenario?
- Ja, sender_dependent_relayhost_maps kan dirigera e-postmeddelanden genom olika relävärdar baserat på avsändarens adress, men det måste vara kreativt anpassat för vidarebefordran till flera servrar.
- Hur gör virtual_alias_maps jobba i Postfix?
- De virtual_alias_maps Direktivet tillåter Postfix att mappa e-postadresser till andra adresser, vilket möjliggör vidarebefordran och omdirigering av e-post.
- Vad är rollen för recipient_bcc_maps?
- De recipient_bcc_maps Direktivet tillåter Postfix att automatiskt lägga till BCC-mottagare till inkommande e-postmeddelanden, användbart för att duplicera meddelanden.
- Kan jag använda Amavisd-new med Postfix för vidarebefordran av e-post?
- Ja, Amavisd-new kan integreras med Postfix för att tillämpa anpassade regler för filtrering och vidarebefordran, vilket ger mer kontroll över e-postbehandling.
- Vad är master.cf fil används för?
- De master.cf fil i Postfix definierar postleveransprocesserna och deras konfigurationer, inklusive anpassade transporttjänster.
- Hur uppdaterar jag transport map databas?
- Använd postmap /etc/postfix/transport kommando för att skapa eller uppdatera den binära databasen från transportkartfilen.
- Varför är det viktigt att ladda om Postfix?
- Laddar om Postfix med systemctl reload postfix tillämpar konfigurationsändringar utan att stoppa tjänsten, vilket säkerställer smidig drift.
- Vad är smtplib används för i Python?
- De smtplib bibliotek i Python används för att skicka e-post via SMTP, vilket gör att skript kan hantera e-postöverföring programmatiskt.
Sista tankar om Dual Server Forwarding
Att ställa in Postfix för att vidarebefordra meddelanden till flera SMTP-servrar involverar en kombination av anpassade skript och detaljerade Postfix-konfigurationer. Även om initiala försök med DNS eller enkla Python-skript kanske inte erbjuder den tillförlitlighet som krävs, kan integration av avancerade Postfix-funktioner och verktyg som Amavisd-new eller Procmail ge en mer robust lösning. Genom att noggrant konfigurera transportkartor, virtuella aliaskartor och BCC-kartor för mottagare kan du säkerställa sömlös och effektiv vidarebefordran av meddelanden till både james- och winmail-servrar. Detta tillvägagångssätt säkerställer att din e-postinfrastruktur förblir motståndskraftig och kapabel att hantera komplexa routingkrav.