使用Postfix传输映射和Relayhost映射进行灵活的电子邮件传递
在先前的教程中,我们讨论了如何使用iRedMail或Modoboa快速设置功能齐全的邮件服务器,并且还学习了如何使用Postfix SMTP服务器设置SMTP中继以绕过端口25阻止或IP黑名单。 但是,您可能不希望将整个电子邮件服务器设置为使用中继主机。 我们可以配置Postfix传输映射和中继映射,以便通过中继主机传递某些电子邮件,将其他电子邮件直接发送给收件人。
有许多SMTP中继服务。 在本教程中,我使用Mailjet,它使您每月可以免费发送6000封电子邮件。 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
如果您使用iRedMail,则可以找到 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
如果您使用Modoboa,则可以找到 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数据库表的形式。 查找表将按指定顺序搜索,直到找到匹配项。
保存并关闭Postfix主配置文件。 接下来,我们需要创建查找表文件。
sudo nano /etc/postfix/transport
在此文件中,我们可以定义从收件人地址到传输方法的映射。 例如,我发现很多 .pl
(波兰)域使用特定的黑名单阻止了我的邮件服务器的IP地址。 我可以在此文件中添加以下行,以便发送到.pl域的电子邮件将通过Mailjet转发。
.pl relay:[in-v3.mailjet.com]:587
有人发现很难进入Microsoft邮箱(hotmail.com,outlook.com等)的收件箱。 您的电子邮件很有可能会被放入垃圾邮件文件夹。 好了,您可以尝试使用Mailjet将电子邮件传递给Microsoft邮箱用户。 Mailjet甚至允许您查看收件人是否打开或单击了电子邮件中的链接。 因此,我在文件中添加了以下几行。
hotmail.com relay:[in-v3.mailjet.com]:587 hotmail.co.uk relay:[in-v3.mailjet.com]:587 hotmail.fr relay:[in-v3.mailjet.com]:587 hotmail.de relay:[in-v3.mailjet.com]:587 outlook.com relay:[in-v3.mailjet.com]:587 outlook.de relay:[in-v3.mailjet.com]:587 outlook.fr relay:[in-v3.mailjet.com]:587 outlook.be relay:[in-v3.mailjet.com]:587 outlook.in relay:[in-v3.mailjet.com]:587 live.com relay:[in-v3.mailjet.com]:587
如果要使用中继主机将电子邮件传递给特定收件人,但直接将电子邮件发送给同一域中的所有其他收件人,则可以添加如下所示的行。
[email protected] relay:[in-v3.mailjet.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:[in-v3.mailjet.com]:587
是代表任何电子邮件地址的通配符。
your-domain.com local gmail.com smtp * relay:[in-v3.mailjet.com]:587
我们还可以进行以下配置,这意味着发送到您自己的域的电子邮件将在本地传递。 发送到gmail.com的电子邮件通常是通过执行MX查找来传递的,所有其他电子邮件都是通过中继主机传递的。
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数据库存储与发送者相关的Relayhost映射。 如果使用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
参数并将值设置为
查找表可以是文件,也可以是MySQL / MariaDB数据库表的形式。 查找表将按指定顺序搜索,直到找到匹配项。
sudo nano /etc/postfix/relay_by_sender
保存并关闭Postfix主配置文件。 接下来,我们需要创建查找表文件。 [email protected]
添加如下规则,这将使电子邮件从
[email protected] [in-v3.mailjet.com]:587
通过右侧指定的中继主机交付。
domain1.com [mail.domain1.com]:587 domain2.com [mail.domain2.com]:587
假设如果您有一个承载两个网站的Linux服务器,并且每个网站在两个单独的主机上都运行着自己的邮件服务器,那么您可以添加以下两行,以使每个网站使用自己的邮件服务器。
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 =
参数,然后建议给它一个空值,如下所示,因为我们现在正在使用传输映射和依赖于发送者的Relayhost映射。 /etc/postfix/sasl_passwd
保存并关闭文件。 然后创建
sudo nano /etc/postfix/sasl_passwd
文件。 api-key
如下所示,将SMTP中继主机和SMTP凭据添加到此文件。 更换 secret-key
和
in-v3.mailjet.com:587 api-key:secret-key
使用真正的Mailjet API密钥和秘密密钥。 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
要么
)以查看其是否正常运行。
请注意,如果您使用的是Mailjet之类的第三方SMTP中继服务,则可能需要验证帐户中的域名并编辑SPF和DKIM记录。
故障排除/var/log/maillog
如果您的电子邮件没有发送,并且您在邮件日志中找到了以下消息(
Relay access denied (in reply to RCPT TO command))
), /etc/postfix/sasl_passwd
那么您可能需要编辑
in-v3.mailjet.com api-key:secret-key
文件,并删除主机名后面的端口号,如下所示。
sudo postmap /etc/postfix/sasl_passwd
保存并关闭文件。 然后再次构建索引文件。
sudo systemctl restart postfix
重新启动Postfix,以使更改生效。
sudo postqueue -f
现在,您可以刷新电子邮件队列(尝试传递以前的电子邮件)。
额外提示: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
带有实际的中继主机名。 该中继主机可以来自Mailjet或任何其他SMTP中继服务。 /etc/postfix/sasl_passwd
保存并关闭文件。 然后,您应该编辑
文件,并为备用中继主机添加SMTP凭据,就像上面一样。 最后,重新启动Postfix,以使更改生效。 注意
如果SMTP目标使用灰名单暂时拒绝电子邮件,则您的Postfix SMTP服务器还将使用后备中继主机。
包起来
我希望本教程可以帮助您使用Postfix传输映射和依赖于发件人的relayhost映射。 与往常一样,如果您发现此帖子有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