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

如何从Postfix的mail.log提取发件域名并生成自动拒接规则?

自动拦截垃圾邮件发件域名的Postfix配置方案

我之前碰到过一模一样的问题:Postfix已经配了policy-spf和DKIM,虽然能正常拒绝垃圾邮件连接,但手动筛选太麻烦,想通过smtpd_sender_restrictions自动拦截这些垃圾发件域名。

先看一条典型的拒绝日志参考:

Dec 30 07:34:09 mx postfix/smtpd[23855]: NOQUEUE: reject: RCPT from unknown[120.33.244.87]: 450 4.7.1 Client host rejected: cannot find your hostname, [120.33.244.87]; from=hcsales6@printingpress.xicp.net to=nishant@mydomain.com proto=SMTP helo=<printingpress.xicp.net>

之前用Perl命令提取的是IP,不符合需求,后来结合@Polar Bear的方案,整理出了完整的自动拦截流程:

1. 修改Postfix主配置

编辑/etc/postfix/main.cf,添加或更新发件人限制规则,让Postfix读取自定义黑名单:

smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/blacklist

2. 编写自动生成黑名单的脚本

创建blacklist.sh脚本,用来从日志里提取被拒绝的发件域名,去重后写入黑名单:

#!/bin/bash
# 从mail.log中匹配被拒绝的发件域名,输出「域名 REJECT」格式
perl -ne 'print "$1 REJECT\n" if /NOQUEUE:\s+reject:.*?from=<\w+@(.*?)>/' /var/log/mail.log | sort | uniq >> /etc/postfix/blacklist
# 生成Postfix可识别的哈希映射表
postmap /etc/postfix/blacklist
# 重启Postfix使配置生效
service postfix restart

3. 给脚本添加执行权限

chmod 755 blacklist.sh

4. 设置定时任务自动执行

添加cron定时任务,让脚本每天夜间自动运行(比如凌晨2点):

# 打开cron编辑界面
crontab -e
# 添加以下行,替换/path/to为脚本实际路径
0 2 * * * /path/to/blacklist.sh

额外优化:拦截SASL登录失败IP

我还额外加了个每3小时执行的cron任务,专门拦截频繁尝试SASL登录失败的IP,进一步强化服务器的垃圾邮件防御能力。


内容的提问来源于stack exchange,提问作者Sachin G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:04:38