Linux环境下MTA的邮件自动回复与转发规则配置需求
Linux环境下MTA的邮件自动回复与转发规则配置需求
嗨,我来给你一步步拆解怎么用你现在的Postfix搞定这些需求,没必要换Exim,省得重新搭环境折腾——Postfix的灵活性完全能覆盖这一套规则,而且你已经在用它了,上手肯定更快。
先再明确下你的核心场景:你有个即将停用的域subdomain.domain.tld,要针对不同收件人、不同发件人来源,实现自动回复、转发或者丢弃的差异化逻辑,还有50个左右的有效用户要单独处理对吧?
一、前置准备
先确保你的Postfix装了pcre扩展(用来做正则匹配,区分不同地址)和postfix-vacation(专门处理自动回复的工具),大部分Linux发行版直接用包管理器就能装,比如Debian/Ubuntu用apt install postfix-pcre postfix-vacation,CentOS/RHEL用dnf install postfix-pcre postfix-vacation就行。
二、分场景配置规则
1. 针对important@subdomain.domain.tld的双逻辑处理
这个地址是特殊的,要区分内部(@domain.tld)和外部发件人:
- 先在Postfix的主配置文件
/etc/postfix/main.cf里启用虚拟别名和发件人匹配:virtual_alias_maps = pcre:/etc/postfix/virtual_alias_pcre sender_dependent_relayhost_maps = pcre:/etc/postfix/sender_check_pcre - 编辑
/etc/postfix/virtual_alias_pcre,给这个特殊地址设置转发规则(外部发件人触发):
这里/^important@subdomain\.domain\.tld$/ important@newdomain.tld, vacation-important@subdomain.domain.tldvacation-important是咱们专门建的自动回复账号,后面要给它配两种回复内容。 - 接下来区分发件人域,编辑
/etc/postfix/sender_check_pcre,让内部发件人不触发转发:
意思是如果发件人是*@domain.tld*的内部用户,就只发自动回复;外部发件人则同时发回复+转发邮件到新地址。/^.*@domain\.tld$/ DISABLE_RELAY - 最后用
procmail来控制不同发件人的回复内容(比纯vacation更灵活),在/etc/procmailrc里加这段规则:
然后分别给:0 * ^To: important@subdomain\.domain\.tld { # 内部发件人:只发自定义回复 :0 c * ^From: .*@domain\.tld | vacation -a important@subdomain.domain.tld -s "内部通知:邮箱变更" vacation-internal # 外部发件人:发自定义回复+转发 :0 c * !^From: .*@domain\.tld | vacation -a important@subdomain.domain.tld -s "外部通知:邮箱迁移" vacation-external :0 ! important@newdomain.tld }vacation-internal和vacation-external设置回复内容,比如用vacation -d subdomain.domain.tld vacation-internal,跟着提示输入内部用户的专属回复就行。
2. 50个有效用户的通用规则
除了important之外的50个有效用户,要发“该地址已停用”的自动回复然后丢弃邮件:
- 先把所有有效用户列在
/etc/postfix/valid_users文件里,格式如下:user1@subdomain.domain.tld vacation-user1@subdomain.domain.tld user2@subdomain.domain.tld vacation-user2@subdomain.domain.tld ... - 回到
main.cf,把这个有效用户列表加入虚拟别名映射:virtual_alias_maps = hash:/etc/postfix/valid_users, pcre:/etc/postfix/virtual_alias_pcre - 然后用批量命令给每个有效用户的自动回复账号配置统一的通用回复:
这样每个有效用户收到邮件时,都会自动发送这段通用回复,Postfix处理后会直接丢弃原邮件。for user in $(cut -d' ' -f1 /etc/postfix/valid_users); do vacation -d subdomain.domain.tld -s "邮箱停用通知" $(echo $user | cut -d'@' -f1) << EOF 您好,该邮箱地址已不再使用,您发送的邮件将被丢弃。 EOF done
3. 非有效用户的处理
对于不在有效列表里的*@subdomain.domain.tld*地址,直接返回“该用户不存在”的提示然后丢弃:
- 在
main.cf里添加未知收件人的处理规则:unknown_local_recipient_reject_code = 550 virtual_alias_maps = hash:/etc/postfix/valid_users, pcre:/etc/postfix/virtual_alias_pcre, regexp:/etc/postfix/unknown_users - 编辑
/etc/postfix/unknown_users,设置统一的错误提示:
这样非有效用户的邮件会直接被Postfix返回550错误(也就是用户看到的“地址不存在”提示),同时原邮件被丢弃。/^.*@subdomain\.domain\.tld$/ 550 5.1.1 <$recipient>: Recipient address rejected: This user does not exist
三、配置生效与测试
所有配置改完后,记得重载Postfix让配置生效:
postmap /etc/postfix/valid_users postmap /etc/postfix/virtual_alias_pcre postmap /etc/postfix/sender_check_pcre systemctl reload postfix
然后可以用swaks或者sendmail测试不同场景,比如:
- 用user@domain.tld发邮件给important@subdomain.domain.tld,看是否只收到内部回复
- 用user@otherdomain.tld发邮件给important@subdomain.domain.tld,看是否收到外部回复+邮件被转发到important@newdomain.tld
- 用任意发件人给有效用户发邮件,看是否收到通用停用回复
- 给一个不在有效列表里的地址发邮件,看是否收到“不存在”的错误提示
备注:内容来源于stack exchange,提问作者Sitron_NO
相关产品推荐
相关产品推荐

