在 SMTP 事务中添加所有这些检查之后,我们可能会发现自己间接地制造了附带垃圾邮件,这是由于拒绝了来自受信任来源(例如邮件列表和其他站点上的邮件帐户)转发的邮件(有关详细信息,请参阅关于转发邮件的讨论)。我们现在需要将这些主机加入白名单,以便豁免它们于 SMTP 拒绝——至少是那些由我们的垃圾邮件和/或病毒过滤引起的拒绝。
在此示例中,我们将针对每个 RCPT TO: 命令查询两个文件
一个全局白名单位于/etc/mail/whitelist-hosts,其中包含备份 MX 主机和其他加入白名单的发送者 [1],以及
一个用户特定的列表位于/home/user/.forwarders,指定该特定用户将从哪些主机接收转发的邮件(例如,邮件列表服务器、其他地方帐户的传出邮件服务器...)
如果您的邮件用户没有本地用户帐户和主目录,您可能需要修改文件路径和/或查找机制,以使其更适合您的系统(例如,数据库查找或 LDAP 查询)。
如果在其中一个白名单中找到发送主机,我们将单词 "accept" 保存在$acl_m0中,并清除$acl_m1的内容,如前一节关于选择性延迟中所述。这将表明我们不应在后续语句中拒绝邮件。
在 acl_rcpt_to 中,我们在验证收件人地址之后,但在任何accept语句之前插入以下语句,这些语句与来自远程主机到本地用户的未经验证的传递有关(即,在任何灰名单检查、信封签名检查等之前)
# Accept the mail if the sending host is matched in the global
# whitelist file. Temporarily set $acl_m9 to point to this file.
# If the host is found, set a flag in $acl_m0 and clear $acl_m1 to
# indicate that we should not reject this mail later.
#
accept
set acl_m9 = /etc/mail/whitelist-hosts
hosts = ${if exists {$acl_m9}{$acl_m9}}
set acl_m0 = accept
set acl_m1 =
# Accept the mail if the sending host is matched in the ".forwarders"
# file in the recipient's home directory. Temporarily set $acl_m9 to
# point to this file. If the host is found, set a flag in $acl_m0 and
# clear $acl_m1 to indicate that we should not reject this mail later.
#
accept
domains = +local_domains
set acl_m9 = /home/${extract{1}{=}{${lc:$local_part}}}/.forwarders
hosts = ${if exists {$acl_m9}{$acl_m9}}
set acl_m0 = accept
set acl_m1 =
|
在 acl_data ACL 中的各种语句中,我们检查$acl_m0的内容,以避免由于缺少 RFC2822 标头而拒绝来自白名单主机的邮件,如果如上所述设置了此项
deny
message = Your message does not conform to RFC2822 standard
log_message = missing header lines
!hosts = +relay_from_hosts
!senders = : postmaster@*
condition = ${if !eq {$acl_m0}{accept}{true}}
condition = ${if or {{!def:h_Message-ID:}\
{!def:h_Date:}\
{!def:h_Subject:}} {true}{false}}
|
适当的检查嵌入在最终 ACL 中,接下来。