使用 Postfix 传输映射和中继主机映射实现灵活的电子邮件传送

在之前的教程中,我们讨论了如何使用 iRedMail 或 Modoboa 快速设置功能齐全的邮件服务器,我们还学习了如何使用 Postfix SMTP 服务器设置 SMTP 中继以绕过端口 25 阻塞或 IP 黑名单。 但是,您可能不想将整个电子邮件服务器设置为使用中继主机。 我们可以配置 Postfix 传输映射和中继映射,这样一些邮件通过中继主机发送,其他邮件直接发送给收件人。

有许多 SMTP 中继服务。 在本教程中,我使用 Sendinblue,它允许您每月免费发送 9000 封电子邮件。 SMTP 中继服务保持良好的 IP 声誉。 他们阻止坏的发件人并培养好的发件人,因此使用 SMTP 中继服务将增加到达收件箱的机会。

如何使用 Postfix 传输映射

传输映射定义了从收件人地址到传输方法的映射。 默认情况下,该值 transport_maps 未设置 Postfix 中的参数,可以通过以下方式检查:

postconf transport_maps

示例输出:

transport_maps =

iRedMail 和 Modoboa 使用 MySQL/MariaDB 数据库来存储交通地图。 如果您使用 iRedMail 来设置邮件服务器,则输出应如下所示:

transport_maps = proxy:mysql:/etc/postfix/mysql/transport_maps_user.cf proxy:mysql:/etc/postfix/mysql/transport_maps_domain.cf

如果您使用 Modoboa 设置邮件服务器,则输出应如下所示:

transport_maps = proxy:mysql:/etc/postfix/sql-transport.cf proxy:mysql:/etc/postfix/sql-spliteddomains-transport.cf

transport_maps 参数指向一个或多个传输查找表。 您可以编辑 Postfix 主配置文件。

sudo nano /etc/postfix/main.cf

并通过在文件末尾添加以下行来设置一个值。 这 /etc/postfix/transport 文件将包含查找表。

transport_maps = hash:/etc/postfix/transport

如果你使用 红邮,你可以找到 transport_maps 参数并将值设置为

transport_maps =     hash:/etc/postfix/transport     proxy:mysql:/etc/postfix/mysql/transport_maps_user.cf     proxy:mysql:/etc/postfix/mysql/transport_maps_domain.cf 

如果你使用 摩多巴,你可以找到 tranport_maps 参数并将值设置为:

transport_maps =         hash:/etc/postfix/transport         proxy:mysql:/etc/postfix/sql-transport.cf         proxy:mysql:/etc/postfix/sql-spliteddomains-transport.cf 

查找表可以是文件,也可以是 MySQL/MariaDB 数据库表的形式。 查找表将按指定的顺序搜索,直到找到匹配项。

Save 和 close Postfix 主配置文件。 接下来,我们需要创建查找表文件。

sudo nano /etc/postfix/transport

在这个文件中,我们可以定义从收件人地址到传输方法的映射。 例如,我发现很多 .pl (波兰)域正在使用一个特定的黑名单来阻止我的邮件服务器的 IP 地址。 我可以在此文件中添加以下行,以便发送到 .pl 域的电子邮件将通过 Sendinblue 中继。

.pl                relay:[smtp-relay.sendinblue.com]:587

有些人发现很难进入 Microsoft 邮箱(hotmail.com、outlook.com 等)的收件箱。 您的电子邮件很可能会被放入垃圾邮件文件夹。 好吧,您可以尝试使用 Sendinblue 向 Microsoft 邮箱用户发送电子邮件。 Sendinblue 甚至允许您查看收件人是否打开或单击了您电子邮件中的链接。 所以我把以下几行放在文件中。

/.*@hotmail.*/i             relay:[smtp-relay.sendinblue.com]:587 /.*@outlook.*/i             relay:[smtp-relay.sendinblue.com]:587 /.*@live.*/i                relay:[smtp-relay.sendinblue.com]:587 /.*@msn.*/i                 relay:[smtp-relay.sendinblue.com]:587

如果您想使用中继主机将电子邮件发送给特定收件人,但将电子邮件直接发送给同一域中的所有其他收件人,那么您可以添加如下一行。

[email protected]           relay:[smtp-relay.sendinblue.com]:587

如果某个 SMTP 服务器不使用默认的 SMTP 端口 25,而是使用不同的端口(例如 2525)来接收传入的电子邮件,则可以添加以下行

