Postfix别名和重复的电子邮件,如何解决?


18

我在后缀中设置了别名,例如:

all@mydomain.com:    foo@mydomain.com, bar@mydomain.com ...

当电子邮件发送到all@mydomain.com,并且该别名中的任何收件人都是抄送的(即:“全部答复”)时,该电子邮件将重复发送。例如,如果一封电子邮件发送到all@mydomain.com,并且cc @ ed foo@mydomain.com,它将被发送两次。根据Postfix FAQ,这是设计使然,因为Postfix在不扩展组的情况下并行发送电子邮件,这使其比sendmail更快。现在一切都很好,但是可以配置Postfix在发送电子邮件之前实际删除重复的收件人吗?

我发现网上有很多人也有同样的问题,但是我还没有找到答案。如果在Postfix中无法做到这一点,那么是否可以在途中的某处做到这一点?我已经尝试过教育用户,但是恐怕这是徒劳的...

我在Mac OS X Server 10.6上运行postfix,将amavis设置为content_filter,将dovecot设置为mailbox_command。我已经尝试将procmail设置为content_filter以便进行smtp传递(按照下面的建议),但是我似乎无法正确处理它。由于各种原因,我无法替换标准的OS X配置,这意味着后缀,amavis和dovecot保持不变。但是,我可以根据需要添加。


我认为这真的是不可能的……
Antoine Benkemoun 2010年

我真的开始相信你是正确的安东尼。
Marcus Stade

好吧,这是在浪费赏金...
Marcus Stade 2010年

2
您是否找到了解决方案?我有同样的问题。
汤米·阿诺德

Answers:


4

由于结构的原因,Postfix对重复的电子邮件一无所知。通过将procmail用作传递代理,可以完成您的建议。

本质上,来自客户端的每条消息都应传递一个唯一的Message-Id。在将其传递给多个人的情况下,Message-Id应该相同,因此我们将保存Message-Id已看到并丢弃的所有标头以及将来与该列表匹配的标头。

http://novosial.org/procmail/

:0 Wh: msgid.lock
| formail -D 8192 ~/.procmail/msgid.cache

如果我正确理解问题,则无法在Postfix中解决,因为Postfix会并行发送电子邮件,即在扩展all@mydomain.com的同时将其发送到foo@mydomain.com,然后再次发送发送至foo@mydomain.com。然后,Procmail解决方案可能不会引入竞争状态,即在有问题的两封电子邮件之间发送另一封不相关的电子邮件(具有不同的消息ID),从而覆盖缓存使其成为重复的电子邮件交付了吗?
Marcus Stade '02

我正在尝试让您的建议起作用,但是我不确定如何将它与dovecot交付结合使用,默认情况下,OS X 10.5+会使用dovecot交付。
Marcus Stade

如果您将dovecot用作传递代理,则可以将procmail用作,content_filter这将使您可以在全球范围内执行相同的任务
Philip Reynolds,2010年

我不得不承认,我可能在这里不知所措。我一直在盲目地盯着配置参数页面上的后缀和谷歌搜索,直到手指流血为止,但是我似乎无法弄清楚如何配置它。您可能会了解或向正确的方向转移的任何资源将不胜感激!
Marcus Stade '02

我想我有点理解它现在是如何工作的,但是已经有一个content_filter设置为amavis。这似乎是某种反病毒检查程序。我已经读到可以链接content_filters的方法,但这似乎很不直观,而且文档也不是很出色。清除重复的电子邮件有多么困难,这确实是非常荒谬的。无论如何设计,在我看来这似乎应该是开箱即用的,或者至少不需要这些monstruos hack。
Marcus Stade'2

3

有一种方法可以执行此操作,但不使用Postfix本身。

如果您正在使用带有Dovecot 的Sieve的Pigeonhole实现,则有一个特殊的扩展名可以用于交付时重复数据删除。在版本低于2.2.18的Dovecot中,此扩展名是“ vnd.dovecot.duplicate”,并且默认情况下处于禁用状态。在较新的发行版中,该扩展名为“ duplicate”,应已启用,但明确启用则不会危害。

/etc/dovecot/conf.d/90-sieve.conf:

