我已经设置了一个带有 SMTP AUTH(端口 587 上的 STARTTLS)的 Postfix 服务器。我的所有用户都在域“example.org”中。我想强制将发件人地址设置为“[电子邮件保护]“。
我了解到这可以通过 main.cf 选项实现
smtpd_sender_restrictions = reject_sender_login_mismatch, ...
smtpd_sender_login_maps = hash:/etc/postfix/smtpd_sender_login_maps
使用如下的 login_maps 文件:
[email protected] a
[email protected] b
[email protected] c
...
(也可以看看使用 SMPT AUTH 阻止发件人地址欺骗),但这意味着每次有新用户时我都必须编辑 login_maps 文件。我不需要如此灵活的映射:它应该始终是“[电子邮件保护]“。有没有更简单的选择?
答案1
首先,通过输入命令postconf -m
并查找其中的行来检查您安装的 Postfix 是否支持 pcre pcre
。一旦您验证了您有 pcre 支持,您可以执行以下操作:
/etc/postfix/login_maps.pcre
:
/^(.*)@example\.org$/ ${1}
在main.cf
:
smtpd_sender_login_maps = pcre:/etc/postfix/login_maps.pcre
这应该可以正常工作。
答案2
其他答案中提到的正则表达式与电子邮件地址的用户部分匹配(登录用户@example.org)。以下是一些附加信息。
要使用完整的电子邮件地址作为用户名,请使用以下正则表达式(例如/etc/postfix/login_map
):
/^(.*)$/ ${1}
这意味着您的用户名始终是您的完整电子邮件地址([电子邮件保护]) - 不允许从该地址发送其他现有用户名 - 并且您不必在每次添加用户时更新额外的 Postfix 配置文件。
这可能用于配置了多个域的服务器上。用户[电子邮件保护]只允许从该地址发送,但不允许从[电子邮件保护](不同的用户和电子邮件,不同的人)。用户名约翰·多伊在这种情况下会产生歧义。
此外,根据您的配置,必须指向此文件的 smtpd_sender_login_maps 设置可能位于 master.cf(而不是 main.cf)中。官方Dovecot 文档中有以下示例(如果您使用 SASL/submission):
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_sasl_local_domain=$myhostname
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sender_login_maps=hash:/etc/postfix/virtual
-o smtpd_sender_restrictions=reject_sender_login_mismatch
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
在此示例中,应调整设置以指向正确的文件并使用正则表达式或(更好的)pcre 作为类型。特别是如果名为“virtual”的文件已用于其他用途(例如virtual_alias_maps,如 Postfix 官方示例所示),应使用另一个文件进行登录映射。
从:
smtpd_sender_login_maps=hash:/etc/postfix/virtual
到:
smtpd_sender_login_maps=pcre:/etc/postfix/login_map
答案3
您可以在标题上使用正则表达式组合,如下所示:http://www.akadia.com/services/postfix_uce.html? 然后您可以结合正则表达式如 [*@example.org] 来确保只有来自 example.org 的发件人。