example.com        smtp:[mail.example.com]:2525

在这个文件中添加您自己的域名是一个很好的做法,如下所示。

your-domain.com    local

这告诉 Postfix 发送到您自己域的电子邮件应该在本地发送。 这是规范域的默认行为。 如果您的邮件服务器有多个虚拟域,您应该添加所有的虚拟域。

your-domain1.com         local your-domain2.com         local

如果您只在文件中放置以下两行而不添加其他行,这将使所有电子邮件(不包括发送到您自己域的电子邮件)通过中继主机发送。 星号

your-domain.com       local *                     relay:[smtp-relay.sendinblue.com]:587

是代表任何电子邮件地址的通配符。

your-domain.com       local  gmail.com             smtp *                     relay:[smtp-relay.sendinblue.com]:587

Save 我们也可以有以下配置,这意味着发送到您自己域的电子邮件在本地发送。 发送到 gmail.com 的电子邮件通过执行 MX 查找正常发送,所有其他电子邮件通过中继主机发送。 close 和

sudo postmap /etc/postfix/transport

文件。 然后运行以下命令来构建索引文件。

sudo systemctl restart postfix

重新启动 Postfix 以使更改生效。

发件人相关中继映射 sender_dependent_relay_maps 传输映射定义了从收件人地址到传输方法的映射。 如果要定义从发件人地址到中继主机的映射,请使用

postconf sender_dependent_relayhost_maps

范围。 默认情况下,它的值为空,如下所示:

sender_dependent_relayhost_maps =

输出:

sender_dependent_relayhost_maps = proxy:mysql:/etc/postfix/mysql/sender_dependent_relayhost_maps.cf

iRedMail 使用 MySQL/MariaDB 数据库来存储依赖于发送者的中继主机映射。 如果您使用 iRedMail 来设置邮件服务器,则输出应如下所示: sender_dependent_relayhost_maps

sudo nano /etc/postfix/main.cf

参数指向一个或多个查找表。 您可以编辑 Postfix 主配置文件。 /etc/postfix/relay_by_sender 并通过在文件末尾添加以下行来设置一个值。 这

sender_dependent_relayhost_maps = hash:/etc/postfix/relay_by_sender

文件将包含查找表。 sender_dependent_relayhost_maps 如果您使用 iRedMail,您可以找到

sender_dependent_relayhost_maps =     hash:/etc/postfix/relay_by_sender     proxy:mysql:/etc/postfix/mysql/sender_dependent_relayhost_maps.cf 

参数并将值设置为

Save 查找表可以是文件,也可以是 MySQL/MariaDB 数据库表的形式。 查找表将按指定的顺序搜索,直到找到匹配项。 close 和

sudo nano /etc/postfix/relay_by_sender

Postfix 主配置文件。 接下来,我们需要创建查找表文件。 [email protected] 添加如下规则,这将使电子邮件从

[email protected]           [smtp-relay.sendinblue.com]:587 

通过右侧指定的中继主机交付。

domain1.com                     [mail.domain1.com]:587 domain2.com                     [mail.domain2.com]:587

Save 假设您有一个 Linux 服务器托管两个网站,并且每个网站都有自己的邮件服务器运行在两个独立的主机上,那么您可以添加以下两行,使每个网站都使用自己的邮件服务器。 close 和

sudo postmap /etc/postfix/relay_by_sender

文件。 然后构建索引文件。

sudo systemctl restart postfix

重新启动 Postfix 以使更改生效。

设置 SMTP 身份验证

sudo nano /etc/postfix/main.cf

现在我们需要设置 SMTP 身份验证,以便 Postfix SMTP 客户端可以使用中继主机。 编辑 Postfix 主配置文件。 /etc/postfix/sasl_password 在此文件的末尾添加以下行。 这

# outbound relay configurations smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_tls_security_level = may header_size_limit = 4096000

将包含用户名和密码。 relayhost 如果您设置了

relayhost =

Save 参数,那么我建议给它一个像下面这样的空值,因为我们现在使用传输映射和发送者依赖的中继主机映射。 close 和 /etc/postfix/sasl_passwd 文件。 然后创建

sudo nano /etc/postfix/sasl_passwd

文件。 smtp_username 将 SMTP 中继主机和 SMTP 凭据添加到此文件中,如下所示。 代替 smtp_password

[smtp-relay.sendinblue.com]:587            smtp_username:smtp_password

