Postfix псевдонимы и дубликаты электронных писем, как исправить?

18

У меня есть псевдонимы, настроенные в postfix, например:

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

Когда электронное письмо отправляется на all@mydomain.com, и любой из получателей с таким псевдонимом является cc: ed, что является довольно распространенным (то есть: «Ответить всем»), электронное письмо доставляется в двух экземплярах. Например, если электронное письмо отправлено на адрес all@mydomain.com, а foo@mydomain.com - cc: ed, оно будет доставлено дважды. Согласно FAQ по Postfix , это сделано специально, поскольку Postfix отправляет электронную почту параллельно, не расширяя группы, что делает его быстрее, чем sendmail. Теперь все нормально, но возможно ли настроить Postfix так, чтобы он фактически удалял дубликатов получателей перед отправкой электронной почты?

Я нашел много сообщений от людей по всей сети, которые имеют ту же проблему, но я еще не нашел ответа. Если это невозможно сделать в Postfix, возможно ли это сделать где-нибудь в пути? Я пытался обучить своих пользователей, но я боюсь, что это бесполезно ...

Я использую postfix на Mac OS X Server 10.6, amavis установлен как content_filter, а dovecot установлен как mailbox_command. Я попытался настроить procmail в качестве content_filter для доставки SMTP (согласно предложению ниже), но я не могу сделать это правильно. По разным причинам я не могу заменить стандартную конфигурацию OS X, то есть postfix, amavis и dovecot остаются на месте. Однако я могу добавить к этому, если я хочу.

Маркус Стаде
источник
Я думаю, что на самом деле это просто невозможно ...
Антуан Бенкемун
Я действительно начинаю верить, что ты прав, Антуан.
Маркус Стаде
Ну, это была пустая трата награды ...
Маркус Стаде
2
Вы когда-нибудь находили решение для этого? У меня та же проблема.
Томми Арнольд

Ответы:

4

Postfix не имеет представления о дубликатах электронных писем из-за их структуры. Можно сделать то, что вы предлагаете, используя procmail в качестве агента доставки.

По сути, каждое сообщение от клиента должно доставляться с уникальным идентификатором сообщения. В случае, если он доставлен нескольким людям, идентификатор сообщения должен быть одинаковым, поэтому мы сохраняем все Message-Idзаголовки, которые мы видели, и отбрасываем и будущие, которые соответствуют этому списку.

С http://novosial.org/procmail/

:0 Wh: msgid.lock
| formail -D 8192 ~/.procmail/msgid.cache
Филип Рейнольдс
источник
Если я правильно понимаю проблему, ее невозможно решить в Postfix, потому что Postfix отправляет электронные письма параллельно, то есть отправляет на foo@mydomain.com одновременно с расширением all@mydomain.com и затем снова отправляет на foo@mydomain.com. Разве решение Procmail тогда, возможно, не введет условие состязания, когда другое несвязанное электронное письмо (с другим идентификатором сообщения) отправляется между двумя рассматриваемыми электронными письмами и, таким образом, перезаписывает кеш, делая его таким образом, чтобы дублирующиеся электронные письма были доставили как нибудь?
Маркус Стаде
Я пытаюсь заставить ваше предложение работать, но я не совсем уверен, как совместить это с доставкой dovecot, которая используется OS X 10.5+ по умолчанию.
Маркус Стаде
Если вы используете dovecot в качестве агента доставки, вы можете использовать procmail как a, content_filterкоторый позволит вам выполнить ту же задачу на глобальном уровне
Филипп Рейнольдс
Я должен признаться, что я, вероятно, в пути над моей головой здесь. Я слепо пялился на страницу параметров конфигурации для postfix и гуглял до тех пор, пока у меня не потекли пальцы, но я не могу понять, как это настроить. Любые ресурсы, которые вы можете знать или подтолкнуть в правильном направлении, будут действительно оценены!
Маркус Стаде
Я думаю, что-то понимаю, как это работает сейчас, но уже есть content_filter для amavis. Это похоже на антивирусную проверку. Я читал, что можно связать content_filters, но это кажется довольно не интуитивно понятным, а документация менее звездной. Это действительно довольно смешно, как трудно просто отсеять дубликаты электронных писем. Независимо от дизайна, мне кажется, что он должен быть готовым или, по крайней мере, не требовать этих чудовищных хаков.
Маркус Стаде
3

Есть способ сделать это, но не использовать сам Postfix.

Если вы используете относительно свежую версию Dovecot с реализацией Sieve в Pigeonhole , есть специальное расширение, которое можно использовать для дедупликации при доставке. В Dovecot старше 2.2.18 это расширение называется «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 docs.

