Wie würde ich zwei Mbox-Dateien auf intelligente Weise unterscheiden?

580
s-m-e

Ich habe zwei Mbox-Dateien mit jeweils ca. 6.000 E-Mails. Sie sollten mehr oder weniger identisch sein, obwohl # 1 ungefähr 100 E-Mails enthält, die # 2 nicht enthält. Ich würde gerne eine dritte Mbox-Datei mit meinen 100 Nachrichten generieren - sozusagen ein Unterschied.

Ich habe Nachrichten automatisch von einem Posteingang in einen anderen weitergeleitet (serverseitig), wodurch einige Nachrichten nicht zufällig aus irgendeinem unbestimmten und unbestimmten Grund weitergeleitet wurden. Nummer 2 ist der Posteingang, in den E-Mails weitergeleitet wurden - viele gelesene und beantwortete Nachrichten mit zusätzlichen Kopfzeilen, die Informationen dazu enthalten, wie sie weitergeleitet wurden. # 1 ist ein kürzlich erstellter Dump von 6.000 ungelesenen Nachrichten.


Ich arbeite mit Thunderbird unter Linux.

1

2 Antworten auf die Frage

1
s-m-e

Das folgende Python-Skript löst das Problem:

import mailbox  inbox_2 = mailbox.mbox('inbox_2_file') inbox_1 = mailbox.mbox('inbox_1_file')  inbox_diff = mailbox.mbox('inbox_diff_file', create=True)  inbox_2_ids = [] for message in inbox_2: inbox_2_ids.append(message.get('Message-ID'))  for message in inbox_1: if message.get('Message-ID') not in inbox_2_ids: inbox_diff.add(message)  inbox_diff.flush() 
1
Miles Wolbe

Vielen Dank für Ihre Frage und Antwort, @sme. Das Python-Skript funktioniert einwandfrei, solange jede E-Mail-Nachricht eine Message-ID enthält. Das ist leider nicht immer der Fall, da Message-ID überraschenderweise kein Pflichtfeld ist .

Mit einer sehr geringfügigen Änderung kann Ihr Skript verwendet werden, um eine neue Mbox-Datei zu erstellen, die alle E-Mail-Nachrichten enthält, denen das Feld Message-ID fehlt:

import mailbox  inbox_1 = mailbox.mbox('inbox_1_file')  inbox_missing_message_id = mailbox.mbox('inbox_missing_message_id_file', create=True)  for message in inbox_1: if message.get('Message-ID') is None: inbox_missing_message_id.add(message)  inbox_missing_message_id.flush() 
Interessanterweise wusste ich nicht, dass es nicht zwingend war. Vielen Dank für den Hinweis. Die eigentliche Frage lautet dann, wie Sie den tatsächlichen Differenzcode anpassen würden. Wie können Sie zuverlässig herausfinden, welche E-Mail welche ist, dh wie können Sie eine "alternative ID" sicher definieren? Ich habe darüber nachgedacht, eine Mischung aus Betreffzeilen und Zeitstempeln zu verwenden, aber letztere scheint auf zu viele verschiedene Arten wirklich unzuverlässig zu sein. s-m-e vor 7 Jahren 1