我在 Exim 中配置了 DKIM 以发送邮件,具体如下:文档。Exim 会对所有外发邮件进行签名。但由于用户.forward
文件的原因,其中一些外发邮件会被转发。这对我来说是个问题,因为其中一些转发是垃圾邮件(我的 Exim 配置不进行任何验证),我不想对它们负责。但我不知道如何配置 Exim 不对这些邮件进行签名。
我的配置基本上是 Debian Squeeze 默认配置,并设置了一些DKIM_*
宏。我可以发布更多详细信息,但我认为看到任何有条件的 DKIM 签名示例都会让我明白。
答案1
有点像旧帖,但我只用了一行:
dkim_private_key = ${if or {{!def:sender_host_address}{def:authenticated_id}}{DKIM_PRIVATE_KEY}{}}
(其中 DKIM_PRIVATE_KEY 是一个宏,提供我的 dkim 私钥的路径)。
然后,如果这是一条“本地发起”的消息(因此 $sender_host_address 未定义)或者电子邮件来自经过身份验证的用户,则会设置 dkim_private_key,并且该消息将被签名。
否则(这应该只是意味着我们正在转发一条消息,假设我们不是一个中继),dkim_private_key 将是空字符串,这(根据规范)意味着该消息不会被签名。
答案2
我有类似的设置(虽然我会对我转发的电子邮件进行垃圾邮件/病毒扫描,我强烈建议你应该我也一样)。我有一个检测转发电子邮件的路由器,一个检测 smtp 身份验证的路由器,以及一个检测来自网络邮件系统的路由器。对于你的情况,你可以使用~/.forward文件来帮助决定它是转发器还是本地交付。每个路由器都设置针对每种情况设计的特定传输。传输是签名完成或未完成的地方。正如您在下面的传输配置中看到的那样,我对 Web 邮件和 smtp 身份验证进行了 DKIM 签名,但没有对转发器进行签名:
remote_smtp_authenticated:
debug_print = "Transport: remote_smtp_authenticated for $local_part@$domain"
driver = smtp
max_rcpt = 10
hosts_max_try = 2
.include_if_exists /etc/exim/dkim_transports.conf
remote_smtp_webmail:
debug_print = "Transport: remote_smtp_webmail for $local_part@$domain"
driver = smtp
max_rcpt = 10
hosts_max_try = 2
.include_if_exists /etc/exim/dkim_transports.conf
remote_smtp_forwarder:
debug_print = "Transport: remote_smtp_forwarder for $local_part@$domain"
driver = smtp
max_rcpt = 10
hosts_max_try = 2
dkim_transports.conf 只是使用一系列专门为我的网站设计的宏来设置所有 dkim_* 设置:
CentOS58[root@ivwm51 exim]# more dkim_transports.conf
.ifdef DKIM_SIGNING
dkim_domain = DKIM_DOMAIN
dkim_selector = DKIM_SELECTOR
dkim_private_key = DKIM_PRIVATE_KEY
.endif
你可以用类似的方法建立自己的模型。
答案3
我只是检查authenticated_sender
多变的当设置时dkim_domain
。
dkim_domain = ${if def:authenticated_sender {DKIM_DOMAIN}}
这包括 SMTP 验证的客户端和本地用户。
您可以将该条件放在任何强制性 DKIM 选项周围,包括dkim_domain
、dkim_selector
或dkim_private_key
。
您还可以构建更复杂的设置,其中选择器根据邮件是本地生成的、来自经过身份验证的客户端的还是转发的而有所不同。这样,您就可以针对三种邮件来源获得不同的声誉。
例如,对经过身份验证的本地消息和转发的消息使用单独的密钥:
dkim_selector = ${if def:authenticated_sender {authenticated}{forwarded}}