Как скопировать сообщения между двумя серверами IMAP и пропустить сообщения, которые уже существуют в целевом почтовом ящике?
Я пытаюсь реализовать копирование с помощью imapfilter, но проблема в том, что при каждом запуске я получаю несколько дубликатов - это происходит, когда фильтр основан на всех сообщениях, но когда я использую невидимый фильтр.
Чего я пытаюсь достичь:
- Исходный (ые) сервер (ы) - это рабочий сервер, который я использую для ежедневных писем и т.д.
- Целевой сервер - это резервный сервер, на котором должны храниться все электронные письма.
- Предполагается, что если сообщение было удалено на исходном сервере, оно все равно должно оставаться на целевом сервере.
- Я хочу, чтобы задание imapfilter запускалось каждый день, может быть часто (запланировано как задание крона)
- Дополнительный выбор сообщений на основе фильтра 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
Приступая к делу, мои вопросы следующие
Как копировать без дубликатов - сначала следует прочитать message_id из источника, затем из целевого объекта, установить разницу и скопировать только сообщения, а не существующие письма? Есть ли какая-то из готовых функций для этого, или я должен сам все это реализовать в lua?
Почему я получаю дубликаты при использовании фильтра all_message, но не при использовании фильтра un_seen? Имеет ли это отношение к количеству сообщений? Или непрочитанные письма обрабатываются по-разному?
С наилучшими пожеланиями, Себастьян