是否有一种方法可以让 Postfix 仅在您经过身份验证的情况下通过邮件过滤器发送邮件?
例如,如果你不是经过验证,我希望有
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
如果你是经过验证,我希望有
smtpd_milters = inet:localhost:8891,inet:localhost:7357
non_smtpd_milters = inet:localhost:8891,inet:localhost:7357
谢谢!
答案1
虽然不完全符合您的要求,但通常足以满足常见用例的要求:配置单独的端口,身份验证绝不允许,并且必需的。这可能已经符合您的使用情况:MUA 将邮件提交到端口 465,始终进行身份验证 - 其他服务器将邮件提交到端口 25,从不进行身份验证。
然后,您可以为每个端口配置不同的过滤器列表。然后,您的额外过滤器将只处理经过验证的提交 - 因为只有这些提交才会在过滤器所连接的端口上被接受。
-o
在 Postfix 中,您可以通过将选项附加到文件中的相关服务定义轻松地做到这一点master.cf
。
我的示例在 main.cf 中定义了 milter 列表,然后从 master.cf 中引用这些列表:
# in main.cf:
my_auth_milters = inet:localhost:8891,inet:localhost:7357
my_unauth_milters = inet:localhost:8891
# in master.cf
smtp inet [..] smtpd
-o smtpd_sasl_auth_enable=no
-o smtpd_milters=$my_unauth_milters
-o non_smtpd_milters=$my_unauth_milters
smtps inet [..] smtpd
[..]
-o smtpd_sasl_auth_enable=yes
-o smtpd_[..]_restrictions=permit_sasl_authenticated,reject
-o smtpd_milters=$my_auth_milters
-o non_smtpd_milters=$my_auth_milters
[..]
我添加了smtpd_[..]_restrictions
一个提醒来修改(不经检查的替换可能会覆盖有意的限制!)这些端口的一些限制设置需要身份验证(如果尚未这样配置的话)。
答案2
无法像问题中那样直接执行。Postfix 中预设的唯一条件 milter 调用是检查源 IP 地址。
但是,通过拆分“接收”路径和“提交”路径的管道,您可以实现这一点。我建议无论 milter 设置如何都这样做,因为这种设置更容易管理。实际上,您可以通过以下方式做到这一点:
smtpd
端口上的服务应tcp/25
为仅用于服务器间的服务,不应支持身份验证。它仅用于远程服务器向您发送邮件。它不应有第二个邮件过滤器。
smtpd
端口上的服务应tcp/587
为专用submission
服务。它必须启用身份验证,并且只应为经过身份验证的用户转发邮件。它应包括两个邮件过滤器。的默认变体master.cf
包括此服务的定义,它只是被注释掉了,您需要取消注释并添加您的邮件过滤器配置覆盖:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
-o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=$mua_client_restrictions
-o smtpd_helo_restrictions=$mua_helo_restrictions
-o smtpd_sender_restrictions=$mua_sender_restrictions
-o smtpd_recipient_restrictions=
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
-o smtpd_milters=$mua_milters
(最后一行是针对您的情况添加的覆盖。请注意“=”周围不能有空格!)。
您main.cf
需要定义这四个变量;最有趣的是最后一个:
smtpd_milters = inet:localhost:8891
mua_milters = inet:localhost:8891,inet:localhost:7357
non_smtpd_milters = $mua_milters
现在,默认smtpd
服务将使用第一个设置,而submission
服务将使用第二个变体。
没有必要覆盖submission
服务中非 smtpd 邮件过滤器的设置,因为 smtpd 服务不使用该设置。非 smtpd 邮件过滤器仅在未使用 SMTP 注入的邮件(例如使用本地命令本地发送的邮件)时调用sendmail
,因此一般应将它们视为经过身份验证的客户端。这就是我将其设置为与 MUA 相同的值的原因。
最后,让所有 MUA(Thunderbird、RoundCube 等)在端口 587 上使用 ESMTP 提交邮件。如上所定义,配置需要使用 STARTTLS 加密,因此您可能还想使用来自 Let's Encrypt 等的全局信任证书和 Postfix。