Как скопировать сообщения между двумя серверами 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? Имеет ли это отношение к количеству сообщений? Или непрочитанные письма обрабатываются по-разному?

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

1 ответ1

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .