如何配置Procmail实现邮件转发并同时设置密送(BCC)?
问题分析与解决方案
你的问题核心在于对sendmail处理邮件头的逻辑理解有误——sendmail不会自动解析邮件头中的Bcc字段来添加信封收件人。邮件头里的Bcc只是一个显示用的元数据(通常最终会被投递系统移除),真正决定邮件发送到哪个地址的是信封收件人列表,也就是你传给sendmail的命令行参数。
为什么当前配置不生效?
看你的.procmailrc和日志:
- 前两个规则确实用
formail给邮件添加了Bcc头,但这只是修改了邮件内容本身; - 第三个规则执行
! $DEST时,只把$DEST里的地址传给了sendmail作为信封收件人,$BCCS里的地址根本不在sendmail的收件人列表里,所以自然收不到邮件。
修正后的配置方案
推荐两种简单可靠的实现方式:
方案一:合并收件人到sendmail命令行
直接把密送地址和转发地址一起传给sendmail,这样所有收件人都在信封列表里,同时可以避免在邮件头暴露密送地址(符合BCC的隐私要求):
:0 * ^From.*@example.com * ! ^X-Loop: test { # 添加X-Loop防止邮件循环 :0fhw | formail -A "X-Loop: test" # 同时发送给转发地址和密送地址 ! $DEST $BCCS }
方案二:用Procmail抄送规则单独处理密送
如果你想分开管理转发和密送逻辑,可以用:0c(抄送副本)规则,它会保留原邮件继续处理,同时发送一份独立副本:
:0 * ^From.*@example.com * ! ^X-Loop: test { :0fhw | formail -A "X-Loop: test" # 转发给目标地址 :0 ! $DEST # 密送给指定地址(:0c表示发送副本,不消耗原邮件) :0c ! $BCCS }
额外优化建议
你原来的配置把相同匹配条件拆成了三个独立规则,不仅重复执行匹配逻辑,还容易出错。合并成一个规则块后,逻辑更清晰,执行效率也更高。
内容的提问来源于stack exchange,提问作者Michael




