Sähköpostien välittäminen useille SMTP-palvelimille

Sähköpostien välittäminen useille SMTP-palvelimille
Sähköpostien välittäminen useille SMTP-palvelimille

Kahden SMTP-edelleenlähetyksen määrittäminen

Useiden sähköpostipalvelimien hallinta identtisillä käyttäjätileillä voi olla haastavaa. Tässä skenaariossa, kun sähköposti lähetetään käyttäjälle osoitteessa example.com, sekä james- että winmail-palvelimien on vastaanotettava se, jotta sähköpostin sisältö pysyy muuttumattomana.

Yleiset ratkaisut, kuten useiden MX-tietueiden määrittäminen DNS:ssä, ovat puutteellisia, koska ne voivat ohjata example.com-sivuston vain yhdelle palvelimelle kerrallaan. Postfixin käyttäminen sähköpostien välittämiseen molempiin palvelimiin ilman paikallista tallennustilaa on osoittautunut monimutkaiseksi, mikä on johtanut ratkaisuihin, kuten komentosarjaan smtplibin avulla, jotka eivät välttämättä ole luotettavia. Tutkitaan parempia vaihtoehtoja.

Komento Kuvaus
import smtplib Tuo Simple Mail Transfer Protocol -kirjaston sähköpostien lähettämistä varten Pythonilla.
import sys Tuo järjestelmäkohtaiset parametrit ja funktiot -moduulin, jota käytetään komentoriviargumenttien saamiseen.
from email.mime.text import MIMEText Tuo MIMEText-luokan tekstipohjaisten sähköpostiviestien luomiseksi.
from email.mime.multipart import MIMEMultipart Tuo MIMEMultipart-luokan moniosaisten sähköpostiviestien luomiseksi.
msg.attach(MIMEText('text', 'plain')) Liittää sähköpostiviestiin pelkän tekstin.
with smtplib.SMTP(server) as smtp Avaa yhteyden SMTP-palvelimeen ja varmistaa, että se on kunnolla suljettu sähköpostin lähettämisen jälkeen.
postmap /etc/postfix/transport Luo siirtokarttatiedostosta binääritietokannan, jota Postfix käyttää postin reitittämiseen.
systemctl reload postfix Lataa Postfix-määritykset uudelleen pysäyttämättä palvelua ja ottaa käyttöön tehdyt muutokset.

Postfix- ja Python-integraation ymmärtäminen

Mukana toimitetut komentosarjat on suunniteltu välittämään sähköpostit kahdelle SMTP-palvelimelle varmistaen, että molemmat palvelimet saavat saman sähköpostin. Python-skripti, multi_forward.py, käyttää import smtplib kirjasto hoitaa sähköpostin lähettämisen. Se tuo maahan sys saadaksesi komentoriviargumentteja, kuten lähettäjän ja vastaanottajan. Skripti rakentaa sähköpostin käyttämällä from email.mime.text import MIMEText ja from email.mime.multipart import MIMEMultipart luodaksesi ja liittääksesi sähköpostin rungon. Sitten se toistuu SMTP-palvelimien luettelon yli ja lähettää sähköpostin jokaiselle käyttämällä with smtplib.SMTP(server) as smtp.

Postfix-puolella kokoonpanoon kuuluu muuntaminen /etc/postfix/master.cf tiedosto mukautetun kuljetuspalvelun määrittelemiseksi, multi_forward, joka käyttää Python-skriptiä. The /etc/postfix/main.cf tiedosto päivitetään sisältämään kuljetuskartan, joka on määritelty kohdassa /etc/postfix/transport. Käsky postmap /etc/postfix/transport luo binääritietokannan kuljetuskartasta ja systemctl reload postfix ottaa kokoonpanomuutokset käyttöön pysäyttämättä Postfix-palvelua. Tämä asennus varmistaa, että Python-komentosarja käsittelee kaikki osoitteeseen example.com lähetetyt sähköpostit ja välittää ne edelleen molemmille SMTP-palvelimille.

Välitä sähköpostit useille SMTP-palvelimille Pythonilla

Pythonin käyttäminen SMTP-edelleenlähetyksen käsittelemiseen

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

Postfixin määrittäminen käyttämään Python-komentosarjaa

Postfix-määritys mukautettua postin edelleenlähetystä varten

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

Postfix-toimintojen parantaminen lisätyökaluilla

Toinen tapa lähettää sähköpostit edelleen useille SMTP-palvelimille sisältää Postfix-lisätyökalujen ja -kokoonpanojen käyttämisen. Yksi tällainen työkalu on Postfix sender_dependent_relayhost_maps, jonka avulla voidaan määrittää eri välityspalvelimet lähettäjän osoitteen perusteella. Vaikka tätä ominaisuutta käytetään yleensä lähtevän postin reitittämiseen eri välityspalvelinten kautta, sitä voidaan mukauttaa käyttötapaukseemme luovilla määrityksillä. Esimerkiksi yhdistelmä virtual_alias_maps ja recipient_bcc_maps voidaan käyttää sähköpostien kopioimiseen ja välittämiseen eri osoitteisiin, jotka sitten reititetään vastaaville palvelimille.