Save 使用 SendinBlue 提供的您自己的用户名和密码。 请注意,用户名和密码之间有一个冒号。 close 和 postmap文件。 然后创建相应的哈希数据库文件

sudo postmap /etc/postfix/sasl_passwd

. /etc/postfix/sasl_passwd.db现在你应该有一个文件

sudo systemctl restart postfix

. 重新启动 Postfix 以使更改生效。 sasl_passwd 默认情况下, sasl_passwd.db

sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

服务器上的任何用户都可以读取文件。 将权限更改为 600,以便只有 root 可以读写这两个文件。

测试/var/log/mail.log 现在,您可以向传输映射中定义的收件人发送测试电子邮件,或从与发件人相关的中继主机映射中指定的地址发送电子邮件。 然后检查邮件日志( /var/log/maillog或者

) 看看它是否有效。

请注意,如果您使用的是 Sendinblue 等第三方 SMTP 中继服务,则可能需要验证您帐户中的域名并编辑 SPF 和 DKIM 记录。

故障排除

错误 #1/var/log/maillog如果您的电子邮件未送达,并且您在邮件日志中发现以下消息 (

Relay access denied (in reply to RCPT TO command))

), /etc/postfix/sasl_passwd 那么你可能需要编辑

smtp-relay.sendinblue.com    smtp_username:smtp_password

Save 文件并删除主机名后的端口号,如下所示。 close 和

sudo postmap /etc/postfix/sasl_passwd

文件。 然后再次构建索引文件。

sudo systemctl restart postfix

重新启动 Postfix 以使更改生效。

sudo postqueue -f

现在您可以刷新电子邮件队列(尝试发送以前的电子邮件)。

错误 #2 sender_dependent_relayhost_maps 注意 smtp不支持特殊关键字: local, smtp 等。如果您在 Postfix 日志中看到以下错误,则表示您使用了

Host or domain name not found. Name service error for name=smtp type=A: Host not found

关键词。

额外提示:smtp_fallback_relay

您可以在 Postfix 中指定回退中继主机。 这样,如果无法到达 SMTP 目标(没有 MX 记录,没有 A 记录)或主要中继主机离线,Postfix 将使用回退中继主机。

sudo nano /etc/postfix/main.cf

编辑主要的 Postfix 配置文件。 secondary.relayhost.com 在此文件中添加以下行。 代替

smtp_fallback_relay = [secondary.relayhost.com]:587

Save 使用实际的中继主机名称。 此中继主机可以来自 Sendinblue 或任何其他 SMTP 中继服务。 close 和 /etc/postfix/sasl_passwd 文件。 然后你应该编辑

文件并为回退中继主机添加 SMTP 凭据,就像上面一样。 最后,重新启动 Postfix 以使更改生效。 笔记

如果 SMTP 目标使用灰名单暂时拒绝电子邮件,那么您的 Postfix SMTP 服务器也将使用回退中继主机。

具有虚拟邮箱的每用户中继规则

假设您已在 Zoho 等第三方服务上设置企业电子邮件。 现在您有一个使用虚拟邮箱的自托管电子邮件服务器。 您希望在 Zoho 上保留旧电子邮件地址,但在您自己的电子邮件服务器中创建新电子邮件地址。 在这种情况下,您需要创建每用户中继规则,以便将发往旧电子邮件地址的电子邮件发送到 Zoho 邮件服务器。

sudo nano /etc/postfix/main.cf

编辑 Postfix 主配置文件。 virtual_mailbox_maps 找出 hash:/etc/postfix/transport 参数并添加

virtual_mailbox_maps =    hash:/etc/postfix/transport    proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,    proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf

Save 到值字段。 close 和 /etc/postfix/transport 文件。 然后在文件,您可以为旧电子邮件地址定义中继规则,如下所示。 (笔记 relay : 也可以用 smtp关键字而不是

[email protected]      smtp:[mx.zoho.com]:25 [email protected]      smtp:[mx.zoho.com]:25 [email protected]      smtp:[mx.zoho.com]:25

Save . 在这种情况下,它们都是正确的。) close 和 /etc/postfix/transport 文件。 然后构建哈希表

sudo postmap /etc/postfix/transport

文件。

sudo systemctl restart postfix

然后重启Postfix。

包起来

我希望本教程可以帮助您使用 Postfix 传输映射和发送方依赖的中继主机映射。 与往常一样,如果您觉得这篇文章有用,请订阅我们的免费时事通讯以获取更多提示和技巧。 保重?