如何将spamd连接与Postfix邮件ID关联起来?
我理解你的痛点——Postfix日志里明明白白带着邮件队列ID,可spamd的日志完全没这个信息,没法把两者对应起来,排查问题的时候太麻烦了。针对Ubuntu 22.04上的Postfix+procmail+spamd组合,我给你两个实用的解决办法:
方法一:通过Message-ID关联(无需修改太多配置)
这个方法的核心是让Postfix把邮件的Message-ID也写到日志里,而spamd日志本身已经记录了Message-ID,这样就能通过这个唯一标识把两边的日志对应起来。
步骤如下:
- 新建/编辑Postfix的header检查规则文件:
sudo nano /etc/postfix/header_checks
在里面添加一行:/^Message-ID:/ WARN - 打开Postfix主配置文件:
sudo nano /etc/postfix/main.cf,添加或修改以下配置:header_checks = regexp:/etc/postfix/header_checks - 重启Postfix生效:
sudo systemctl restart postfix
之后Postfix的日志里会多出一条WARN级别的记录,里面包含Message-ID、发件人、收件人信息,比如:
Jul 30 07:54:18 alice postfix/smtpd[235768]: WARNING: header Message-ID: NM63EC74D6C01FA8E1Fbootsuk_mid_prod1-Ym91bmNlQG1haWwuYm9vdHMuY29t@mail.boots.com from mail.boots.com[1.2.3.4]; from=bounce@mail.boots.com to=slucy@ourdomainhere.com proto=ESMTP helo=<mail.boots.com>
你只需要把这个Message-ID和spamd日志里的对应起来,再结合Postfix qmgr日志里的队列ID,就能完美关联上同一份邮件的两条日志流了。
方法二:直接在spamd日志里显示Postfix队列ID(更直观)
这个方法是让procmail把Postfix的队列ID传递给spamd,再让spamd把这个ID写到日志里,一步到位直接关联。
步骤如下:
修改用户的procmail配置(比如
~/.procmailrc,如果是系统级配置就改/etc/procmailrc),找到调用spamc的规则,改成这样::0fw | spamc --set-header "X-Queue-ID: $queue_id"这里的
$queue_id是Postfix传递给procmail的环境变量,直接就能拿到队列ID。这条规则会给邮件添加一个X-Queue-ID头,值就是Postfix的队列ID。修改spamd的启动配置,让它记录这个自定义头:
打开spamd的默认配置文件:sudo nano /etc/default/spamassassin,找到OPTIONS行,添加--log-headers=X-Queue-ID参数,比如:OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir /var/lib/spamassassin -x --log-headers=X-Queue-ID"重启spamd生效:
sudo systemctl restart spamassassin
之后你看spamd的日志,就会直接显示Postfix的队列ID了,比如:
Jul 30 07:54:23 alice spamd[1860392]: spamd: clean message (-3.1/7.8) for slucy:1832 in 5.0 seconds, 61039 bytes. X-Queue-ID: 2C704BA328
这样一眼就能把spamd的处理记录和Postfix的队列ID对应上,非常直观。
备注:内容来源于stack exchange,提问作者TommyPeanuts

