E-mails doorsturen naar meerdere SMTP-servers

E-mails doorsturen naar meerdere SMTP-servers
E-mails doorsturen naar meerdere SMTP-servers

Dubbele SMTP-doorsturing instellen

Het beheren van meerdere e-mailservers met identieke gebruikersaccounts kan een uitdaging zijn. Wanneer in dit scenario een e-mail wordt verzonden naar een gebruiker op example.com, moet deze worden ontvangen door zowel james- als winmail-servers, zodat de e-mailinhoud ongewijzigd blijft.

Veelgebruikte oplossingen, zoals het configureren van meerdere MX-records in DNS, schieten tekort omdat ze example.com slechts naar één server tegelijk kunnen leiden. Het gebruik van Postfix om e-mails door te sturen naar beide servers zonder lokale opslag is complex gebleken, wat heeft geleid tot oplossingen zoals scripting met smtplib, die mogelijk niet betrouwbaar zijn. Laten we betere alternatieven verkennen.

Commando Beschrijving
import smtplib Importeert de Simple Mail Transfer Protocol-bibliotheek voor het verzenden van e-mails met Python.
import sys Importeert de systeemspecifieke parameters en functiemodule, die wordt gebruikt om opdrachtregelargumenten op te halen.
from email.mime.text import MIMEText Importeert de MIMEText-klasse om op tekst gebaseerde e-mailberichten te maken.
from email.mime.multipart import MIMEMultipart Importeert de klasse MIMEMultipart om uit meerdere delen bestaande e-mailberichten te maken.
msg.attach(MIMEText('text', 'plain')) Voegt een platte tekst toe aan het e-mailbericht.
with smtplib.SMTP(server) as smtp Opent een verbinding met de SMTP-server en zorgt ervoor dat deze goed wordt gesloten na het verzenden van de e-mail.
postmap /etc/postfix/transport Genereert een binaire database uit het transportkaartbestand, gebruikt door Postfix voor e-mailroutering.
systemctl reload postfix Laadt de Postfix-configuratie opnieuw zonder de service te stoppen, waarbij eventueel aangebrachte wijzigingen worden toegepast.

Inzicht in de Postfix- en Python-integratie

De meegeleverde scripts zijn ontworpen om e-mails door te sturen naar twee SMTP-servers, zodat beide servers dezelfde e-mail ontvangen. Het Python-script, multi_forward.py, maakt gebruik van de import smtplib bibliotheek om het verzenden van e-mail af te handelen. Het importeert sys om opdrachtregelargumenten op te halen, zoals de afzender en de ontvanger. Het script bouwt de e-mail op met behulp van from email.mime.text import MIMEText En from email.mime.multipart import MIMEMultipart om de e-mailtekst te maken en bij te voegen. Vervolgens wordt een lijst met SMTP-servers doorlopen en wordt de e-mail naar elke server verzonden with smtplib.SMTP(server) as smtp.

Aan de Postfix-kant omvat de configuratie het wijzigen van de /etc/postfix/master.cf bestand om de aangepaste transportservice te definiëren, multi_forward, dat het Python-script gebruikt. De /etc/postfix/main.cf bestand wordt bijgewerkt met een transportkaart, die is gespecificeerd in /etc/postfix/transport. Het bevel postmap /etc/postfix/transport creëert een binaire database van de transportkaart, en systemctl reload postfix past de configuratiewijzigingen toe zonder de Postfix-service te stoppen. Deze opstelling zorgt ervoor dat elke e-mail die naar example.com wordt verzonden, wordt verwerkt door het Python-script en wordt doorgestuurd naar beide SMTP-servers.

Stuur e-mails door naar meerdere SMTP-servers met Python

Python gebruiken om SMTP-forwarding af te handelen

# 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)

Postfix configureren om het Python-script te gebruiken

Postfix-configuratie voor het doorsturen van aangepaste e-mail

# /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

Verbetering van de Postfix-functionaliteit met aanvullende tools

Een andere manier om e-mails door te sturen naar meerdere SMTP-servers is het gebruik van aanvullende Postfix-tools en -configuraties. Een voorbeeld van zo'n tool is die van Postfix sender_dependent_relayhost_maps, waarmee u verschillende relay-hosts kunt opgeven op basis van het adres van de afzender. Hoewel deze functie doorgaans wordt gebruikt om uitgaande e-mail via verschillende relay-hosts te routeren, kan deze met een creatieve configuratie worden aangepast aan onze gebruikssituatie. Een combinatie van bijvoorbeeld virtual_alias_maps En recipient_bcc_maps kan worden gebruikt om e-mails te dupliceren en door te sturen naar verschillende adressen, die vervolgens naar de respectieve servers worden doorgestuurd.

