Postfix队列后内容过滤器完整示例及第24行过滤逻辑实现咨询
Postfix 简单内容过滤器可直接使用的实现示例
以下提供3种生产环境常用的过滤逻辑,可直接替换原脚本第24~26行使用,也可叠加多个逻辑组合使用。
常用过滤逻辑片段
1. 敏感关键词拦截
检测邮件主题、正文是否包含指定敏感词,匹配则直接拒收:
# 可自行修改/增加禁止关键词,多个关键词用|分隔,-i参数代表不区分大小写 grep -iE "敏感词1|敏感词2|赌博|诈骗" in.$$ >/dev/null && { echo "Message contains forbidden content, rejected"; exit $EX_UNAVAILABLE; }
2. 危险附件后缀拦截
禁止exe、bat等可执行文件作为附件发送,降低病毒传播风险:
# 可自行添加需要禁止的附件后缀 grep -iE "filename=.*\.(exe|bat|js|vbs|cmd|scr|pif)" in.$$ >/dev/null && { echo "Message contains forbidden attachment type, rejected"; exit $EX_UNAVAILABLE; }
3. 发件人黑名单拦截
拒收指定发件人地址的邮件:
# 可自行添加黑名单发件人地址 grep -iE "^From:.*(baduser1@example.com|baduser2@example.com)" in.$$ >/dev/null && { echo "Sender is in blacklist, rejected"; exit $EX_UNAVAILABLE; }
完整整合版示例脚本
以下为整合了关键词+附件拦截逻辑的完整可运行脚本:
#!/bin/sh # Simple shell-based filter. It is meant to be invoked as follows: # /path/to/script -f sender recipients... # Localize these. The -G option does nothing before Postfix 2.3. INSPECT_DIR=/var/spool/filter SENDMAIL="/usr/sbin/sendmail -G -i" # NEVER NEVER NEVER use "-t" here. # Exit codes from <sysexits.h> EX_TEMPFAIL=75 EX_UNAVAILABLE=69 # Clean up when done or when aborting. trap "rm -f in.$$" 0 1 2 3 15 # Start processing. cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; } cat >in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; } # ------------自定义过滤逻辑开始------------ # 1. 敏感关键词拦截 grep -iE "敏感词1|敏感词2|赌博|诈骗" in.$$ >/dev/null && { echo "Message contains forbidden content, rejected"; exit $EX_UNAVAILABLE; } # 2. 危险附件后缀拦截 grep -iE "filename=.*\.(exe|bat|js|vbs|cmd|scr|pif)" in.$$ >/dev/null && { echo "Message contains forbidden attachment type, rejected"; exit $EX_UNAVAILABLE; } # ------------自定义过滤逻辑结束------------ $SENDMAIL "$@" <in.$$ exit $?
部署注意事项
- 需提前创建
/var/spool/filter目录,权限设置为700,属主和属组设为postfix:postfix,确保postfix服务有权限读写 - 脚本本身权限需设置为
700,属主和属组同样设为postfix:postfix,避免被其他用户篡改 - 可根据业务需求自行调整过滤规则,也可新增其他自定义过滤逻辑,多个逻辑按从上到下顺序校验,任意规则匹配就会直接拒收邮件
内容的提问来源于stack exchange,提问作者Byte legion
相关产品推荐
相关产品推荐

