Courier Mail Server Forum Index Courier Mail Server
www.courierms.ru
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

v2,3| Удаляем письма-дубликаты, принятые из внешних п/я

 
Post new topic   Reply to topic    Courier Mail Server Forum Index -> Готовые решения
View previous topic :: View next topic  
Author Message
NAMOR
CMS Developer


Joined: 15 Oct 2005
Posts: 1079

PostPosted: 06 May 2012 20:28 (Sun)    Post subject: v2,3| Удаляем письма-дубликаты, принятые из внешних п/я Reply with quote

Удаляем письма-дубликаты, принятые из внешних почтовых ящиков

Проблема:
Периодически одному или нескольким локальным пользователям CMS приходит по нескольку копий одного и того же письма.

Условия и причины возникновения:
Отправитель в почтовом клиенте создаёт и отправляет письмо, адресованное сразу нескольким получателям. Письмо отправляется и доставляется в почтовые ящики получателей. В результате в каждом ящике появляется копия исходного письма.
Далее CMS принимает почту из этих внешних ящиков и получает все находящиеся в них копии. Для CMS эти копии являются разными письмами, для каждого из которых нужно построить список получателей и выполнить доставку по этому списку.
Если CMS настроен так, что письма, принятые из каждого конкретного внешнего ящика доставляются не одному получателю, а могут распределяться между несколькими получателями, то каждая из принятых копий доставляется нескольким одним и тем же получателям. В результате каждому из этих получателей приходит несколько копий одного и того же письма.
Так возникают письма-дубликаты.


Дополнение от 11.08.2016. В CMS 3.07 beta 1 была добавлена возможность отклонения писем-дубликатов, принятых из внешних почтовых ящиков, в связи с чем данное решение более не актуально для этой и последующих версий CMS.
Code:
[+] Флажок "Отклонять дубликаты писем" в свойствах внешнего почтового ящика.


Решение:
Поскольку письма-дубликаты являются копиями одного и того же исходного письма, то в их заголовках поле Message-ID (глобально уникальный идентификатор письма) будет иметь одно и то же значение. В то же время, для разных писем значение поля будет разным (как того требуют интернет-стандарты).
На этих фактах и построено решение.
Работоспособность решения проверена автором на CMS 2.12, CMS 3.05.

1. В папке CMS создаём файл dup_msg_remover.bat со следующим содержанием:
Code:
@echo off

rem ищем указанный Message-ID в базе
find /C %1 dup_msg_remover_db.txt >nul

if errorlevel 1 (

  rem не нашли (новое письмо), добавляем Message-ID в базу
  echo %1 >>dup_msg_remover_db.txt

) else (

  rem нашли (письмо-дубликат), удаляем файл письма
  del %2

)

В CMS:

2. Создаём задание планировщика "Удалить письма-дубликаты":

[x] Запустить приложение
cmd.exe /d /c dup_msg_remover.bat "%MMessage-ID%" Queue\%FileName%.msg
[x] Скрыть окно
[x] Ждать завершения
[x] Принудительно завершить через 10 сек.

Остальные флажки снимаем.

3. Создаём сортировщик "POP3 sorter", в котором создаём правило:

[x] Запустить задание: "Удалить письма-дубликаты"
[x] Ждать завершения
[x] Правило активно

Остальные флажки снимаем.

4. В свойствах каждого внешнего почтового ящика на вкладке "Получатели" настраиваем:

[x] Направить письмо в сортировщик: "POP3 sorter"
[ ] только если получателей нет

Остальные настройки ящиков не меняем.

Если у вас уже создан и используется другой сортировщик для внешних ящиков, то можно в п. 3 сортировщик не создавать, а правило создать в имеющемся и поставить первым. Тогда в п. 4 сортировщик менять не надо.

Принцип действия:
Все письма, принятые из внешних почтовых ящиков, передаются на обработку bat-файлу, который определяет, является ли письмо дубликатом или же это новое письмо. Если дубликат — письмо удаляется, если нет — письмо остаётся.
В результате при приёме нескольких копий одного и того же письма к пользователям попадёт только первая, остальные копии будут удалены.

Недостатки:
При применении данного решения станет невозможным повторный принудительный приём писем из внешних ящиков ("Внешние письма - Принять"), поскольку каждое уникальное письмо будет приниматься только один (первый) раз. При повторном приёме письмо будет удалено как дубликат (поскольку ранее оно уже принималось).
Чтобы письмо можно было принять повторно, нужно либо удалить его идентификатор из базы (файл dup_msg_remover_db.txt), либо временно отключить правило сортировки из п. 3.
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    Courier Mail Server Forum Index -> Готовые решения All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group