我已经在 Exim 上设置了 DKIM,域名设置如下:
DKIM_DOMAIN = ${sender_address_domain}
但是,域始终设置为同一个域(我的主域),这会导致在为其他域(我托管多个网站)发送电子邮件时,由于对齐而导致 DMARC 验证失败。
通过阅读文档,我认为 sender_address_domain 是信封地址,而不是发件人字段。我如何更改信封地址以使其与给定电子邮件的发件人字段匹配(我认为这也会使 SPF 对齐正确)?
此外,为了安全起见,是否可以有一个允许域的白名单,这样 Exim 就会拒绝发送发件人字段中包含其他域的电子邮件?
答案1
将重写规则添加到 Exim4 配置中:
*@+local_domains "${local_part}@${domain}" F
该规则重写 Envelope-from 标头以匹配 From 标头,从而使 DMARC 对齐正常工作。建议将其附加到部分末尾,以避免与当前规则冲突。
您可以在文件或文件的/etc/exim4/conf.d/rewrite/10_from_rewrite
部分(对于 Debian)中找到此配置。这取决于您的配置类型——称为rewrite/31_exim4-config_rewriting
/etc/exim4/exim4.conf.template
单一整体或拆分 Exim4 配置文件可能需要运行命令update-exim4.conf
。
重新配置后使用重新启动 Exim systemctl restart Exim4
。
规则解释:
*
=适用*@+local_domains
于所有“local_parts”,例如用户。+local_domains
= 适用于 Exim4 服务器提供服务的所有域(在dc_other_hostnames
和dc_readhost
变量中定义),而不适用于其他域(重定向尝试等)。${local_part}@${domain}
从发件人字段编写符合 RFC2822 的电子邮件地址。变量的描述见exim4 文档 – 字符串扩展。您可以只使用“$header_from:”,但地址格式应为“John Doe <[电子邮件保护]>”将会失败并且会因为“John Doe”部分而被记录到 paniclog。F
= 重写操作的目标字段是 Envelope-from。参见exim4 文档 – 地址重写。
答案2
添加重写规则:
* "${address:$header_from:}" F
从标题${address:$header_from:}
中提取地址From
F
意味着重写 Envelope-from 字段。
在 Debian 中,可以通过创建诸如 的文件来添加此项/etc/exim4/conf.d/rewrite/10_from_rewrite
。此规则重写发件人字段以匹配发件人标头,从而使 DMARC 对齐正常工作。
对于白名单,我们可以添加系统过滤器。首先创建过滤器文件(例如/etc/exim4/exim.filter
):
# Exim filter
if not foranyaddress "domain1.com, domain2.com" ($thisaddress is "${domain:$header_from:}")
then fail "${domain:$header_from:} not permitted to send email" endif
然后在配置的主要部分的某处添加system_filter = /etc/exim4/exim.filter
。
我还没有找到在这个过滤器中使用 domainlist/local_domains 的任何方法。