如何在两个 IMAP 服务器之间复制消息并跳过目标邮箱中已存在的消息?
我正在尝试使用以下方法实现复制imap过滤器但问题是每次运行我都会得到一些重复项 - 当过滤器基于所有消息但当我使用看不见的过滤器时就会发生这种情况。
我想要实现的目标:
- 源服务器是我用于日常电子邮件等的生产服务器。
- 目标服务器是应存储所有电子邮件的备份服务器
- 假设是,如果消息在源服务器上被删除,它仍将保留在目标服务器上。
- 我希望 imapfilter 作业每天运行,也许经常运行(安排为 crone 作业)
- 基于 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 protected]',
password = password1,
ssl = 'tls1.3',
}
source2 = IMAP {
server = 'imap.mail.com',
username = '[email protected]',
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 过滤器时不会?这与消息数量有关系吗?还是未读邮件的处理方式不同?
谨致问候,塞巴斯蒂安
答案1
我从您的要求中理解到的是:您只想将未见的消息复制到目标文件夹,避免重复。
为此,您需要处理源服务器/文件夹中消息的 UID。因为消息的 UID 在特定文件夹中是唯一的。此外,您需要存储从源文件夹复制到目标文件夹的最后一条消息的 UID“例如,N”。在下一个复制周期中,您需要复制所有 UID 大于“N”的源文件夹消息。
在此复制过程中,还应使用与文件夹关联的 UIDVALIDITY。如果需要,可以提供更多详细信息。