Если вы используете Cyrus, есть функция подавления доставки дублирующихся сообщений, которую можно включить с помощью suppress_duplicates = yes.

Ян Гадачек
источник
Огромное спасибо за указание на этот механизм. Это чувство "найти иголку в стоге сена".
Lkraav
Открытия при реализации: duplicateрасширение работает на уровне пользователя. Я пытался остановить дубликаты над несколькими пользователями To / Cc-d в центральном fileintoпочтовом ящике. Это не работает Пришлось также установить virtual_alias_mapsпост-фиксированную запись-ловушку, например @domain.com catchall@domain.com, проверка двойного сита попадет catchallв список дубликатов пользователя.
Lkraav
Да, это очень похоже на чувство «найти иголку в стоге сена»
Net Runner
0

Это из какого-то старого постфикса faq:

Postfix отправляет дубликаты почты. Некоторые люди будут жаловаться, что Postfix отправляет дубликаты сообщений. Это происходит всякий раз, когда одно сообщение отправляется на несколько адресов, адресованных одному и тому же пользователю. Примеры таких сценариев:

  • Одно сообщение отправляется пользователю и псевдониму, в котором указан пользователь. Пользователь получает одну копию письма напрямую и одну копию через псевдоним.

    • Одно сообщение отправляется нескольким псевдонимам, которые перечисляют пользователя. Пользователь получает одну копию письма через каждый псевдоним.

Некоторые люди даже утверждают, что это «правильное» поведение. Вероятно, это скорее вопрос ожидания и того, к чему привык.

Это можно исправить, только сделав Postfix медленнее. В приведенных выше примерах Postfix должен был бы сначала полностью развернуть все списки рассылки перед началом любой доставки. По замыслу, Postfix доставляет почту в разные места назначения параллельно, и локальная доставка не является исключением. Вот почему Postfix может быть быстрее, чем sendmail.

Итак, по замыслу вы видите это поведение. Возможно, если вы обнаружите фильтр содержимого, который может удалить дубликаты идентификаторов сообщений, вы можете устранить это после события доставки.

Sendmail не имеет этой проблемы, потому что он сначала все расширяет и удаляет дубликаты.

jeffatrackaid
источник
Да, я прочитал это, возможно, я должен был обновить свой вопрос. По дизайну или нет, это все еще проблема. Я понимаю, почему он ведет себя так, как он делает, и я понимаю, что пытаться найти решение в Postfix бесполезно. Тем не менее, я попытался придумать какое-то решение для фильтрации контента с использованием Procmail, и я просто не могу понять, что это правильно. Весьма вероятно, что я неправильно понимаю фильтры содержимого или procmail, или и то, и другое. В любом случае я все еще хотел бы это исправить. К сожалению, настройки, как они есть, не могут быть изменены, только добавлены. Я не могу использовать sendmail вместо postfix, к сожалению.
Маркус Стаде
Я обновил вопрос, добавив больше информации, но, честно говоря, там была ссылка на FAQ. Я ценю любые полезные предложения, хотя!
Маркус Стаде
Не понял, что это была ссылка на тот же контент. Работая в сфере информационной безопасности, вы становитесь довольно параноидально относиться к случайным ссылкам. Можете ли вы подтвердить, что дубликаты сообщений имеют одинаковые идентификаторы?
Jeffatrackaid
Был долгий день, поэтому мне нужно просмотреть исходное сообщение, но как насчет этого: postfix.org/postconf.5.html#duplicate_filter_limit
jeffatrackaid
Я действительно могу подтвердить, что дубликаты сообщений имеют одинаковые идентификаторы сообщений. Установка duplicate_filter_limit не поможет, к сожалению.
Маркус Стаде
0

Официальное решение здесь. Http://osdir.com/ml/mail.postfix.devel/2007-05/msg00010.html

duplicate_filter_limit (10000) Максимальное количество адресов, запоминаемых дублирующимися фильтрами получателей для расширения псевдонимов (5) или виртуальных (5), или для отображений очереди showq (8) (в более ранних выпусках Postfix ограничение по умолчанию составляло 1000).

duplicate_filter_style (строгий) Политика фильтра дубликатов получателей: строгая или прагматичная.


источник
1
Это, кажется, ничего не делает ...
grufftech
postfix.1071664.n5.nabble.com/… утверждает, что это никогда не было реализовано
Янко Эрнандес Альварес
0
enable_original_recipient=no

Я поместил это в свой main.cf, и он работал нормально, но только для почты, отправленной с моего домена. У меня все еще есть дубликаты, если я отправляю электронную почту за пределами моего домена (например, на мой домен.)

источник: http://article.gmane.org/gmane.mail.postfix.user/119783

ychaouche
источник