Configurar el reenvío SMTP dual
Administrar varios servidores de correo electrónico con cuentas de usuario idénticas puede resultar un desafío. En este escenario, cuando se envía un correo electrónico a un usuario en ejemplo.com, debe ser recibido por los servidores james y winmail, asegurando que el contenido del correo electrónico permanezca sin cambios.
Las soluciones comunes, como la configuración de múltiples registros MX en DNS, se quedan cortas ya que solo pueden dirigir example.com a un único servidor a la vez. El uso de Postfix para reenviar correos electrónicos a ambos servidores sin almacenamiento local ha resultado complejo, lo que ha llevado a soluciones como secuencias de comandos con smtplib, que pueden no ser confiables. Exploremos mejores alternativas.
Dominio | Descripción |
---|---|
import smtplib | Importa la biblioteca del Protocolo simple de transferencia de correo para enviar correos electrónicos utilizando Python. |
import sys | Importa el módulo de funciones y parámetros específicos del sistema, que se utiliza para obtener argumentos de la línea de comandos. |
from email.mime.text import MIMEText | Importa la clase MIMEText para crear mensajes de correo electrónico basados en texto. |
from email.mime.multipart import MIMEMultipart | Importa la clase MIMEMultipart para crear mensajes de correo electrónico de varias partes. |
msg.attach(MIMEText('text', 'plain')) | Adjunta un cuerpo de texto sin formato al mensaje de correo electrónico. |
with smtplib.SMTP(server) as smtp | Abre una conexión al servidor SMTP y garantiza que se cierre correctamente después de enviar el correo electrónico. |
postmap /etc/postfix/transport | Genera una base de datos binaria a partir del archivo del mapa de transporte, utilizada por Postfix para el enrutamiento del correo. |
systemctl reload postfix | Recarga la configuración de Postfix sin detener el servicio, aplicando los cambios realizados. |
Comprender la integración de Postfix y Python
Los scripts proporcionados están diseñados para reenviar correos electrónicos a dos servidores SMTP, asegurando que ambos servidores reciban el mismo correo electrónico. El script Python, multi_forward.py, utiliza el import smtplib Biblioteca para manejar el envío de correo electrónico. importa sys para obtener argumentos de la línea de comandos, como el remitente y el destinatario. El script construye el correo electrónico usando from email.mime.text import MIMEText y from email.mime.multipart import MIMEMultipart para crear y adjuntar el cuerpo del correo electrónico. Luego itera sobre una lista de servidores SMTP y envía el correo electrónico a cada uno usando with smtplib.SMTP(server) as smtp.
En el lado de Postfix, la configuración implica modificar el /etc/postfix/master.cf fichero para definir el servicio de transporte personalizado, multi_forward, que utiliza el script Python. El /etc/postfix/main.cf El archivo se actualiza para incluir un mapa de transporte, que se especifica en /etc/postfix/transport. El comando postmap /etc/postfix/transport crea una base de datos binaria a partir del mapa de transporte, y systemctl reload postfix aplica los cambios de configuración sin detener el servicio Postfix. Esta configuración garantiza que cualquier correo electrónico enviado a example.com sea procesado por el script Python y reenviado a ambos servidores SMTP.
Reenviar correos electrónicos a múltiples servidores SMTP con Python
Usando Python para manejar el reenvío 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)
Configurar Postfix para usar el script Python
Configuración de Postfix para reenvío de correo personalizado
# /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
Mejora de la funcionalidad de Postfix con herramientas adicionales
Otro enfoque para lograr el reenvío de correos electrónicos a múltiples servidores SMTP implica el uso de herramientas y configuraciones adicionales de Postfix. Una de esas herramientas es la de Postfix. sender_dependent_relayhost_maps, que permite especificar diferentes hosts de retransmisión según la dirección del remitente. Si bien esta función se utiliza normalmente para enrutar el correo saliente a través de diferentes hosts de retransmisión, se puede adaptar a nuestro caso de uso con alguna configuración creativa. Por ejemplo, una combinación de virtual_alias_maps y recipient_bcc_maps podría usarse para duplicar correos electrónicos y reenviarlos a diferentes direcciones, que luego se enrutan a los servidores respectivos.
Además, integrar Postfix con un filtro de correo como Amavisd-new o dieciséis podría proporcionar más flexibilidad en el manejo y enrutamiento de correos electrónicos. Estos filtros pueden procesar correos electrónicos a medida que pasan por Postfix, lo que permite que scripts o reglas personalizados dupliquen y reenvíen mensajes a múltiples destinos. Si bien esta configuración puede ser más compleja que usar un simple script de Python, puede ofrecer mayor confiabilidad y escalabilidad para entornos que requieren capacidades sólidas de procesamiento de correo electrónico.
Preguntas y soluciones comunes para el reenvío de correo electrónico de Postfix
- ¿Cómo puedo configurar múltiples registros MX en DNS?
- Desafortunadamente, los registros DNS MX solo admiten la asignación a un servidor por nivel de prioridad, por lo que este enfoque no funcionará para reenviar a varios servidores simultáneamente.
- ¿Cuál es el propósito de la transport_maps ¿directiva?
- El transport_maps La directiva en Postfix especifica la asignación de direcciones de correo electrónico o dominios a métodos y destinos de transporte de correo específicos.
- Poder sender_dependent_relayhost_maps ayuda en este escenario?
- Sí, sender_dependent_relayhost_maps Puede enrutar correos electrónicos a través de diferentes hosts de retransmisión según la dirección del remitente, pero debe adaptarse creativamente para reenviarlos a múltiples servidores.
- Cómo virtual_alias_maps ¿Trabajar en Postfix?
- El virtual_alias_maps La directiva permite a Postfix asignar direcciones de correo electrónico a otras direcciones, lo que permite el reenvío y la redirección de correos electrónicos.
- ¿Cuál es el papel de recipient_bcc_maps?
- El recipient_bcc_maps La directiva permite a Postfix agregar automáticamente destinatarios CCO a los correos electrónicos entrantes, lo que resulta útil para duplicar mensajes.
- Puedo usar Amavisd-new ¿Con Postfix para reenvío de correo electrónico?
- Sí, Amavisd-new se puede integrar con Postfix para aplicar reglas personalizadas de filtrado y reenvío, proporcionando más control sobre el procesamiento del correo electrónico.
- Cuál es el master.cf archivo utilizado para?
- El master.cf El archivo en Postfix define los procesos de entrega de correo y sus configuraciones, incluidos los servicios de transporte personalizados.
- ¿Cómo actualizo el transport map ¿base de datos?
- Utilizar el postmap /etc/postfix/transport comando para crear o actualizar la base de datos binaria desde el archivo del mapa de transporte.
- ¿Por qué es importante recargar Postfix?
- Recargando Postfix con systemctl reload postfix aplica cambios de configuración sin detener el servicio, lo que garantiza un funcionamiento sin problemas.
- Qué es smtplib utilizado en Python?
- El smtplib La biblioteca en Python se utiliza para enviar correos electrónicos a través de SMTP, lo que permite que los scripts manejen la transmisión de correo electrónico mediante programación.
Reflexiones finales sobre el reenvío de servidor dual
Configurar Postfix para reenviar mensajes a múltiples servidores SMTP implica una combinación de scripts personalizados y configuraciones detalladas de Postfix. Si bien los intentos iniciales de utilizar DNS o scripts simples de Python pueden no ofrecer la confiabilidad requerida, la integración de funciones y herramientas avanzadas de Postfix como Amavisd-new o Procmail puede proporcionar una solución más sólida. Al configurar cuidadosamente los mapas de transporte, los mapas de alias virtuales y los mapas BCC de los destinatarios, puede garantizar un reenvío de mensajes fluido y eficiente a los servidores james y winmail. Este enfoque garantiza que su infraestructura de correo electrónico siga siendo resistente y capaz de manejar requisitos de enrutamiento complejos.