我试图将匹配某种模式的电子邮件转发到一组地址,并将同一封电子邮件发送到其他一些电子邮件地址。从查看我的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的人打交道,如果发送服务器真的可以做到这一点配置正确。
我做错了吗?
答案 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