【问题标题】:How to make procmail forward and BCC too如何使procmail转发和密件抄送
【发布时间】:2018-06-01 00:06:08
【问题描述】:

我正在尝试将与特定模式匹配的电子邮件转发到一组地址,并将同一电子邮件密件抄送给其他一些电子邮件地址。从我的 procmail 日志看,我的所有规则似乎都匹配,但密件抄送收件人没有收到邮件。

我的 .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 变量包含要密件抄送的地址,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: 标头,并且电子邮件按我的预期转发。我从我的研究中收集到的假设是,我需要在转发中添加一个“密件抄送:”标头,sendmail 会将邮件复制到它指定的任何地址,并在实际发送的内容中去掉密件抄送:标头电子邮件。但是我不能 100% 确定,因为我发现的所有关于 BCC 的问题都涉及希望在 incoming 消息上触发 BCC 的人,如果配置了发送服务器,则无法真正做到这一点正确。

我是不是做错了什么?

【问题讨论】:

  • downvoter 关心我如何改进问题?

标签: procmail


【解决方案1】:

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

! $DEST

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

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

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

! $DEST $BCCS

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

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

【讨论】:

  • 根据你想要完成的事情,也许重构最后一个条件来检查BCCS - 如果DEST BCCS 是,你想转发也许是非空的?我想也许不是。
  • 如果DEST 不为空,我们想转发它。假设如果DEST 为空,那么BCCS 也将是空的,但反之则不然。
  • ! $DEST $BCCS会不会只是简单的转发到BCC列表而不是盲目的转发? (也就是说,不是每个人都可以看到谁在密件抄送列表中吗?)
  • 不,我再说一遍:这完全绕过了消息头。消息作为不透明的数据 blob 传递给 Sendmail 命令行上的收件人,而无需修改。
  • (您甚至可以发送不是有效电子邮件的内容,尽管它很可能会被 receiving MTA 严重破坏。)
【解决方案2】:

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

【讨论】:

  • sendmail proper 的行为显然与您描述的一样,尽管没有明确记录。 -t 的 Postfix sendmail 行为在 2.1 中更改,显然是出于 Sendmail 兼容性的原因;当使用-t 时,旧版本也不允许传入显式收件人。在这种极端情况下,我会犹豫是否依赖任何特定行为。
  • @tripleee 谢谢。我确实写过我不鼓励使用它。
  • 好吧。我觉得自己像个假人。当然,一切都是密件抄送,似乎是寄给原始收件人的。我怎么会错过这个重要的细节?那是缺失的部分,也是我感到困惑的原因......:D
  • 我猜这条评论属于我的回答下的讨论?如果问题现在解决了,请继续接受答案(如果现有的不符合您的喜好,请自己写一个)。
猜你喜欢
  • 1970-01-01
  • 2013-06-08
  • 2015-10-01
  • 1970-01-01
  • 2014-10-28
  • 2015-12-19
  • 1970-01-01
  • 2011-04-02
  • 2023-03-20
相关资源
最近更新 更多