如何使procmail转发和BCC也是如此

时间:2018-06-01 00:06:09

标签: procmail

我试图将匹配某种模式的电子邮件转发到一组地址,并将同一封电子邮件发送到其他一些电子邮件地址。从查看我的procmail日志,看来我的所有规则都匹配,但BCC收件人没有收到该消息。

我的.procmailrc的相关行如下所示:

:0fhw
* ^From.*@example.com
* ! ^X-Loop: test
| formail -A "Bcc: $BCCS"

:0fhw
* ^From.*@example.com
* ! ^X-Loop: test
| formail -A "X-Loop: test"

:0
* ^From.*@example.com
* ! $DEST ?? ^$
! $DEST

到达procmailrc的这一部分时,BCCS变量包含到BCC的地址,DEST变量包含要转发到的地址。

在日志中我看到类似这样的内容:

procmail: Match on "^From.*@example.com"
procmail: Match on ! "^X-Loop: test"
procmail: Executing "formail,-A,Bcc: bcctest@somewhere.com"
procmail: Match on "^From.*@example.com"
procmail: Match on ! "^X-Loop: test"
procmail: Executing "formail,-A,X-Loop: test"
procmail: Match on "^From.*@example.com"
procmail: Match on ! "^$"
procmail: Executing "/usr/sbin/sendmail,-oi,user1@somewhere.com,user2@somewhere.com"
procmail: Assigning "LASTFOLDER=/usr/sbin/sendmail -oi user1@somewhere.com,user2@somewhere.com"
procmail: Notified comsat: "michael@:/usr/sbin/sendmail -oi user1@somewhere.com,user2@somewhere.com"

似乎正在添加Bcc:标头,并按照我的预期转发电子邮件。我从我的研究中收集到的假设是,对于前锋中的BCC,我需要添加一个"密送:" header,sendmail会将邮件复制到它指定的任何地址,并在实际发送的电子邮件中删除Bcc:header。但是我并不是100%肯定,因为我发现的关于BCC的所有问题都与想要在传入消息上触发BCC的人打交道,如果发送服务器真的可以做到这一点配置正确。

我做错了吗?

2 个答案:

答案 0 :(得分:1)

这一切都解决了一个非常常见的常见问题解答:标题最终不会决定消息实际传递到何处。你的行动

! $DEST

告诉Sendmail将邮件发送到$DEST,而不是其他任何地方。

(您可以告诉Sendmail使用sendmail -t实际检查收件人标头。)

根据这种理解,您实际上可以删除配方以添加显式Bcc:标题,只需将最后一行更改为

! $DEST $BCCS

(两次调用formail无论如何都是多余的。它有时是有用且必要的,但你可以在同一个-A调用中有两个formail选项。但添加密件抄送没有用; Sendmail会再次将其剥离。)

使用Sendmail -t(其中Procmail内部可用于操作! -t),会检查标题To:Cc:Bcc:等,并将解析出的地址复制到外发邮件的信封收件人。如果没有-t,命令行参数将被复制为信封收件人,并且不会查询标头。一旦消息在envelpe中,只有信封信息决定它的去向。

答案 1 :(得分:1)

formail -A "Bcc: $BCCS"添加了“密件抄送:”标头。 ! $DEST将邮件转发给“$ DEST”,但! ...将忽略“密件抄送:”标头。 ! ...有效地像Bcc一样工作(除了没有添加和删除标题)。您可以使用2条规则代替第3个转发规则,其中第1条规则适用于邮件的副本(请注意第1条规则中的 c 标记):

:0 c
* ^From.*@example.com
* ! $BCC ?? ^$
! $BCC

:0
* ^From.*@example.com
* ! $DEST ?? ^$
! $DEST

另一种选择是sendmail -t。它从邮件头读取收件人,因此它也会看到您的“密件抄送:”标题并相应地处理邮件。我建议不要使用sendmail -t,除非你有一个非常受控制的环境,你确定在你不知道的消息中没有“To:”,“CC:”和“BCC:”标题我想要。

默认情况下,Procmail使用sendmail,而非sendmail -t。因此,您必须将消息传递给sendmail -t,如

:0
* ^From.*@example.com
* ! $DEST ?? ^$
| sendmail -i -t $DEST