Daarnaast is het integreren van Postfix met een mailfilter zoals Amavisd-new of Procmail zou meer flexibiliteit kunnen bieden bij het verwerken en routeren van e-mails. Deze filters kunnen e-mails verwerken terwijl ze door Postfix gaan, waardoor aangepaste scripts of regels berichten kunnen dupliceren en doorsturen naar meerdere bestemmingen. Hoewel deze opzet complexer kan zijn dan het gebruik van een eenvoudig Python-script, kan het een grotere betrouwbaarheid en schaalbaarheid bieden voor omgevingen die robuuste e-mailverwerkingsmogelijkheden vereisen.

Veelgestelde vragen en oplossingen voor het doorsturen van e-mail via Postfix

  1. Hoe kan ik meerdere MX-records in DNS configureren?
  2. Helaas ondersteunen DNS MX-records slechts toewijzing aan één server per prioriteitsniveau, dus deze aanpak werkt niet voor het tegelijkertijd doorsturen naar meerdere servers.
  3. Wat is het doel van de transport_maps richtlijn?
  4. De transport_maps richtlijn in Postfix specificeert de toewijzing van e-mailadressen of domeinen aan specifieke e-mailtransportmethoden en -bestemmingen.
  5. Kan sender_dependent_relayhost_maps hulp in dit scenario?
  6. Ja, sender_dependent_relayhost_maps kan e-mails routeren via verschillende relay-hosts op basis van het adres van de afzender, maar het moet op creatieve wijze worden aangepast voor het doorsturen naar meerdere servers.
  7. Hoe werkt virtual_alias_maps werken bij Postfix?
  8. De virtual_alias_maps Dankzij de richtlijn kan Postfix e-mailadressen aan andere adressen toewijzen, waardoor het doorsturen en omleiden van e-mails mogelijk wordt.
  9. Wat is de rol van recipient_bcc_maps?
  10. De recipient_bcc_maps Dankzij de richtlijn kan Postfix automatisch BCC-ontvangers toevoegen aan inkomende e-mails, handig voor het dupliceren van berichten.
  11. Kan ik gebruiken Amavisd-new met Postfix voor het doorsturen van e-mail?
  12. Ja, Amavisd-new kan worden geïntegreerd met Postfix om aangepaste filter- en doorstuurregels toe te passen, waardoor u meer controle krijgt over de e-mailverwerking.
  13. Wat is de master.cf bestand gebruikt?
  14. De master.cf -bestand in Postfix definieert de e-mailbezorgprocessen en hun configuraties, inclusief aangepaste transportservices.
  15. Hoe update ik de transport map databank?
  16. Gebruik de postmap /etc/postfix/transport opdracht om de binaire database te maken of bij te werken vanuit het transportkaartbestand.
  17. Waarom is het herladen van Postfix belangrijk?
  18. Postfix opnieuw laden met systemctl reload postfix past configuratiewijzigingen toe zonder de service te stoppen, waardoor een soepele werking wordt gegarandeerd.
  19. Wat is smtplib gebruikt voor in Python?
  20. De smtplib bibliotheek in Python wordt gebruikt voor het verzenden van e-mails via SMTP, waardoor scripts de e-mailoverdracht programmatisch kunnen afhandelen.

Laatste gedachten over het doorsturen van dubbele servers

Het instellen van Postfix om berichten door te sturen naar meerdere SMTP-servers omvat een combinatie van aangepaste scripts en gedetailleerde Postfix-configuraties. Hoewel initiële pogingen met DNS of eenvoudige Python-scripts mogelijk niet de vereiste betrouwbaarheid bieden, kan het integreren van geavanceerde Postfix-functies en -tools zoals Amavisd-new of Procmail een robuustere oplossing bieden. Door zorgvuldig transportkaarten, virtuele aliaskaarten en BCC-kaarten van ontvangers te configureren, kunt u ervoor zorgen dat berichten naadloos en efficiënt worden doorgestuurd naar zowel James- als Winmail-servers. Deze aanpak zorgt ervoor dat uw e-mailinfrastructuur veerkrachtig blijft en in staat is om met complexe routeringsvereisten om te gaan.