使用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映射。 与往常一样,如果您发现此帖子有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂

Sidebar