plugin {
  sieve = ~/.dovecot.sieve
  sieve_dir = ~/sieve

  sieve_before = /mnt/mail/users/global_sieve/deduplicate.sieve
  # sieve_before2 = /mnt/mail/users/global_sieve/antispam.sieve

  sieve_extensions = +vnd.dovecot.duplicate  # for dovecot < 2.2.18
  #sieve_extensions = +duplicate             # for dovecot >= 2.2.18
}

然后创建sieve脚本来处理重复数据删除本身(您可以根据需要调整文件名)。

/mnt/mail/users/global_sieve/deduplicate.sieve:

require "vnd.dovecot.duplicate"; # for dovecot < 2.2.18
# require "duplicate";           # for dovecot >= 2.2.18

if duplicate {
    discard;
    stop;
}

使用sievec编译脚本,并确保dovecot用户可读该脚本。Dovecot文档中的更多内容。

如果您使用的是Cyrus,则可以使用启用重复邮件传递抑制功能suppress_duplicates = yes


非常感谢您指出此机制。那种“在大海捞针”的感觉。
lkraav

实施过程中的发现:duplicate扩展在用户级别起作用。我试图停止中央fileinto邮箱中多个用户To / Cc-d的重复。这行不通。还必须设置一个后缀virtual_alias_maps全部输入,例如@domain.com catchall@domain.com,那么筛网重复检查将命中catchall用户的重复列表。
lkraav

是的,这非常类似于“在大海捞针”的感觉
Net Runner


0

这是从一些旧的postfix常见问题解答中得出的:

Postfix发送重复邮件有些人会抱怨Postfix发送重复邮件。只要将一封邮件邮寄到到达同一用户的多个地址,就会发生这种情况。此类方案的示例包括:

  • 一条消息发送给用户,并发送给列出该用户的别名。用户直接收到一份邮件副本,并通过别名收到一份副本。

    • 一条消息发送到列出用户的多个别名。用户通过每个别名收到邮件的一个副本。

甚至有人会认为这是“正确”的行为。这可能更多是关于期望和习惯的问题。

这只能通过使Postfix变慢来“修复”。在以上示例中,Postfix首先必须完全扩展所有分发列表,然后再开始任何传递。按照设计,Postfix将邮件并行传递到不同的目的地,本地传递也不例外。这就是为什么Postfix可以比sendmail更快的原因。

因此,通过设计,您可以看到这种行为。也许,如果您找到一个可以去除重复邮件ID的内容过滤器,则可以在传递事件之后消除这种情况。

Sendmail没有此问题,因为它首先扩展了所有内容并去除了重复项。


是的,我读过,也许我应该更新我的问题。无论是否设计,这仍然是一个问题。我了解为什么它的行为方式,并且我知道尝试在Postfix中找到解决方案是徒劳的。但是,我尝试使用Procmail提出一些内容过滤器解决方案,但似乎无法正确解决。我很可能无法正确理解内容过滤器或procmail,或两者都不正确。无论哪种情况,我仍然都想解决。不幸的是,设置不能被修改,只能被添加。不幸的是,我不能使用sendmail代替postfix。
Marcus Stade

我用更多信息更新了该问题,但是老实说,常见问题解答的链接是从那里开始的。我确实感谢任何有用的建议!
Marcus Stade

没意识到那是指向相同内容的链接。在从事IT安全工作时,您对单击随机链接变得非常偏执。您可以确认重复的邮件具有相同的邮件ID吗?
jeffatrackaid 2010年


我确实可以确认重复的消息具有相同的消息ID。不幸的是,设置duplicate_filter_limit没有任何帮助。
Marcus Stade '02

0

该公报的解决方案是在这里.. http://osdir.com/ml/mail.postfix.devel/2007-05/msg00010.html

repeat_filter_limit(10000)收件人重复过滤器为aliases(5)或virtual(5)别名扩展或showq(8)队列显示而记住的最大地址数(对于较早的Postfix版本,默认限制为1000)。

repeat_filter_style(严格)重复收件人筛选器策略:严格或实用。


1
这似乎什么也没做……
grufftech


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.