Как обрабатывать дубликаты электронной почты во время копирования сообщений с помощью Imapfilter

363
Sebastian Widz

Как скопировать сообщения между двумя серверами IMAP и пропустить сообщения, которые уже существуют в целевом почтовом ящике?

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

Чего я пытаюсь достичь:

  1. Исходный (ые) сервер (ы) - это рабочий сервер, который я использую для ежедневных писем и т. Д.
  2. Целевой сервер - это резервный сервер, на котором должны храниться все электронные письма.
  3. Предполагается, что если сообщение было удалено на исходном сервере, оно все равно должно оставаться на целевом сервере.
  4. Я хочу, чтобы задание imapfilter запускалось каждый день, может быть часто (запланировано как задание крона)
  5. Дополнительный выбор сообщений на основе фильтра un_seen - вариант, но если сообщение помечено как прочитанное до того, как задание резервного копирования достигнет его, такое сообщение не будет скопировано - я думаю, что все сообщения должны быть проанализированы

У меня есть следующий скрипт config.lua.

--------------- -- Options -- ---------------  options.timeout = 120 options.subscribe = true options.create = true options.charset = 'UTF-8'  target_folder = 'MailArchive/'  source1 = IMAP { server = 'imap.mail.org', username = 'email@mail.org', password = password1, ssl = 'tls1.3', }  source2 = IMAP { server = 'imap.mail.com', username = 'email@mail.com', password = password2, ssl = 'tls1.3', }  target = IMAP { server = 'localhost', username = 'user', password = password3, port = 143, }  ---------------------- -- Backup procedure -- ----------------------  sources = { source1, source2 }  local function copy_imap_folder(_src_acc, _src_box, _trg_acc, _trg_box) if string.upper(_src_box) ~= 'TRASH'  and string.upper(_src_box) ~= 'SPAM'  and string.upper(_src_box) ~= 'JUNK'  and string.upper(_src_box) ~= 'INFECTED ITEMS' then print('Processing mailbox: ' .. _src_box) print('Copying to folder: ' .. _trg_box) -- local newemails = _src_acc[_src_box]:is_unseen() -- not used local newemails = _src_acc[_src_box]:select_all() newemails:copy_messages(_trg_acc[_trg_box]) newemails = _trg_acc[_trg_box]:is_unseen() newemails:mark_seen() end end  for _, src in ipairs(sources) do print('Processing account: ' .. src._account.username .. '@' .. src._account.server) mailboxes, folders = src:list_all() for _, mbox in ipairs(mailboxes) do targetmailbox = target_folder .. mbox copy_imap_folder(src, mbox, target, targetmailbox) end  end 

Приступая к делу, мои вопросы следующие

  1. Как копировать без дубликатов - сначала следует прочитать message_id из источника, затем из целевого объекта, установить разницу и скопировать только сообщения, а не существующие письма? Есть ли какая-то из готовых функций для этого, или я должен сам все это реализовать в lua?

  2. Почему я получаю дубликаты при использовании фильтра all_message, но не при использовании фильтра un_seen? Имеет ли это отношение к количеству сообщений? Или непрочитанные письма обрабатываются по-разному?

С наилучшими пожеланиями, Себастьян

0

1 ответ на вопрос

0
sameerkn

Из вашего требования я понял следующее: вы хотите копировать только НЕПРАВИЛЬНЫЕ сообщения в целевую папку, избегая дублирования.

Для этого вам нужно поработать над UID сообщений в исходном сервере / папке. Потому что UID сообщения уникален в конкретной папке. Также вам необходимо сохранить UID «скажем, N» последнего сообщения из исходной папки, скопированной в целевую папку. В следующем цикле копирования вам необходимо скопировать все сообщения исходной папки с UID больше, чем «N».

В этом процессе копирования также должна использоваться UIDVALIDITY, связанная с папкой. Более подробная информация может быть предоставлена ​​в случае необходимости.

Похожие вопросы