Comment transférer des e-mails vers plusieurs serveurs SMTP

Comment transférer des e-mails vers plusieurs serveurs SMTP
Comment transférer des e-mails vers plusieurs serveurs SMTP

Configuration du double transfert SMTP

La gestion de plusieurs serveurs de messagerie avec des comptes d'utilisateurs identiques peut s'avérer difficile. Dans ce scénario, lorsqu'un e-mail est envoyé à un utilisateur sur example.com, il doit être reçu à la fois par les serveurs James et Winmail, garantissant ainsi que le contenu de l'e-mail reste inchangé.

Les solutions courantes, telles que la configuration de plusieurs enregistrements MX dans DNS, ne suffisent pas car elles ne peuvent diriger example.com que vers un seul serveur à la fois. Utiliser Postfix pour transférer des e-mails vers les deux serveurs sans stockage local s'est avéré complexe, conduisant à des solutions telles que l'écriture de scripts avec smtplib, qui peuvent ne pas être fiables. Explorons de meilleures alternatives.

Commande Description
import smtplib Importe la bibliothèque Simple Mail Transfer Protocol pour l'envoi d'e-mails à l'aide de Python.
import sys Importe le module de paramètres et de fonctions spécifiques au système, utilisé pour obtenir les arguments de ligne de commande.
from email.mime.text import MIMEText Importe la classe MIMEText pour créer des messages électroniques textuels.
from email.mime.multipart import MIMEMultipart Importe la classe MIMEMultipart pour créer des messages électroniques en plusieurs parties.
msg.attach(MIMEText('text', 'plain')) Joint un corps de texte brut au message électronique.
with smtplib.SMTP(server) as smtp Ouvre une connexion au serveur SMTP et s'assure qu'elle est correctement fermée après l'envoi de l'e-mail.
postmap /etc/postfix/transport Génère une base de données binaire à partir du fichier de carte de transport, utilisé par Postfix pour le routage du courrier.
systemctl reload postfix Recharge la configuration de Postfix sans arrêter le service, en appliquant les modifications apportées.

Comprendre l'intégration de Postfix et Python

Les scripts fournis sont conçus pour transférer les e-mails vers deux serveurs SMTP, garantissant que les deux serveurs reçoivent le même e-mail. Le script Python, multi_forward.py, utilise le import smtplib bibliothèque pour gérer l’envoi d’e-mails. Il importe sys pour obtenir des arguments de ligne de commande, tels que l'expéditeur et le destinataire. Le script construit l'e-mail en utilisant from email.mime.text import MIMEText et from email.mime.multipart import MIMEMultipart pour créer et joindre le corps de l'e-mail. Il parcourt ensuite une liste de serveurs SMTP et envoie l'e-mail à chacun d'entre eux en utilisant with smtplib.SMTP(server) as smtp.

Côté Postfix, la configuration implique de modifier le /etc/postfix/master.cf fichier pour définir la prestation de transport personnalisée, multi_forward, qui utilise le script Python. Le /etc/postfix/main.cf Le fichier est mis à jour pour inclure une carte de transport, spécifiée dans /etc/postfix/transport. La commande dix crée une base de données binaire à partir de la carte de transport, et systemctl reload postfix applique les modifications de configuration sans arrêter le service Postfix. Cette configuration garantit que tout e-mail envoyé à example.com est traité par le script Python et transmis aux deux serveurs SMTP.

Transférer des e-mails vers plusieurs serveurs SMTP avec Python

Utiliser Python pour gérer le transfert 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)

Configurer Postfix pour utiliser le script Python

Configuration Postfix pour le transfert de courrier personnalisé

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

Améliorer les fonctionnalités de Postfix avec des outils supplémentaires

Une autre approche pour transférer des e-mails vers plusieurs serveurs SMTP consiste à utiliser des outils et des configurations Postfix supplémentaires. Un de ces outils est celui de Postfix sender_dependent_relayhost_maps, qui permet de spécifier différents hôtes relais en fonction de l'adresse de l'expéditeur. Bien que cette fonctionnalité soit généralement utilisée pour acheminer le courrier sortant via différents hôtes relais, elle peut être adaptée à notre cas d'utilisation avec une configuration créative. Par exemple, une combinaison de virtual_alias_maps et recipient_bcc_maps pourrait être utilisé pour dupliquer des e-mails et les transférer vers différentes adresses, qui sont ensuite acheminées vers les serveurs respectifs.