Lisäksi Postfixin integrointi sähköpostisuodattimella, kuten Amavisd-new tai Procmail voisi tarjota enemmän joustavuutta sähköpostien käsittelyssä ja reitityksessä. Nämä suodattimet voivat käsitellä sähköposteja, kun ne kulkevat Postfixin läpi, jolloin mukautetut komentosarjat tai säännöt voivat kopioida ja välittää viestejä useisiin kohteisiin. Vaikka tämä asennus voi olla monimutkaisempi kuin yksinkertaisen Python-komentosarjan käyttäminen, se voi tarjota paremman luotettavuuden ja skaalautuvuuden ympäristöissä, jotka vaativat vankat sähköpostinkäsittelyominaisuudet.

Yleisiä kysymyksiä ja ratkaisuja Postfix-sähköpostin edelleenlähetykseen

  1. Kuinka voin määrittää useita MX-tietueita DNS:ssä?
  2. Valitettavasti DNS MX -tietueet tukevat vain yhteen palvelimeen yhdistämistä prioriteettitasoa kohden, joten tämä lähestymistapa ei toimi edelleenlähetyksessä useille palvelimille samanaikaisesti.
  3. Mikä on tarkoitus transport_maps direktiivi?
  4. The transport_maps Postfixin direktiivi määrittää sähköpostiosoitteiden tai toimialueiden yhdistämisen tiettyihin postin siirtotapoihin ja kohteisiin.
  5. Voi sender_dependent_relayhost_maps apua tässä tilanteessa?
  6. Joo, sender_dependent_relayhost_maps voi reitittää sähköpostit eri välityspalvelinten kautta lähettäjän osoitteen perusteella, mutta se on mukautettava luovasti edelleenlähetystä varten useille palvelimille.
  7. Kuinka virtual_alias_maps Työskenteletkö Postfixissä?
  8. The virtual_alias_maps -direktiivi sallii Postfixin yhdistää sähköpostiosoitteet muihin osoitteisiin, mikä mahdollistaa sähköpostien edelleenlähetyksen ja uudelleenohjauksen.
  9. Mikä on rooli recipient_bcc_maps?
  10. The recipient_bcc_maps -direktiivin avulla Postfix voi lisätä automaattisesti BCC-vastaanottajat saapuviin sähköposteihin, mikä on hyödyllistä viestien monistamiseen.
  11. Voinko käyttää Amavisd-new Postfixillä sähköpostin edelleenlähetystä varten?
  12. Joo, Amavisd-new voidaan integroida Postfixiin mukautettujen suodatus- ja edelleenlähetyssääntöjen soveltamiseksi, mikä tarjoaa paremman hallinnan sähköpostin käsittelyyn.
  13. Mikä on master.cf tiedostoa käytetään?
  14. The master.cf Postfixin tiedosto määrittää postin jakeluprosessit ja niiden kokoonpanot, mukaan lukien mukautetut kuljetuspalvelut.
  15. Miten päivitän transport map tietokanta?
  16. Käytä postmap /etc/postfix/transport komento luodaksesi tai päivittääksesi binaaritietokannan kuljetuskarttatiedostosta.
  17. Miksi Postfixin uudelleenlataus on tärkeää?
  18. Ladataan uudelleen Postfix kanssa systemctl reload postfix soveltaa kokoonpanomuutoksia pysäyttämättä palvelua, mikä varmistaa sujuvan toiminnan.
  19. Mikä on smtplib käytetään Pythonissa?
  20. The smtplib Pythonin kirjastoa käytetään sähköpostien lähettämiseen SMTP:n kautta, jolloin komentosarjat voivat käsitellä sähköpostin lähetystä ohjelmallisesti.

Viimeiset ajatukset kahden palvelimen edelleenlähetyksestä

Postfixin määrittäminen välittämään viestejä useille SMTP-palvelimille edellyttää mukautettujen komentosarjojen ja yksityiskohtaisten Postfix-määritysten yhdistelmää. Vaikka ensimmäiset DNS- tai yksinkertaiset Python-komentosarjat eivät välttämättä tarjoa vaadittua luotettavuutta, edistyneiden Postfix-ominaisuuksien ja työkalujen, kuten Amavisd-new tai Procmail, integrointi voi tarjota tehokkaamman ratkaisun. Määrittämällä kuljetuskartat, virtuaaliset aliaskartat ja vastaanottajien BCC-kartat huolellisesti voit varmistaa saumattoman ja tehokkaan viestien edelleenlähetyksen sekä James- että winmail-palvelimille. Tämä lähestymistapa varmistaa, että sähköpostiinfrastruktuurisi pysyy joustavana ja pystyy käsittelemään monimutkaisia ​​reititysvaatimuksia.