Hur man vidarebefordrar e-postmeddelanden till flera SMTP-servrar

Python and Postfix

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, , använder bibliotek för att hantera e-postsändning. Den importerar 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 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 .

På Postfix-sidan innebär konfigurationen att modifiera fil för att definiera den anpassade transporttjänsten, , som använder Python-skriptet. De filen uppdateras för att inkludera en transportkarta, som specificeras i /etc/postfix/transport. Kommandot skapar en binär databas från transportkartan, och 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 , 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 och 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 eller 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.

  1. Hur kan jag konfigurera flera MX-poster i DNS?
  2. 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.
  3. Vad är syftet med direktiv?
  4. De direktiv i Postfix anger mappningen av e-postadresser eller domäner till specifika e-posttransportmetoder och destinationer.
  5. Burk hjälp i detta scenario?
  6. Ja, 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.
  7. Hur gör jobba i Postfix?
  8. De Direktivet tillåter Postfix att mappa e-postadresser till andra adresser, vilket möjliggör vidarebefordran och omdirigering av e-post.
  9. Vad är rollen för ?
  10. De Direktivet tillåter Postfix att automatiskt lägga till BCC-mottagare till inkommande e-postmeddelanden, användbart för att duplicera meddelanden.
  11. Kan jag använda med Postfix för vidarebefordran av e-post?
  12. Ja, kan integreras med Postfix för att tillämpa anpassade regler för filtrering och vidarebefordran, vilket ger mer kontroll över e-postbehandling.
  13. Vad är fil används för?
  14. De fil i Postfix definierar postleveransprocesserna och deras konfigurationer, inklusive anpassade transporttjänster.
  15. Hur uppdaterar jag databas?
  16. Använd kommando för att skapa eller uppdatera den binära databasen från transportkartfilen.
  17. Varför är det viktigt att ladda om Postfix?
  18. Laddar om Postfix med tillämpar konfigurationsändringar utan att stoppa tjänsten, vilket säkerställer smidig drift.
  19. Vad är används för i Python?
  20. De 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.

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.