De plus, intégrer Postfix avec un filtre de messagerie comme Amavisd-new ou Procmail pourrait offrir plus de flexibilité dans la gestion et le routage des e-mails. Ces filtres peuvent traiter les e-mails lors de leur passage via Postfix, permettant ainsi à des scripts ou à des règles personnalisés de dupliquer et de transférer les messages vers plusieurs destinations. Bien que cette configuration puisse être plus complexe que l'utilisation d'un simple script Python, elle peut offrir une plus grande fiabilité et évolutivité pour les environnements nécessitant des capacités robustes de traitement des e-mails.

Questions courantes et solutions pour le transfert d'e-mails Postfix

  1. Comment puis-je configurer plusieurs enregistrements MX dans DNS ?
  2. Malheureusement, les enregistrements DNS MX ne prennent en charge que le mappage vers un serveur par niveau de priorité. Cette approche ne fonctionnera donc pas pour le transfert vers plusieurs serveurs simultanément.
  3. Quel est le but du transport_maps directif?
  4. Le transport_maps La directive dans Postfix spécifie le mappage des adresses e-mail ou des domaines vers des méthodes et destinations de transport de courrier spécifiques.
  5. Peut sender_dependent_relayhost_maps aider dans ce scénario?
  6. Oui, sender_dependent_relayhost_maps peut acheminer les e-mails via différents hôtes relais en fonction de l'adresse de l'expéditeur, mais il doit être adapté de manière créative pour le transfert vers plusieurs serveurs.
  7. Comment virtual_alias_maps travailler avec Postfix ?
  8. Le virtual_alias_maps La directive permet à Postfix de mapper les adresses e-mail à d’autres adresses, permettant ainsi le transfert et la redirection des e-mails.
  9. Quel est le rôle de recipient_bcc_maps?
  10. Le recipient_bcc_maps La directive permet à Postfix d'ajouter automatiquement des destinataires BCC aux e-mails entrants, ce qui est utile pour la duplication des messages.
  11. Puis-je utiliser Amavisd-new avec Postfix pour le transfert d'e-mails ?
  12. Oui, Amavisd-new peut être intégré à Postfix pour appliquer des règles de filtrage et de transfert personnalisées, offrant ainsi plus de contrôle sur le traitement des e-mails.
  13. Quel est le master.cf fichier utilisé pour?
  14. Le master.cf dans Postfix définit les processus de livraison du courrier et leurs configurations, y compris les services de transport personnalisés.
  15. Comment mettre à jour le transport map base de données?
  16. Utilisez le dix commande pour créer ou mettre à jour la base de données binaire à partir du fichier de carte de transport.
  17. Pourquoi le rechargement de Postfix est-il important ?
  18. Recharger Postfix avec systemctl reload postfix applique les modifications de configuration sans arrêter le service, garantissant ainsi un fonctionnement fluide.
  19. Qu'est-ce que smtplib utilisé en Python ?
  20. Le smtplib La bibliothèque en Python est utilisée pour envoyer des e-mails via SMTP, permettant aux scripts de gérer la transmission d'e-mails par programme.

Réflexions finales sur le transfert vers deux serveurs

La configuration de Postfix pour transférer des messages vers plusieurs serveurs SMTP implique une combinaison de scripts personnalisés et de configurations Postfix détaillées. Bien que les premières tentatives utilisant DNS ou de simples scripts Python n'offrent pas la fiabilité requise, l'intégration de fonctionnalités et d'outils avancés de Postfix comme Amavisd-new ou Procmail peut fournir une solution plus robuste. En configurant soigneusement les cartes de transport, les cartes d'alias virtuels et les cartes BCC des destinataires, vous pouvez garantir un transfert de messages transparent et efficace vers les serveurs James et Winmail. Cette approche garantit que votre infrastructure de messagerie reste résiliente et capable de gérer des exigences de routage complexes.