You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Exim中仅为WordPress/PHP应用发送的邮件添加X-Report-Abuse头

解决Exim仅为WordPress/PHP应用邮件添加X-Report-Abuse头的问题

首先得搞清楚为什么你之前的配置没生效:PHP/WordPress应用发送邮件,通常不是通过邮件客户端那种远程SMTP提交,而是通过服务器本地的sendmail命令,或者直接连接Exim的本地端口。这时候Exim使用的传输逻辑和邮件客户端提交的场景不一样,所以remote_smtp里的配置不会触发。

下面给你几个精准的解决方案,按推荐程度排序:

方案1:按PHP运行用户匹配(最准确)

PHP一般运行在www-data用户下(可以用id -u www-data确认UID,通常是33)。我们可以在传输规则里添加条件,只有当邮件是这个用户发送的时,才添加头。

修改你的remote_smtp传输配置:

remote_smtp:
  driver = smtp
  dkim_domain = ${lc:${domain:$h_from:}}
  dkim_selector = x
  dkim_private_key = /etc/exim/dkim.private.key
  dkim_canon = relaxed
  headers_add = ${if eq{$sender_uid}{33}{X-Report-Abuse: Please report any abuse text}{}}

这里的33替换成你实际的www-data UID就行。这样只有PHP进程发送的邮件会带上这个头,邮件客户端的不受影响。

方案2:用ACL在邮件接收阶段添加头

如果想更灵活,也可以在Exim的ACL(访问控制列表)里设置规则。找到Exim主配置里的acl_check_data段(负责检查邮件内容的ACL),添加以下规则:

acl_check_data:
  # 保留原有规则,新增下面的warn动作
  warn
    condition = ${if eq{$sender_uid}{33}{yes}{no}}
    add_header = X-Report-Abuse: Please report any abuse text

warn动作只会添加头,不会拦截邮件,非常安全。同样,把33换成你的PHP运行用户UID。

方案3:按WordPress的发件邮箱匹配

如果你的WordPress固定用某个邮箱发邮件(比如no-reply@yourdomain.com),可以直接匹配From头:
在remote_smtp里修改:

headers_add = ${if eq{$h_from:}{no-reply@yourdomain.com}{X-Report-Abuse: Please report any abuse text}{}}

或者在ACL里:

warn
    condition = ${if eq{$h_from:}{no-reply@yourdomain.com}{yes}{no}}
    add_header = X-Report-Abuse: Please report any abuse text

这个方案适合WordPress发件邮箱固定的场景,但如果有多个站点用不同邮箱,就需要调整条件。

测试方法

配置完后,重启Exim(systemctl restart exim或systemctl restart exim4),然后:

  • 用WordPress发一封测试邮件,查看邮件头,确认X-Report-Abuse存在;
  • 用邮件客户端发一封邮件,确认这个头没有被添加(如果你的需求是仅针对PHP的话)。

如果PHP是通过本地SMTP连接Exim而不是sendmail,那$sender_uid可能不生效,这时候可以换成匹配$sender_host_address为127.0.0.1,但要注意这个会匹配所有本地发送的邮件,包括邮件客户端,所以最好结合其他条件一起用。

内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:12:15