Umgang mit E-Mail-Duplikaten beim Kopieren von Nachrichten mit Imapfilter

483
Sebastian Widz

Wie kopieren Sie Nachrichten zwischen zwei IMAP-Servern und überspringen Sie Nachrichten, die bereits im Zielpostfach vorhanden sind?

Ich versuche, das Kopieren mit imapfilter zu implementieren, aber das Problem ist, dass bei jedem Lauf eine Anzahl von Duplikaten angezeigt wird. Dies geschieht, wenn ein Filter auf allen Nachrichten basiert, aber wenn ich einen nicht sichtbaren Filter verwende.

Was ich versuche zu erreichen:

  1. Die Quellserver sind der Produktionsserver, den ich für tägliche E-Mails usw. verwende.
  2. Der Zielserver ist ein Sicherungsserver, auf dem alle E-Mails gespeichert werden sollen
  3. Es wird davon ausgegangen, dass eine Nachricht, die auf dem Quellserver gelöscht wurde, weiterhin auf dem Ziel verbleibt.
  4. Ich möchte, dass der Imapfilter-Job jeden Tag ausgeführt wird, möglicherweise oft (als Crone-Job angezeigt).
  5. Die inkrementelle Nachrichtenauswahl basierend auf dem Filter un_seen ist eine Option. Wenn jedoch eine E-Mail als gelesen markiert wird, bevor der Sicherungsjob sie erreicht, wird diese Nachricht nicht kopiert. Ich denke, alle Nachrichten sollten analysiert werden

Ich habe das folgende config.lua-Skript.

--------------- -- 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 

Um auf den Punkt zu kommen, sind meine Fragen wie folgt

  1. Wie kopiere ich ohne Duplikate - sollte zuerst message_id von der Quelle gelesen werden, dann vom Ziel, einen Unterschied machen und nur die Nachrichten kopieren, die nicht vorhanden sind? Gibt es dafür eine Out-of-the-Box-Funktion oder sollte ich das alles selbst in lua implementieren?

  2. Warum bekomme ich Duplikate, wenn Sie den all_message-Filter verwenden, nicht aber den un_seen-Filter? Hat es etwas mit der Anzahl der Nachrichten zu tun? Oder ungelesene E-Mails werden abweichend behandelt?

Viele Grüße, Sebastian

0

1 Antwort auf die Frage

0
sameerkn

Was ich aus Ihrer Anforderung verstanden habe, ist: Sie möchten nur UNSEEN-Nachrichten in den Zielordner kopieren, um Duplikate zu vermeiden.

Dazu müssen Sie an der UID der Nachrichten im Quellserver / Ordner arbeiten. Weil die UID der Nachricht in einem bestimmten Ordner eindeutig ist. Sie müssen auch die UID "say, N" der letzten Nachricht aus dem Quellordner speichern, die in den Zielordner kopiert wurde. Im nächsten Kopierzyklus müssen Sie alle Nachrichten des Quellordners mit einer UID größer als "N" kopieren.

Bei diesem Kopiervorgang sollte auch die mit dem Ordner verknüpfte UIDVALIDITY verwendet werden. Bei Bedarf können weitere Details angegeben werden.