如何将电子邮件转发到多个 SMTP 服务器

如何将电子邮件转发到多个 SMTP 服务器
如何将电子邮件转发到多个 SMTP 服务器

设置双 SMTP 转发

管理具有相同用户帐户的多个电子邮件服务器可能具有挑战性。在此场景中,当向 example.com 上的用户发送电子邮件时,需要同时被 james 和 winmail 服务器接收,以确保电子邮件内容保持不变。

常见的解决方案(例如在 DNS 中配置多个 MX 记录)存在不足,因为它们一次只能将 example.com 定向到一台服务器。使用 Postfix 在没有本地存储的情况下将电子邮件转发到两台服务器已被证明很复杂,导致使用 smtplib 等解决方案可能不可靠。让我们探索更好的替代方案。

命令 描述
import smtplib 导入简单邮件传输协议库以使用 Python 发送电子邮件。
import sys 导入系统特定的参数和函数模块,用于获取命令行参数。
from email.mime.text import MIMEText 导入 MIMEText 类以创建基于文本的电子邮件。
from email.mime.multipart import MIMEMultipart 导入 MIMEMultipart 类以创建多部分电子邮件。
msg.attach(MIMEText('text', 'plain')) 将纯文本正文附加到电子邮件中。
with smtplib.SMTP(server) as smtp 打开与 SMTP 服务器的连接并确保在发送电子邮件后正确关闭该连接。
postmap /etc/postfix/transport 从传输映射文件生成二进制数据库,由 Postfix 用于邮件路由。
systemctl reload postfix 重新加载 Postfix 配置而不停止服务,应用所做的任何更改。

了解 Postfix 和 Python 集成

提供的脚本旨在将电子邮件转发到两个 SMTP 服务器,确保两个服务器收到相同的电子邮件。 Python 脚本, multi_forward.py,使用 import smtplib 处理电子邮件发送的库。它进口 sys 获取命令行参数,例如发件人和收件人。该脚本使用以下内容构建电子邮件 from email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipart 创建并附加电子邮件正文。然后,它迭代 SMTP 服务器列表,并使用以下命令将电子邮件发送到每个服务器: with smtplib.SMTP(server) as smtp

在 Postfix 端,配置涉及修改 /etc/postfix/master.cf 文件来定义自定义传输服务, multi_forward,它使用 Python 脚本。这 /etc/postfix/main.cf 文件被更新以包含传输映射,该映射在 /etc/postfix/transport。命令 postmap /etc/postfix/transport 从传输映射创建一个二进制数据库,并且 systemctl reload postfix 应用配置更改而不停止 Postfix 服务。此设置可确保发送到 example.com 的任何电子邮件均由 Python 脚本处理并转发到两个 SMTP 服务器。

使用 Python 将电子邮件转发到多个 SMTP 服务器

使用Python处理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)

配置 Postfix 以使用 Python 脚本

用于自定义邮件转发的 Postfix 配置

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

将电子邮件转发到多个 SMTP 服务器的另一种方法是使用其他 Postfix 工具和配置。 Postfix 就是这样的工具之一 sender_dependent_relayhost_maps,它允许根据发件人的地址指定不同的中继主机。虽然此功能通常用于通过不同的中继主机路由外发邮件,但它可以通过一些创造性的配置来适应我们的用例。例如,组合 virtual_alias_mapsrecipient_bcc_maps 可用于复制电子邮件并将其转发到不同的地址,然后将其路由到各自的服务器。

此外,将 Postfix 与邮件过滤器集成,例如 Amavisd-new 或者 Procmail 可以在处理和路由电子邮件方面提供更大的灵活性。这些过滤器可以在电子邮件通过 Postfix 时对其进行处理,从而允许自定义脚本或规则将邮件复制并转发到多个目的地。虽然此设置可能比使用简单的 Python 脚本更复杂,但它可以为需要强大电子邮件处理功能的环境提供更高的可靠性和可扩展性。

Postfix 电子邮件转发的常见问题和解决方案

  1. 如何在 DNS 中配置多个 MX 记录?
  2. 不幸的是,DNS MX 记录仅支持每个优先级映射到一台服务器,因此这种方法不适用于同时转发到多个服务器。
  3. 目的是什么 17 号 指示?
  4. 17 号 Postfix 中的指令指定电子邮件地址或域到特定邮件传输方法和目的地的映射。
  5. sender_dependent_relayhost_maps 在这种情况下有帮助吗?
  6. 是的, sender_dependent_relayhost_maps 可以根据发件人地址通过不同的中继主机路由电子邮件,但需要创造性地进行调整以转发到多个服务器。
  7. 如何 virtual_alias_maps 在 Postfix 工作?
  8. virtual_alias_maps 指令允许 Postfix 将电子邮件地址映射到其他地址,从而实现电子邮件的转发和重定向。
  9. 的作用是什么 recipient_bcc_maps
  10. recipient_bcc_maps 指令允许 Postfix 自动将密件抄送收件人添加到传入电子邮件中,这对于复制邮件很有用。
  11. 我可以用吗 Amavisd-new 使用 Postfix 进行电子邮件转发?
  12. 是的, Amavisd-new 可以与 Postfix 集成以应用自定义过滤和转发规则,从而提供对电子邮件处理的更多控制。
  13. 是什么 master.cf 文件用于?
  14. master.cf Postfix 中的文件定义了邮件传递过程及其配置,包括自定义传输服务。
  15. 我该如何更新 transport map 数据库?
  16. 使用 postmap /etc/postfix/transport 用于从传输映射文件创建或更新二进制数据库的命令。
  17. 为什么重新加载 Postfix 很重要?
  18. 重新加载 Postfix systemctl reload postfix 在不停止服务的情况下应用配置更改,确保平稳运行。
  19. 什么是 smtplib 在Python中用于什么?
  20. smtplib Python 中的库用于通过 SMTP 发送电子邮件,允许脚本以编程方式处理电子邮件传输。

关于双服务器转发的最终想法

设置 Postfix 将邮件转发到多个 SMTP 服务器涉及自定义脚本和详细 Postfix 配置的组合。虽然使用 DNS 或简单 Python 脚本的初步尝试可能无法提供所需的可靠性,但集成高级 Postfix 功能和工具(如 Amavisd-new 或 Procmail)可以提供更强大的解决方案。通过仔细配置传输映射、虚拟别名映射和收件人密件抄送映射,您可以确保将邮件无缝且高效地转发到 james 和 winmail 服务器。这种方法可确保您的电子邮件基础设施保持弹性并能够处理复杂的路由要求。