mailbox — Manipulieren von Mailboxen in verschiedenen Formaten

Quellcode: Lib/mailbox.py


Dieses Modul definiert zwei Klassen, Mailbox und Message, für den Zugriff und die Manipulation von Mailboxen auf der Festplatte und den darin enthaltenen Nachrichten. Mailbox bietet eine wörterbuchähnliche Abbildung von Schlüsseln zu Nachrichten. Message erweitert die Klasse email.message Message um format-spezifischen Zustand und Verhalten. Unterstützte Mailbox-Formate sind Maildir, mbox, MH, Babyl und MMDF.

Siehe auch

Modul email

Nachrichten darstellen und manipulieren.

Mailbox-Objekte

class mailbox.Mailbox

Eine Mailbox, die inspiziert und modifiziert werden kann.

Die Klasse Mailbox definiert eine Schnittstelle und ist nicht zur Instanziierung gedacht. Stattdessen sollten format-spezifische Unterklassen von Mailbox erben, und Ihr Code sollte eine bestimmte Unterklasse instanziieren.

Die Mailbox-Schnittstelle ist wörterbuchähnlich, wobei kleine Schlüssel Nachrichten entsprechen. Schlüssel werden von der Mailbox-Instanz ausgegeben, mit der sie verwendet werden, und sind nur für diese Mailbox-Instanz aussagekräftig. Ein Schlüssel identifiziert eine Nachricht weiterhin, auch wenn die entsprechende Nachricht modifiziert wird, z. B. durch Ersetzen durch eine andere Nachricht.

Nachrichten können zu einer Mailbox-Instanz über die mengenartige Methode add() hinzugefügt und mit einer del-Anweisung oder den mengenartigen Methoden remove() und discard() entfernt werden.

Mailbox-Schnittstellensemantik unterscheidet sich in einigen bemerkenswerten Punkten von der Wörterbuchsemantik. Jedes Mal, wenn eine Nachricht angefordert wird, wird eine neue Darstellung (typischerweise eine Message-Instanz) basierend auf dem aktuellen Zustand der Mailbox generiert. Ähnlich wird beim Hinzufügen einer Nachricht zu einer Mailbox-Instanz der Inhalt der bereitgestellten Nachrichtenrepräsentation kopiert. In keinem Fall wird eine Referenz auf die Nachrichtenrepräsentation von der Mailbox-Instanz gespeichert.

Der Standard-Mailbox-Iterator iteriert über Nachrichtenrepräsentationen, nicht über Schlüssel, wie es der Standard-Dictionary-Iterator tut. Darüber hinaus ist die Modifikation einer Mailbox während der Iteration sicher und wohl-definiert. Nachrichten, die nach Erstellung eines Iterators zur Mailbox hinzugefügt werden, werden vom Iterator nicht gesehen. Nachrichten, die aus der Mailbox entfernt werden, bevor der Iterator sie liefert, werden stillschweigend übersprungen, obwohl die Verwendung eines Schlüssels aus einem Iterator zu einer KeyError-Ausnahme führen kann, wenn die entsprechende Nachricht anschließend entfernt wird.

Warnung

Seien Sie sehr vorsichtig, wenn Sie Mailboxen modifizieren, die gleichzeitig von einem anderen Prozess geändert werden könnten. Das sicherste Mailbox-Format für solche Aufgaben ist Maildir; versuchen Sie, Single-File-Formate wie mbox für gleichzeitiges Schreiben zu vermeiden. Wenn Sie eine Mailbox modifizieren, *müssen* Sie sie sperren, indem Sie die Methoden lock() und unlock() aufrufen, *bevor* Sie Nachrichten in der Datei lesen oder Änderungen durch Hinzufügen oder Löschen einer Nachricht vornehmen. Das Nicht-Sperren der Mailbox birgt das Risiko, Nachrichten zu verlieren oder die gesamte Mailbox zu beschädigen.

Mailbox-Instanzen haben die folgenden Methoden

add(message)

Fügt message zur Mailbox hinzu und gibt den ihr zugewiesenen Schlüssel zurück.

Der Parameter message kann eine Message-Instanz, eine email.message.Message-Instanz, eine Zeichenkette, eine Byte-Zeichenkette oder ein dateiähnliches Objekt (das im Binärmodus geöffnet sein sollte) sein. Wenn message eine Instanz der entsprechenden format-spezifischen Message-Unterklasse ist (z. B. wenn es eine mboxMessage-Instanz ist und dies eine mbox-Instanz ist), werden ihre format-spezifischen Informationen verwendet. Andernfalls werden vernünftige Standardwerte für format-spezifische Informationen verwendet.

Geändert in Version 3.2: Unterstützung für binäre Eingabe wurde hinzugefügt.

remove(key)
__delitem__(key)
discard(key)

Löscht die Nachricht, die key entspricht, aus der Mailbox.

Wenn keine solche Nachricht existiert, wird eine KeyError-Ausnahme ausgelöst, wenn die Methode als remove() oder __delitem__() aufgerufen wurde, aber keine Ausnahme wird ausgelöst, wenn die Methode als discard() aufgerufen wurde. Das Verhalten von discard() kann bevorzugt werden, wenn das zugrunde liegende Mailbox-Format gleichzeitige Modifikation durch andere Prozesse unterstützt.

__setitem__(key, message)

Ersetzt die Nachricht, die key entspricht, durch message. Löst eine KeyError-Ausnahme aus, wenn noch keine Nachricht key entspricht.

Wie bei add() kann der Parameter message eine Message-Instanz, eine email.message.Message-Instanz, eine Zeichenkette, eine Byte-Zeichenkette oder ein dateiähnliches Objekt (das im Binärmodus geöffnet sein sollte) sein. Wenn message eine Instanz der entsprechenden format-spezifischen Message-Unterklasse ist (z. B. wenn es eine mboxMessage-Instanz ist und dies eine mbox-Instanz ist), werden ihre format-spezifischen Informationen verwendet. Andernfalls bleiben die format-spezifischen Informationen der Nachricht, die derzeit key entspricht, unverändert.

iterkeys()

Gibt einen Iterator über alle Schlüssel zurück.

keys()

Das Gleiche wie iterkeys(), nur dass eine Liste anstelle eines Iterators zurückgegeben wird.

itervalues()
__iter__()

Gibt einen Iterator über Darstellungen aller Nachrichten zurück. Die Nachrichten werden als Instanzen der entsprechenden format-spezifischen Message-Unterklasse dargestellt, es sei denn, es wurde eine benutzerdefinierte Nachrichtenfabrik bei der Initialisierung der Mailbox-Instanz angegeben.

Hinweis

Das Verhalten von __iter__() unterscheidet sich von dem von Wörterbüchern, die über Schlüssel iterieren.

values()

Das Gleiche wie itervalues(), nur dass eine Liste von Paaren anstelle eines Iterators von Paaren zurückgegeben wird.

iteritems()

Gibt einen Iterator über (key, message)-Paare zurück, wobei key ein Schlüssel und message eine Nachrichtenrepräsentation ist. Die Nachrichten werden als Instanzen der entsprechenden format-spezifischen Message-Unterklasse dargestellt, es sei denn, es wurde eine benutzerdefinierte Nachrichtenfabrik bei der Initialisierung der Mailbox-Instanz angegeben.

items()

Das Gleiche wie iteritems(), nur dass eine Liste von Paaren anstelle eines Iterators von Paaren zurückgegeben wird.

get(key, default=None)
__getitem__(key)

Gibt eine Darstellung der Nachricht zurück, die key entspricht. Wenn keine solche Nachricht existiert, wird default zurückgegeben, wenn die Methode als get() aufgerufen wurde, und eine KeyError-Ausnahme wird ausgelöst, wenn die Methode als __getitem__() aufgerufen wurde. Die Nachricht wird als Instanz der entsprechenden format-spezifischen Message-Unterklasse dargestellt, es sei denn, es wurde eine benutzerdefinierte Nachrichtenfabrik bei der Initialisierung der Mailbox-Instanz angegeben.

get_message(key)

Gibt eine Darstellung der Nachricht zurück, die key entspricht, als Instanz der entsprechenden format-spezifischen Message-Unterklasse, oder löst eine KeyError-Ausnahme aus, wenn keine solche Nachricht existiert.

get_bytes(key)

Gibt eine Byte-Darstellung der Nachricht zurück, die key entspricht, oder löst eine KeyError-Ausnahme aus, wenn keine solche Nachricht existiert.

Hinzugefügt in Version 3.2.

get_string(key)

Gibt eine Zeichenketten-Darstellung der Nachricht zurück, die key entspricht, oder löst eine KeyError-Ausnahme aus, wenn keine solche Nachricht existiert. Die Nachricht wird über email.message.Message verarbeitet, um sie in eine 7-Bit-saubere Darstellung zu konvertieren.

get_file(key)

Gibt eine dateiähnliche Darstellung der Nachricht zurück, die key entspricht, oder löst eine KeyError-Ausnahme aus, wenn keine solche Nachricht existiert. Das dateiähnliche Objekt verhält sich, als wäre es im Binärmodus geöffnet. Diese Datei sollte geschlossen werden, sobald sie nicht mehr benötigt wird.

Geändert in Version 3.2: Das Datei-Objekt ist tatsächlich eine Binärdatei; zuvor wurde es fälschlicherweise im Textmodus zurückgegeben. Außerdem unterstützt das dateiähnliche Objekt jetzt das Protokoll für Kontextmanager: Sie können eine with-Anweisung verwenden, um es automatisch zu schließen.

Hinweis

Im Gegensatz zu anderen Darstellungen von Nachrichten sind dateiähnliche Darstellungen nicht notwendigerweise unabhängig von der Mailbox-Instanz, die sie erstellt hat, oder von der zugrunde liegenden Mailbox. Spezifischere Dokumentation wird von jeder Unterklasse bereitgestellt.

__contains__(key)

Gibt True zurück, wenn key einer Nachricht entspricht, andernfalls False.

__len__()

Gibt eine Zählung der Nachrichten in der Mailbox zurück.

clear()

Löscht alle Nachrichten aus der Mailbox.

pop(key, default=None)

Gibt eine Darstellung der Nachricht zurück, die key entspricht, und löscht die Nachricht. Wenn keine solche Nachricht existiert, wird default zurückgegeben. Die Nachricht wird als Instanz der entsprechenden format-spezifischen Message-Unterklasse dargestellt, es sei denn, es wurde eine benutzerdefinierte Nachrichtenfabrik bei der Initialisierung der Mailbox-Instanz angegeben.

popitem()

Gibt ein beliebiges (key, message)-Paar zurück, wobei key ein Schlüssel und message eine Nachrichtenrepräsentation ist, und löscht die entsprechende Nachricht. Wenn die Mailbox leer ist, wird eine KeyError-Ausnahme ausgelöst. Die Nachricht wird als Instanz der entsprechenden format-spezifischen Message-Unterklasse dargestellt, es sei denn, es wurde eine benutzerdefinierte Nachrichtenfabrik bei der Initialisierung der Mailbox-Instanz angegeben.

update(arg)

Der Parameter arg sollte eine key-zu-message-Abbildung oder ein Iterable von (key, message)-Paaren sein. Aktualisiert die Mailbox so, dass für jeden gegebenen key und message die Nachricht, die key entspricht, zu message gesetzt wird, als ob durch __setitem__(). Wie bei __setitem__() muss jeder key bereits einer Nachricht in der Mailbox entsprechen, andernfalls wird eine KeyError-Ausnahme ausgelöst. Daher ist es im Allgemeinen falsch, wenn arg eine Mailbox-Instanz ist.

Hinweis

Anders als bei Wörterbüchern werden Schlüsselwortargumente nicht unterstützt.

flush()

Schreibt alle ausstehenden Änderungen in das Dateisystem. Für einige Mailbox-Unterklassen werden Änderungen immer sofort geschrieben und flush() tut nichts, aber Sie sollten sich trotzdem angewöhnen, diese Methode aufzurufen.

lock()

Erwirbt eine exklusive advisory Sperre für die Mailbox, damit andere Prozesse wissen, dass sie diese nicht modifizieren sollen. Eine ExternalClashError wird ausgelöst, wenn die Sperre nicht verfügbar ist. Die spezifischen Sperrmechanismen hängen vom Mailbox-Format ab. Sie sollten die Mailbox *immer* sperren, bevor Sie deren Inhalt modifizieren.

unlock()

Gibt die Sperre für die Mailbox frei, falls vorhanden.

close()

Spült die Mailbox, entsperrt sie bei Bedarf und schließt alle offenen Dateien. Für einige Mailbox-Unterklassen tut diese Methode nichts.

Maildir-Objekte

class mailbox.Maildir(dirname, factory=None, create=True)

Eine Unterklasse von Mailbox für Mailboxen im Maildir-Format. Der Parameter factory ist ein aufrufbares Objekt, das eine dateiähnliche Nachrichtenrepräsentation akzeptiert (die sich wie im Binärmodus geöffnet verhält) und eine benutzerdefinierte Darstellung zurückgibt. Wenn factory None ist, wird MaildirMessage als Standard-Nachrichtenrepräsentation verwendet. Wenn create True ist, wird die Mailbox erstellt, falls sie nicht existiert.

Wenn create True ist und der Pfad dirname existiert, wird er als vorhandenes Maildir behandelt, ohne zu versuchen, dessen Verzeichnisstruktur zu überprüfen.

Aus historischen Gründen heißt dirname so und nicht path.

Maildir ist ein Verzeichnis-basiertes Mailbox-Format, das für den qmail Mail Transfer Agent erfunden wurde und nun von vielen Programmen unterstützt wird. Nachrichten in einer Maildir-Mailbox werden in separaten Dateien innerhalb einer gemeinsamen Verzeichnisstruktur gespeichert. Dieses Design ermöglicht es Maildir-Mailboxen, von mehreren unabhängigen Programmen ohne Datenbeschädigung zugegriffen und modifiziert zu werden, sodass Dateisperren nicht erforderlich sind.

Maildir-Mailboxen enthalten drei Unterverzeichnisse: tmp, new und cur. Nachrichten werden kurzzeitig im Unterverzeichnis tmp erstellt und dann in das Unterverzeichnis new verschoben, um die Zustellung abzuschließen. Ein Mail-User-Agent kann die Nachricht anschließend in das Unterverzeichnis cur verschieben und Informationen über den Status der Nachricht in einem speziellen "info"-Abschnitt speichern, der an den Dateinamen angehängt wird.

Ordner im Stil, der vom Courier Mail Transfer Agent eingeführt wurde, werden ebenfalls unterstützt. Jedes Unterverzeichnis der Haupt-Mailbox wird als Ordner betrachtet, wenn '.' das erste Zeichen seines Namens ist. Ordnernamen werden durch Maildir ohne den führenden '.' dargestellt. Jeder Ordner ist selbst eine Maildir-Mailbox, sollte aber keine anderen Ordner enthalten. Stattdessen wird eine logische Verschachtelung durch '.' zur Abgrenzung von Ebenen angezeigt, z. B. "Archived.2005.07".

colon

Die Maildir-Spezifikation erfordert die Verwendung eines Doppelpunkts (':') in bestimmten Nachrichten-Dateinamen. Einige Betriebssysteme erlauben jedoch dieses Zeichen nicht in Dateinamen. Wenn Sie ein Maildir-ähnliches Format auf einem solchen Betriebssystem verwenden möchten, sollten Sie ein anderes Zeichen dafür angeben. Das Ausrufezeichen ('!') ist eine beliebte Wahl. Zum Beispiel

import mailbox
mailbox.Maildir.colon = '!'

Das Attribut colon kann auch pro Instanz festgelegt werden.

Geändert in Version 3.13: Maildir ignoriert nun Dateien mit einem führenden Punkt.

Maildir-Instanzen haben alle Methoden von Mailbox zusätzlich zu den folgenden

list_folders()

Gibt eine Liste der Namen aller Ordner zurück.

get_folder(folder)

Gibt eine Maildir-Instanz zurück, die den Ordner mit dem Namen folder darstellt. Eine Ausnahme vom Typ NoSuchMailboxError wird ausgelöst, wenn der Ordner nicht existiert.

add_folder(folder)

Erstellt einen Ordner mit dem Namen folder und gibt eine Maildir-Instanz zurück, die ihn darstellt.

remove_folder(folder)

Löscht den Ordner mit dem Namen folder. Wenn der Ordner Nachrichten enthält, wird eine Ausnahme vom Typ NotEmptyError ausgelöst und der Ordner wird nicht gelöscht.

clean()

Löscht temporäre Dateien aus dem Postfach, auf die in den letzten 36 Stunden nicht zugegriffen wurde. Die Maildir-Spezifikation besagt, dass E-Mail-Leseprogramme dies gelegentlich tun sollten.

get_flags(key)

Gibt die gesetzten Flags für die Nachricht, die dem key entspricht, als Zeichenkette zurück. Dies ist dasselbe wie get_message(key).get_flags(), aber viel schneller, da die Nachrichtendatei nicht geöffnet wird. Verwenden Sie diese Methode beim Iterieren über die Schlüssel, um festzustellen, welche Nachrichten interessant sind.

Wenn Sie ein MaildirMessage-Objekt besitzen, verwenden Sie stattdessen dessen Methode get_flags(), da Änderungen, die von den Methoden set_flags(), add_flag() und remove_flag() der Nachricht vorgenommen wurden, hier erst sichtbar werden, wenn die Methode __setitem__() des Postfachs aufgerufen wird.

Hinzugefügt in Version 3.13.

set_flags(key, flags)

Setzt auf der Nachricht, die dem key entspricht, die durch flags angegebenen Flags und hebt alle anderen auf. Der Aufruf von some_mailbox.set_flags(key, flags) ist ähnlich wie

one_message = some_mailbox.get_message(key)
one_message.set_flags(flags)
some_mailbox[key] = one_message

aber schneller, da die Nachrichtendatei nicht geöffnet wird.

Wenn Sie ein MaildirMessage-Objekt besitzen, verwenden Sie stattdessen dessen Methode set_flags(), da mit dieser Postfachmethode vorgenommene Änderungen für die Methode get_flags() des Nachrichtenobjekts nicht sichtbar sind.

Hinzugefügt in Version 3.13.

add_flag(key, flag)

Setzt auf der Nachricht, die dem key entspricht, die durch flag angegebenen Flags, ohne andere Flags zu ändern. Um mehr als ein Flag gleichzeitig hinzuzufügen, kann flag eine Zeichenkette mit mehr als einem Zeichen sein.

Die Überlegungen zur Verwendung dieser Methode im Vergleich zur Methode add_flag() des Nachrichtenobjekts sind ähnlich denen für set_flags(); siehe dortige Diskussion.

Hinzugefügt in Version 3.13.

remove_flag(key, flag)

Hebt auf der Nachricht, die dem key entspricht, die durch flag angegebenen Flags auf, ohne andere Flags zu ändern. Um mehr als ein Flag gleichzeitig zu entfernen, kann flag eine Zeichenkette mit mehr als einem Zeichen sein.

Die Überlegungen zur Verwendung dieser Methode im Vergleich zur Methode remove_flag() des Nachrichtenobjekts sind ähnlich denen für set_flags(); siehe dortige Diskussion.

Hinzugefügt in Version 3.13.

get_info(key)

Gibt die Informationen für die Nachricht, die dem key entspricht, als Zeichenkette zurück. Dies ist dasselbe wie get_message(key).get_info(), aber viel schneller, da die Nachrichtendatei nicht geöffnet wird. Verwenden Sie diese Methode beim Iterieren über die Schlüssel, um festzustellen, welche Nachrichten interessant sind.

Wenn Sie ein MaildirMessage-Objekt besitzen, verwenden Sie stattdessen dessen Methode get_info(), da mit der Methode set_info() der Nachricht vorgenommene Änderungen hier erst sichtbar werden, wenn die Methode __setitem__() des Postfachs aufgerufen wird.

Hinzugefügt in Version 3.13.

set_info(key, info)

Setzt die Informationen der Nachricht, die dem key entspricht, auf info. Der Aufruf von some_mailbox.set_info(key, flags) ist ähnlich wie

one_message = some_mailbox.get_message(key)
one_message.set_info(info)
some_mailbox[key] = one_message

aber schneller, da die Nachrichtendatei nicht geöffnet wird.

Wenn Sie ein MaildirMessage-Objekt besitzen, verwenden Sie stattdessen dessen Methode set_info(), da mit dieser Postfachmethode vorgenommene Änderungen für die Methode get_info() des Nachrichtenobjekts nicht sichtbar sind.

Hinzugefügt in Version 3.13.

Einige von Maildir implementierte Mailbox-Methoden verdienen besondere Erwähnung

add(message)
__setitem__(key, message)
update(arg)

Warnung

Diese Methoden generieren eindeutige Dateinamen basierend auf der aktuellen Prozess-ID. Bei Verwendung mehrerer Threads können unerkannte Namenskonflikte auftreten und das Postfach beschädigen, es sei denn, die Threads werden koordiniert, um die gleichzeitige gleichzeitige Verwendung dieser Methoden zur Manipulation desselben Postfachs zu vermeiden.

flush()

Alle Änderungen an Maildir-Postfächern werden sofort angewendet, daher tut diese Methode nichts.

lock()
unlock()

Maildir-Postfächer unterstützen (oder erfordern) keine Sperrung, daher tun diese Methoden nichts.

close()

Maildir-Instanzen halten keine offenen Dateien und die zugrunde liegenden Postfächer unterstützen keine Sperrung, daher tut diese Methode nichts.

get_file(key)

Abhängig von der Host-Plattform ist es möglicherweise nicht möglich, die zugrunde liegende Nachricht zu ändern oder zu löschen, während die zurückgegebene Datei geöffnet bleibt.

Siehe auch

maildir Manpage von Courier

Eine Spezifikation des Formats. Beschreibt eine gängige Erweiterung zur Unterstützung von Ordnern.

Verwendung des Maildir-Formats

Anmerkungen zu Maildir von seinem Erfinder. Enthält ein aktualisiertes Namensgenerierungsschema und Details zu "Info"-Semantiken.

mbox-Objekte

class mailbox.mbox(path, factory=None, create=True)

Eine Unterklasse von Mailbox für Postfächer im mbox-Format. Der Parameter factory ist ein aufrufbaren Objekt, das eine dateiähnliche Nachrichtenrepräsentation akzeptiert (die sich so verhält, als wäre sie im Binärmodus geöffnet) und eine benutzerdefinierte Repräsentation zurückgibt. Wenn factory None ist, wird mboxMessage als Standardnachrichtenrepräsentation verwendet. Wenn create True ist, wird das Postfach erstellt, wenn es nicht existiert.

Das mbox-Format ist das klassische Format zur Speicherung von E-Mails auf Unix-Systemen. Alle Nachrichten in einem mbox-Postfach werden in einer einzigen Datei gespeichert, wobei der Anfang jeder Nachricht durch eine Zeile angezeigt wird, deren erste fünf Zeichen "From " lauten.

Es gibt mehrere Variationen des mbox-Formats, um wahrgenommene Mängel im Original zu beheben. Aus Kompatibilitätsgründen implementiert mbox das Originalformat, das manchmal als mboxo bezeichnet wird. Das bedeutet, dass der Header Content-Length, falls vorhanden, ignoriert wird und dass alle Vorkommen von "From " am Anfang einer Zeile im Nachrichtentext beim Speichern der Nachricht in ">From " umgewandelt werden, obwohl Vorkommen von ">From " beim Lesen der Nachricht nicht in "From " umgewandelt werden.

Einige von mbox implementierte Mailbox-Methoden verdienen besondere Erwähnung

get_bytes(key, from_=False)

Hinweis: Diese Methode hat einen zusätzlichen Parameter (from_) im Vergleich zu anderen Klassen. Die erste Zeile eines mbox-Dateieintrags ist die Unix "From "-Zeile. Wenn from_ False ist, wird die erste Zeile der Datei verworfen.

get_file(key, from_=False)

Die Verwendung der Datei nach dem Aufruf von flush() oder close() auf der mbox-Instanz kann zu unvorhersehbaren Ergebnissen führen oder eine Ausnahme auslösen.

Hinweis: Diese Methode hat einen zusätzlichen Parameter (from_) im Vergleich zu anderen Klassen. Die erste Zeile eines mbox-Dateieintrags ist die Unix "From "-Zeile. Wenn from_ False ist, wird die erste Zeile der Datei verworfen.

get_string(key, from_=False)

Hinweis: Diese Methode hat einen zusätzlichen Parameter (from_) im Vergleich zu anderen Klassen. Die erste Zeile eines mbox-Dateieintrags ist die Unix "From "-Zeile. Wenn from_ False ist, wird die erste Zeile der Datei verworfen.

lock()
unlock()

Drei Sperrmechanismen werden verwendet: Dot-Locking und, falls verfügbar, die Systemaufrufe flock() und lockf().

Siehe auch

mbox Manpage von tin

Eine Spezifikation des Formats mit Details zur Sperrung.

Konfiguration von Netscape Mail unter Unix: Warum das Content-Length-Format schlecht ist

Ein Argument für die Verwendung des ursprünglichen mbox-Formats anstelle einer Variation.

"mbox" ist eine Familie von mehreren inkompatiblen Postfachformaten

Eine Geschichte der mbox-Variationen.

MH-Objekte

class mailbox.MH(path, factory=None, create=True)

Eine Unterklasse von Mailbox für Postfächer im MH-Format. Der Parameter factory ist ein aufrufbaren Objekt, das eine dateiähnliche Nachrichtenrepräsentation akzeptiert (die sich so verhält, als wäre sie im Binärmodus geöffnet) und eine benutzerdefinierte Repräsentation zurückgibt. Wenn factory None ist, wird MHMessage als Standardnachrichtenrepräsentation verwendet. Wenn create True ist, wird das Postfach erstellt, wenn es nicht existiert.

MH ist ein verzeichnisbasiertes Postfachformat, das für das MH Message Handling System, einen Mail-Benutzeragenten, entwickelt wurde. Jede Nachricht in einem MH-Postfach befindet sich in einer eigenen Datei. Ein MH-Postfach kann neben Nachrichten auch andere MH-Postfächer (sogenannte Ordner) enthalten. Ordner können beliebig verschachtelt werden. MH-Postfächer unterstützen auch Sequenzen, das sind benannte Listen, die verwendet werden, um Nachrichten logisch zu gruppieren, ohne sie in Unterordner zu verschieben. Sequenzen werden in einer Datei namens .mh_sequences in jedem Ordner definiert.

Die Klasse MH manipuliert MH-Postfächer, versucht aber nicht, alle Verhaltensweisen von mh nachzuahmen. Insbesondere modifiziert sie nicht und wird nicht von den Dateien context oder .mh_profile beeinflusst, die von mh zur Speicherung seines Zustands und seiner Konfiguration verwendet werden.

MH-Instanzen haben alle Methoden von Mailbox zusätzlich zu den folgenden

Geändert in Version 3.13: Unterstützung für Ordner, die keine .mh_sequences-Datei enthalten.

list_folders()

Gibt eine Liste der Namen aller Ordner zurück.

get_folder(folder)

Gibt eine MH-Instanz zurück, die den Ordner mit dem Namen folder darstellt. Eine Ausnahme vom Typ NoSuchMailboxError wird ausgelöst, wenn der Ordner nicht existiert.

add_folder(folder)

Erstellt einen Ordner mit dem Namen folder und gibt eine MH-Instanz zurück, die ihn darstellt.

remove_folder(folder)

Löscht den Ordner mit dem Namen folder. Wenn der Ordner Nachrichten enthält, wird eine Ausnahme vom Typ NotEmptyError ausgelöst und der Ordner wird nicht gelöscht.

get_sequences()

Gibt ein Wörterbuch von Sequenznamen zurück, die auf Schlüsselverzeichnisse abgebildet sind. Wenn keine Sequenzen vorhanden sind, wird das leere Wörterbuch zurückgegeben.

set_sequences(sequences)

Definiert die im Postfach vorhandenen Sequenzen basierend auf sequences neu, einem Wörterbuch von Namen, die auf Schlüsselverzeichnisse abgebildet sind, wie von get_sequences() zurückgegeben.

pack()

Benennt Nachrichten im Postfach um, um Lücken in der Nummerierung zu beseitigen. Einträge in der Sequenzliste werden entsprechend aktualisiert.

Hinweis

Bereits ausgegebene Schlüssel werden durch diese Operation ungültig und sollten anschließend nicht verwendet werden.

Einige von MH implementierte Mailbox-Methoden verdienen besondere Erwähnung

remove(key)
__delitem__(key)
discard(key)

Diese Methoden löschen die Nachricht sofort. Die MH-Konvention, eine Nachricht zum Löschen zu markieren, indem ein Komma vor ihren Namen gesetzt wird, wird nicht verwendet.

lock()
unlock()

Drei Sperrmechanismen werden verwendet: Dot-Locking und, falls verfügbar, die Systemaufrufe flock() und lockf(). Für MH-Postfächer bedeutet die Sperrung des Postfachs die Sperrung der Datei .mh_sequences und, nur für die Dauer von Operationen, die sie beeinflussen, die Sperrung einzelner Nachrichtendateien.

get_file(key)

Abhängig von der Host-Plattform ist es möglicherweise nicht möglich, die zugrunde liegende Nachricht zu löschen, während die zurückgegebene Datei geöffnet bleibt.

flush()

Alle Änderungen an MH-Postfächern werden sofort angewendet, daher tut diese Methode nichts.

close()

MH-Instanzen halten keine offenen Dateien, daher ist diese Methode äquivalent zu unlock().

Siehe auch

nmh - Message Handling System

Homepage von nmh, einer aktualisierten Version des ursprünglichen mh.

MH & nmh: E-Mail für Benutzer & Programmierer

Ein GPL-lizenziertes Buch über mh und nmh, mit einigen Informationen zum Postfachformat.

Babyl-Objekte

class mailbox.Babyl(path, factory=None, create=True)

Eine Unterklasse von Mailbox für Postfächer im Babyl-Format. Der Parameter factory ist ein aufrufbaren Objekt, das eine dateiähnliche Nachrichtenrepräsentation akzeptiert (die sich so verhält, als wäre sie im Binärmodus geöffnet) und eine benutzerdefinierte Repräsentation zurückgibt. Wenn factory None ist, wird BabylMessage als Standardnachrichtenrepräsentation verwendet. Wenn create True ist, wird das Postfach erstellt, wenn es nicht existiert.

Babyl ist ein Single-File-Postfachformat, das vom Rmail-Mail-Benutzeragenten von Emacs verwendet wird. Der Anfang einer Nachricht wird durch eine Zeile angezeigt, die die beiden Zeichen Control-Underscore ('\037') und Control-L ('\014') enthält. Das Ende einer Nachricht wird durch den Anfang der nächsten Nachricht oder, im Fall der letzten Nachricht, durch eine Zeile mit einem Control-Underscore ('\037') Zeichen angezeigt.

Nachrichten in einem Babyl-Postfach haben zwei Sätze von Headern: Original-Header und sogenannte sichtbare Header. Sichtbare Header sind typischerweise eine Teilmenge der Original-Header, die neu formatiert oder gekürzt wurden, um attraktiver zu sein. Jede Nachricht in einem Babyl-Postfach hat auch eine begleitende Liste von Labels, oder kurze Zeichenketten, die zusätzliche Informationen über die Nachricht aufzeichnen, und eine Liste aller benutzerdefinierten Labels, die im Postfach gefunden wurden, wird im Babyl-Optionsbereich aufbewahrt.

Babyl-Instanzen haben alle Methoden von Mailbox zusätzlich zu den folgenden

get_labels()

Gibt eine Liste der Namen aller im Postfach verwendeten benutzerdefinierten Labels zurück.

Hinweis

Die tatsächlichen Nachrichten werden inspiziert, um festzustellen, welche Labels im Postfach existieren, anstatt die Liste der Labels im Babyl-Optionsbereich zu konsultieren, aber der Babyl-Bereich wird aktualisiert, wenn das Postfach geändert wird.

Einige von Babyl implementierte Mailbox-Methoden verdienen besondere Erwähnung

get_file(key)

In Babyl-Postfächern sind die Header einer Nachricht nicht zusammen mit dem Körper der Nachricht gespeichert. Um eine dateiähnliche Repräsentation zu generieren, werden die Header und der Körper in eine io.BytesIO-Instanz kopiert, die eine API hat, die der einer Datei identisch ist. Daher ist das dateiähnliche Objekt unabhängig vom zugrunde liegenden Postfach, spart aber im Vergleich zu einer Zeichenkettenrepräsentation keinen Speicher.

lock()
unlock()

Drei Sperrmechanismen werden verwendet: Dot-Locking und, falls verfügbar, die Systemaufrufe flock() und lockf().

Siehe auch

Format von Babyl-Dateien Version 5

Eine Spezifikation des Babyl-Formats.

E-Mails mit Rmail lesen

Das Rmail-Handbuch, mit einigen Informationen zur Babyl-Semantik.

MMDF-Objekte

class mailbox.MMDF(path, factory=None, create=True)

Eine Unterklasse von Mailbox für Mailboxen im MMDF-Format. Der Parameter factory ist ein aufrufbares Objekt, das eine nachrichtenähnliche Dateidarstellung (die sich so verhält, als wäre sie im Binärmodus geöffnet) akzeptiert und eine benutzerdefinierte Darstellung zurückgibt. Wenn factory None ist, wird MMDFMessage als Standardnachrichtendarstellung verwendet. Wenn create True ist, wird die Mailbox erstellt, falls sie nicht existiert.

MMDF ist ein einteiliges Mailbox-Format, das für die Multichannel Memorandum Distribution Facility, einen Mail-Transfer-Agenten, erfunden wurde. Jede Nachricht hat die gleiche Form wie eine mbox-Nachricht, ist aber vor und nach Zeilen mit vier Control-A-Zeichen ('\001') eingerahmt. Wie beim mbox-Format wird der Anfang jeder Nachricht durch eine Zeile angezeigt, deren erste fünf Zeichen „From “ sind. Zusätzliche Vorkommen von „From “ werden beim Speichern von Nachrichten nicht in „>From “ umgewandelt, da die zusätzlichen Nachrichtentrennzeichen solche Vorkommen nicht als Anfänge nachfolgender Nachrichten missverstehen lassen.

Einige Mailbox-Methoden, die von MMDF implementiert werden, verdienen besondere Erwähnung

get_bytes(key, from_=False)

Hinweis: Diese Methode hat einen zusätzlichen Parameter (from_) im Vergleich zu anderen Klassen. Die erste Zeile eines mbox-Dateieintrags ist die Unix "From "-Zeile. Wenn from_ False ist, wird die erste Zeile der Datei verworfen.

get_file(key, from_=False)

Die Verwendung der Datei nach dem Aufruf von flush() oder close() auf der MMDF-Instanz kann unvorhersehbare Ergebnisse liefern oder eine Ausnahme auslösen.

Hinweis: Diese Methode hat einen zusätzlichen Parameter (from_) im Vergleich zu anderen Klassen. Die erste Zeile eines mbox-Dateieintrags ist die Unix "From "-Zeile. Wenn from_ False ist, wird die erste Zeile der Datei verworfen.

lock()
unlock()

Drei Sperrmechanismen werden verwendet: Dot-Locking und, falls verfügbar, die Systemaufrufe flock() und lockf().

Siehe auch

mmdf Manpage von tin

Eine Spezifikation des MMDF-Formats aus der Dokumentation von tin, einem Newsreader.

MMDF

Ein Wikipedia-Artikel über die Multichannel Memorandum Distribution Facility.

Message-Objekte

class mailbox.Message(message=None)

Eine Unterklasse der email.message-Modul-Klasse Message. Unterklassen von mailbox.Message fügen mailbox-formatspezifischen Zustand und Verhalten hinzu.

Wenn message weggelassen wird, wird die neue Instanz in einem leeren Standardzustand erstellt. Wenn message eine email.message.Message-Instanz ist, werden deren Inhalte kopiert. Darüber hinaus werden alle formatsspezifischen Informationen, soweit möglich, konvertiert, wenn message eine Message-Instanz ist. Wenn message ein String, ein Byte-String oder eine Datei ist, sollte er eine RFC 2822-konforme Nachricht enthalten, die gelesen und geparst wird. Dateien sollten im Binärmodus geöffnet sein, aber Textmodus-Dateien werden zur Abwärtskompatibilität akzeptiert.

Der formatsspezifische Zustand und das Verhalten, die von Unterklassen angeboten werden, variieren, aber im Allgemeinen werden nur die Eigenschaften unterstützt, die nicht spezifisch für eine bestimmte Mailbox sind (obwohl die Eigenschaften vermutlich spezifisch für ein bestimmtes Mailbox-Format sind). Zum Beispiel werden Dateipositionen für einteilige Mailbox-Formate und Dateinamen für verzeichnisbasierte Mailbox-Formate nicht beibehalten, da sie nur für die ursprüngliche Mailbox gelten. Zustand wie z. B. ob eine Nachricht vom Benutzer gelesen oder als wichtig markiert wurde, wird beibehalten, da er sich auf die Nachricht selbst bezieht.

Es gibt keine Anforderung, dass Message-Instanzen zur Darstellung von Nachrichten verwendet werden, die mit Mailbox-Instanzen abgerufen wurden. In einigen Situationen sind der Zeit- und Speicheraufwand für die Erzeugung von Message-Darstellungen möglicherweise nicht akzeptabel. Für solche Situationen bieten Mailbox-Instanzen auch String- und dateiähnliche Darstellungen an, und eine benutzerdefinierte Nachrichtenfabrik kann bei der Initialisierung einer Mailbox-Instanz angegeben werden.

MaildirMessage-Objekte

class mailbox.MaildirMessage(message=None)

Eine Nachricht mit Maildir-spezifischem Verhalten. Der Parameter message hat die gleiche Bedeutung wie beim Konstruktor Message.

Typischerweise verschiebt eine Mailuseragent-Anwendung alle Nachrichten aus dem Unterverzeichnis new in das Unterverzeichnis cur, nachdem der Benutzer die Mailbox zum ersten Mal geöffnet und geschlossen hat, und zeichnet auf, dass die Nachrichten alt sind, unabhängig davon, ob sie tatsächlich gelesen wurden oder nicht. Jede Nachricht in cur hat einen „info“-Abschnitt, der seinem Dateinamen hinzugefügt wird, um Informationen über seinen Zustand zu speichern. (Einige Mail-Reader können auch einen „info“-Abschnitt zu Nachrichten in new hinzufügen.) Der „info“-Abschnitt kann eines von zwei Formaten haben: er kann „2,“ gefolgt von einer Liste standardisierter Flags (z. B. „2,FR“) enthalten, oder er kann „1,“ gefolgt von sogenannten experimentellen Informationen enthalten. Standard-Flags für Maildir-Nachrichten sind wie folgt:

Flag

Bedeutung

Erläuterung

D

Entwurf

Unter Komposition

F

Markiert

Als wichtig markiert

P

Weitergeleitet

Weitergeleitet, erneut gesendet oder zurückgeschickt

R

Beantwortet

An beantwortet

S

Gesehen

Gelesen

T

Gelöscht

Für spätere Löschung markiert

MaildirMessage-Instanzen bieten die folgenden Methoden

get_subdir()

Gibt entweder „new“ (wenn die Nachricht im Unterverzeichnis new gespeichert werden soll) oder „cur“ (wenn die Nachricht im Unterverzeichnis cur gespeichert werden soll) zurück.

Hinweis

Eine Nachricht wird typischerweise von new nach cur verschoben, nachdem auf ihre Mailbox zugegriffen wurde, unabhängig davon, ob die Nachricht gelesen wurde oder nicht. Eine Nachricht msg wurde gelesen, wenn "S" in msg.get_flags() True ist.

set_subdir(subdir)

Legt den Unterverzeichnis fest, in dem die Nachricht gespeichert werden soll. Der Parameter subdir muss entweder „new“ oder „cur“ sein.

get_flags()

Gibt einen String zurück, der die aktuell gesetzten Flags angibt. Wenn die Nachricht dem Standard-Maildir-Format entspricht, ist das Ergebnis die Aneinanderreihung in alphabetischer Reihenfolge von null oder einer Wiederholung jedes der folgenden Zeichen: 'D', 'F', 'P', 'R', 'S' und 'T'. Ein leerer String wird zurückgegeben, wenn keine Flags gesetzt sind oder wenn „info“ experimentelle Semantik enthält.

set_flags(flags)

Setzt die von flags angegebenen Flags und löscht alle anderen.

add_flag(flag)

Setzt das bzw. die durch flag angegebene(n) Flag(s), ohne andere Flags zu ändern. Um mehrere Flags gleichzeitig hinzuzufügen, kann flag ein String mit mehreren Zeichen sein. Die aktuelle „info“ wird überschrieben, unabhängig davon, ob sie experimentelle Informationen und keine Flags enthält.

remove_flag(flag)

Löscht das bzw. die durch flag angegebenen Flag(s), ohne andere Flags zu ändern. Um mehrere Flags gleichzeitig zu entfernen, kann flag ein String mit mehreren Zeichen sein. Wenn „info“ experimentelle Informationen und keine Flags enthält, wird die aktuelle „info“ nicht geändert.

get_date()

Gibt das Zustelldatum der Nachricht als Fließkommazahl zurück, die die Sekunden seit der Epoche repräsentiert.

set_date(date)

Setzt das Zustelldatum der Nachricht auf date, eine Fließkommazahl, die die Sekunden seit der Epoche repräsentiert.

get_info()

Gibt einen String zurück, der die „info“ für eine Nachricht enthält. Dies ist nützlich für den Zugriff auf und die Änderung von „info“, die experimentell ist (d. h. keine Liste von Flags).

set_info(info)

Setzt „info“ auf info, was ein String sein sollte.

Wenn eine MaildirMessage-Instanz basierend auf einer mboxMessage- oder MMDFMessage-Instanz erstellt wird, werden die Header Status und X-Status weggelassen und folgende Konvertierungen vorgenommen:

Ergebnis-Zustand

mboxMessage- oder MMDFMessage-Zustand

Unterverzeichnis „cur“

O-Flag

F-Flag

F-Flag

R-Flag

A-Flag

S-Flag

R-Flag

T-Flag

D-Flag

Wenn eine MaildirMessage-Instanz basierend auf einer MHMessage-Instanz erstellt wird, finden folgende Konvertierungen statt:

Ergebnis-Zustand

MHMessage-Zustand

Unterverzeichnis „cur“

„unseen“-Sequenz

Unterverzeichnis „cur“ und S-Flag

keine „unseen“-Sequenz

F-Flag

„flagged“-Sequenz

R-Flag

„replied“-Sequenz

Wenn eine MaildirMessage-Instanz basierend auf einer BabylMessage-Instanz erstellt wird, finden folgende Konvertierungen statt:

Ergebnis-Zustand

BabylMessage-Zustand

Unterverzeichnis „cur“

„unseen“-Label

Unterverzeichnis „cur“ und S-Flag

kein „unseen“-Label

P-Flag

„forwarded“- oder „resent“-Label

R-Flag

„answered“-Label

T-Flag

„deleted“-Label

mboxMessage-Objekte

class mailbox.mboxMessage(message=None)

Eine Nachricht mit mbox-spezifischem Verhalten. Der Parameter message hat die gleiche Bedeutung wie beim Konstruktor Message.

Nachrichten in einer mbox-Mailbox werden zusammen in einer einzigen Datei gespeichert. Die Absenderadresse der E-Mail und die Zustellzeit werden typischerweise in einer Zeile gespeichert, die mit „From “ beginnt und den Nachrichtenanfang anzeigt, obwohl es erhebliche Variationen im genauen Format dieser Daten zwischen mbox-Implementierungen gibt. Flags, die den Zustand der Nachricht anzeigen, z. B. ob sie gelesen oder als wichtig markiert wurde, werden typischerweise in den Headern Status und X-Status gespeichert.

Herkömmliche Flags für mbox-Nachrichten sind wie folgt:

Flag

Bedeutung

Erläuterung

R

Gelesen

Gelesen

O

Alt

Zuvor vom MUA erkannt

D

Gelöscht

Für spätere Löschung markiert

F

Markiert

Als wichtig markiert

A

Beantwortet

An beantwortet

Die Flags „R“ und „O“ werden im Header Status gespeichert, und die Flags „D“, „F“ und „A“ werden im Header X-Status gespeichert. Die Flags und Header erscheinen typischerweise in der genannten Reihenfolge.

mboxMessage-Instanzen bieten die folgenden Methoden

get_from()

Gibt einen String zurück, der die „From “-Zeile repräsentiert, die den Beginn der Nachricht in einer mbox-Mailbox markiert. Das führende „From “ und der abschließende Zeilenumbruch sind ausgeschlossen.

set_from(from_, time_=None)

Setzt die „From “-Zeile auf from_, die ohne führendes „From “ oder abschließenden Zeilenumbruch angegeben werden sollte. Zur Vereinfachung kann time_ angegeben werden und wird entsprechend formatiert und an from_ angehängt. Wenn time_ angegeben ist, sollte es eine time.struct_time-Instanz, ein Tupel, das an time.strftime() übergeben werden kann, oder True (um time.gmtime() zu verwenden) sein.

get_flags()

Gibt einen String zurück, der die aktuell gesetzten Flags angibt. Wenn die Nachricht dem konventionellen Format entspricht, ist das Ergebnis die Aneinanderreihung in der folgenden Reihenfolge von null oder einer Wiederholung jedes der folgenden Zeichen: 'R', 'O', 'D', 'F' und 'A'.

set_flags(flags)

Setzt die von flags angegebenen Flags und löscht alle anderen. Der Parameter flags sollte die Aneinanderreihung von null oder mehr Wiederholungen jedes der folgenden Zeichen in beliebiger Reihenfolge sein: 'R', 'O', 'D', 'F' und 'A'.

add_flag(flag)

Setzt das bzw. die durch flag angegebene(n) Flag(s), ohne andere Flags zu ändern. Um mehrere Flags gleichzeitig hinzuzufügen, kann flag ein String mit mehreren Zeichen sein.

remove_flag(flag)

Löscht das bzw. die durch flag angegebenen Flag(s), ohne andere Flags zu ändern. Um mehrere Flags gleichzeitig zu entfernen, kann flag ein String mit mehreren Zeichen sein.

Wenn eine mboxMessage-Instanz basierend auf einer MaildirMessage-Instanz erstellt wird, wird eine „From “-Zeile basierend auf dem Zustellungsdatum der MaildirMessage-Instanz generiert und folgende Konvertierungen finden statt:

Ergebnis-Zustand

MaildirMessage-Zustand

R-Flag

S-Flag

O-Flag

Unterverzeichnis „cur“

D-Flag

T-Flag

F-Flag

F-Flag

A-Flag

R-Flag

Wenn eine mboxMessage-Instanz basierend auf einer MHMessage-Instanz erstellt wird, finden folgende Konvertierungen statt:

Ergebnis-Zustand

MHMessage-Zustand

R-Flag und O-Flag

keine „unseen“-Sequenz

O-Flag

„unseen“-Sequenz

F-Flag

„flagged“-Sequenz

A-Flag

„replied“-Sequenz

Wenn eine mboxMessage-Instanz basierend auf einer BabylMessage-Instanz erstellt wird, finden folgende Konvertierungen statt:

Ergebnis-Zustand

BabylMessage-Zustand

R-Flag und O-Flag

kein „unseen“-Label

O-Flag

„unseen“-Label

D-Flag

„deleted“-Label

A-Flag

„answered“-Label

Wenn eine mboxMessage-Instanz basierend auf einer MMDFMessage-Instanz erstellt wird, wird die „From “-Zeile kopiert und alle Flags entsprechen direkt:

Ergebnis-Zustand

MMDFMessage-Zustand

R-Flag

R-Flag

O-Flag

O-Flag

D-Flag

D-Flag

F-Flag

F-Flag

A-Flag

A-Flag

MHMessage-Objekte

class mailbox.MHMessage(message=None)

Eine Nachricht mit MH-spezifischem Verhalten. Der Parameter message hat die gleiche Bedeutung wie beim Konstruktor Message.

MH-Nachrichten unterstützen keine Markierungen oder Flags im herkömmlichen Sinne, aber sie unterstützen Sequenzen, die logische Gruppierungen beliebiger Nachrichten sind. Einige Mail-Leseprogramme (obwohl nicht die Standard-mh und nmh) verwenden Sequenzen auf ähnliche Weise wie Flags bei anderen Formaten, wie folgt:

Sequenz

Erläuterung

ungesehen

Nicht gelesen, aber zuvor vom MUA erkannt

beantwortet

An beantwortet

markiert

Als wichtig markiert

MHMessage-Instanzen bieten die folgenden Methoden

get_sequences()

Gibt eine Liste der Namen von Sequenzen zurück, die diese Nachricht enthalten.

set_sequences(sequences)

Legt die Liste der Sequenzen fest, die diese Nachricht enthalten.

add_sequence(sequence)

Fügt sequence zur Liste der Sequenzen hinzu, die diese Nachricht enthalten.

remove_sequence(sequence)

Entfernt sequence aus der Liste der Sequenzen, die diese Nachricht enthalten.

Wenn eine MHMessage-Instanz basierend auf einer MaildirMessage-Instanz erstellt wird, finden folgende Konvertierungen statt:

Ergebnis-Zustand

MaildirMessage-Zustand

„unseen“-Sequenz

kein S-Flag

„replied“-Sequenz

R-Flag

„flagged“-Sequenz

F-Flag

Wenn eine MHMessage-Instanz basierend auf einer mboxMessage- oder MMDFMessage-Instanz erstellt wird, werden die Header Status und X-Status weggelassen und folgende Konvertierungen finden statt:

Ergebnis-Zustand

mboxMessage- oder MMDFMessage-Zustand

„unseen“-Sequenz

kein R-Flag

„replied“-Sequenz

A-Flag

„flagged“-Sequenz

F-Flag

Wenn eine MHMessage-Instanz basierend auf einer BabylMessage-Instanz erstellt wird, finden folgende Konvertierungen statt:

Ergebnis-Zustand

BabylMessage-Zustand

„unseen“-Sequenz

„unseen“-Label

„replied“-Sequenz

„answered“-Label

BabylMessage-Objekte

class mailbox.BabylMessage(message=None)

Eine Nachricht mit Babyl-spezifischem Verhalten. Der Parameter message hat die gleiche Bedeutung wie beim Konstruktor Message.

Bestimmte Nachrichten-Labels, sogenannte Attribute, haben per Konvention besondere Bedeutungen. Die Attribute sind wie folgt:

Label

Erläuterung

ungesehen

Nicht gelesen, aber zuvor vom MUA erkannt

gelöscht

Für spätere Löschung markiert

abgelegt

In eine andere Datei oder Mailbox kopiert

beantwortet

An beantwortet

weitergeleitet

Weitergeleitet

bearbeitet

Vom Benutzer geändert

erneut gesendet

Erneut gesendet

Standardmäßig zeigt Rmail nur sichtbare Header an. Die Klasse BabylMessage verwendet jedoch die ursprünglichen Header, da sie vollständiger sind. Sichtbare Header können bei Bedarf explizit abgerufen werden.

BabylMessage-Instanzen bieten die folgenden Methoden

get_labels()

Gibt eine Liste von Labels auf der Nachricht zurück.

set_labels(labels)

Setzen Sie die Liste der Labels auf der Nachricht auf labels.

add_label(label)

Fügen Sie label zur Liste der Labels auf der Nachricht hinzu.

remove_label(label)

Entfernen Sie label aus der Liste der Labels auf der Nachricht.

get_visible()

Gibt eine Message-Instanz zurück, deren Header die sichtbaren Header der Nachricht sind und deren Body leer ist.

set_visible(visible)

Setzt die sichtbaren Header der Nachricht gleich den Headern in message. Der Parameter visible sollte eine Message-Instanz, eine email.message.Message-Instanz, eine Zeichenkette oder ein dateiähnliches Objekt (das im Textmodus geöffnet sein sollte) sein.

update_visible()

Wenn die ursprünglichen Header einer BabylMessage-Instanz geändert werden, werden die sichtbaren Header nicht automatisch angepasst. Diese Methode aktualisiert die sichtbaren Header wie folgt: Jeder sichtbare Header mit einem entsprechenden ursprünglichen Header wird auf den Wert des ursprünglichen Headers gesetzt, jeder sichtbare Header ohne einen entsprechenden ursprünglichen Header wird entfernt, und alle der Header Date, From, Reply-To, To, CC und Subject, die in den ursprünglichen Headern vorhanden, aber nicht in den sichtbaren Headern sind, werden zu den sichtbaren Headern hinzugefügt.

Wenn eine BabylMessage-Instanz basierend auf einer MaildirMessage-Instanz erstellt wird, finden die folgenden Konvertierungen statt

Ergebnis-Zustand

MaildirMessage-Zustand

„unseen“-Label

kein S-Flag

„deleted“-Label

T-Flag

„answered“-Label

R-Flag

„forwarded“-Label

P-Flag

Wenn eine BabylMessage-Instanz basierend auf einer mboxMessage- oder MMDFMessage-Instanz erstellt wird, werden die Header Status und X-Status weggelassen und die folgenden Konvertierungen finden statt

Ergebnis-Zustand

mboxMessage- oder MMDFMessage-Zustand

„unseen“-Label

kein R-Flag

„deleted“-Label

D-Flag

„answered“-Label

A-Flag

Wenn eine BabylMessage-Instanz basierend auf einer MHMessage-Instanz erstellt wird, finden die folgenden Konvertierungen statt

Ergebnis-Zustand

MHMessage-Zustand

„unseen“-Label

„unseen“-Sequenz

„answered“-Label

„replied“-Sequenz

MMDFMessage-Objekte

class mailbox.MMDFMessage(message=None)

Eine Nachricht mit MMDF-spezifischem Verhalten. Der Parameter message hat die gleiche Bedeutung wie beim Konstruktor von Message.

Wie bei Nachrichten in einem mbox-Postfach werden MMDF-Nachrichten mit der Absenderadresse und dem Zustelldatum in einer Anfangszeile, die mit „From “ beginnt, gespeichert. Ebenso werden Flags, die den Zustand der Nachricht anzeigen, typischerweise in Status und X-Status Headern gespeichert.

Herkömmliche Flags für MMDF-Nachrichten sind identisch mit denen von mbox-Nachrichten und lauten wie folgt

Flag

Bedeutung

Erläuterung

R

Gelesen

Gelesen

O

Alt

Zuvor vom MUA erkannt

D

Gelöscht

Für spätere Löschung markiert

F

Markiert

Als wichtig markiert

A

Beantwortet

An beantwortet

Die Flags „R“ und „O“ werden im Header Status gespeichert, und die Flags „D“, „F“ und „A“ werden im Header X-Status gespeichert. Die Flags und Header erscheinen typischerweise in der genannten Reihenfolge.

MMDFMessage-Instanzen bieten die folgenden Methoden, die identisch mit denen von mboxMessage sind

get_from()

Gibt einen String zurück, der die „From “-Zeile repräsentiert, die den Beginn der Nachricht in einer mbox-Mailbox markiert. Das führende „From “ und der abschließende Zeilenumbruch sind ausgeschlossen.

set_from(from_, time_=None)

Setzt die „From “-Zeile auf from_, die ohne führendes „From “ oder abschließenden Zeilenumbruch angegeben werden sollte. Zur Vereinfachung kann time_ angegeben werden und wird entsprechend formatiert und an from_ angehängt. Wenn time_ angegeben ist, sollte es eine time.struct_time-Instanz, ein Tupel, das an time.strftime() übergeben werden kann, oder True (um time.gmtime() zu verwenden) sein.

get_flags()

Gibt einen String zurück, der die aktuell gesetzten Flags angibt. Wenn die Nachricht dem konventionellen Format entspricht, ist das Ergebnis die Aneinanderreihung in der folgenden Reihenfolge von null oder einer Wiederholung jedes der folgenden Zeichen: 'R', 'O', 'D', 'F' und 'A'.

set_flags(flags)

Setzt die von flags angegebenen Flags und löscht alle anderen. Der Parameter flags sollte die Aneinanderreihung von null oder mehr Wiederholungen jedes der folgenden Zeichen in beliebiger Reihenfolge sein: 'R', 'O', 'D', 'F' und 'A'.

add_flag(flag)

Setzt das bzw. die durch flag angegebene(n) Flag(s), ohne andere Flags zu ändern. Um mehrere Flags gleichzeitig hinzuzufügen, kann flag ein String mit mehreren Zeichen sein.

remove_flag(flag)

Löscht das bzw. die durch flag angegebenen Flag(s), ohne andere Flags zu ändern. Um mehrere Flags gleichzeitig zu entfernen, kann flag ein String mit mehreren Zeichen sein.

Wenn eine MMDFMessage-Instanz basierend auf einer MaildirMessage-Instanz erstellt wird, wird eine „From “-Zeile basierend auf dem Zustelldatum der MaildirMessage-Instanz generiert und die folgenden Konvertierungen finden statt

Ergebnis-Zustand

MaildirMessage-Zustand

R-Flag

S-Flag

O-Flag

Unterverzeichnis „cur“

D-Flag

T-Flag

F-Flag

F-Flag

A-Flag

R-Flag

Wenn eine MMDFMessage-Instanz basierend auf einer MHMessage-Instanz erstellt wird, finden die folgenden Konvertierungen statt

Ergebnis-Zustand

MHMessage-Zustand

R-Flag und O-Flag

keine „unseen“-Sequenz

O-Flag

„unseen“-Sequenz

F-Flag

„flagged“-Sequenz

A-Flag

„replied“-Sequenz

Wenn eine MMDFMessage-Instanz basierend auf einer BabylMessage-Instanz erstellt wird, finden die folgenden Konvertierungen statt

Ergebnis-Zustand

BabylMessage-Zustand

R-Flag und O-Flag

kein „unseen“-Label

O-Flag

„unseen“-Label

D-Flag

„deleted“-Label

A-Flag

„answered“-Label

Wenn eine MMDFMessage-Instanz basierend auf einer mboxMessage-Instanz erstellt wird, wird die „From “-Zeile kopiert und alle Flags entsprechen direkt

Ergebnis-Zustand

mboxMessage-Status

R-Flag

R-Flag

O-Flag

O-Flag

D-Flag

D-Flag

F-Flag

F-Flag

A-Flag

A-Flag

Ausnahmen

Die folgenden Ausnahmeklassen sind im Modul mailbox definiert

exception mailbox.Error

Die Basisklasse für alle anderen modulspezifischen Ausnahmen.

exception mailbox.NoSuchMailboxError

Ausgelöst, wenn ein Postfach erwartet wird, aber nicht gefunden wird, z. B. beim Instanziieren einer Mailbox-Unterklasse mit einem Pfad, der nicht existiert (und mit dem Parameter create auf False gesetzt), oder beim Öffnen eines Ordners, der nicht existiert.

exception mailbox.NotEmptyError

Ausgelöst, wenn ein Postfach nicht leer ist, aber leer sein sollte, z. B. beim Löschen eines Ordners, der Nachrichten enthält.

exception mailbox.ExternalClashError

Ausgelöst, wenn eine Postfach-bedingte Bedingung außerhalb der Kontrolle des Programms dazu führt, dass es nicht fortfahren kann, z. B. wenn ein Sperre, die ein anderes Programm bereits hält, nicht erworben werden kann, oder wenn ein eindeutig generierter Dateiname bereits existiert.

exception mailbox.FormatError

Ausgelöst, wenn die Daten in einer Datei nicht analysiert werden können, z. B. wenn eine MH-Instanz versucht, eine beschädigte .mh_sequences-Datei zu lesen.

Beispiele

Ein einfaches Beispiel zum Drucken der Betreffzeilen aller Nachrichten in einem Postfach, die interessant erscheinen

import mailbox
for message in mailbox.mbox('~/mbox'):
    subject = message['subject']       # Could possibly be None.
    if subject and 'python' in subject.lower():
        print(subject)

So kopieren Sie alle E-Mails aus einem Babyl-Postfach in ein MH-Postfach und konvertieren dabei alle format-spezifischen Informationen, die konvertiert werden können

import mailbox
destination = mailbox.MH('~/Mail')
destination.lock()
for message in mailbox.Babyl('~/RMAIL'):
    destination.add(mailbox.MHMessage(message))
destination.flush()
destination.unlock()

Dieses Beispiel sortiert E-Mails von mehreren Mailinglisten in verschiedene Postfächer, wobei darauf geachtet wird, E-Mail-Beschädigungen durch gleichzeitige Änderungen durch andere Programme, E-Mail-Verlust durch Programmunterbrechung oder vorzeitige Beendigung aufgrund fehlerhafter Nachrichten im Postfach zu vermeiden

import mailbox
import email.errors

list_names = ('python-list', 'python-dev', 'python-bugs')

boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names}
inbox = mailbox.Maildir('~/Maildir', factory=None)

for key in inbox.iterkeys():
    try:
        message = inbox[key]
    except email.errors.MessageParseError:
        continue                # The message is malformed. Just leave it.

    for name in list_names:
        list_id = message['list-id']
        if list_id and name in list_id:
            # Get mailbox to use
            box = boxes[name]

            # Write copy to disk before removing original.
            # If there's a crash, you might duplicate a message, but
            # that's better than losing a message completely.
            box.lock()
            box.add(message)
            box.flush()
            box.unlock()

            # Remove original message
            inbox.lock()
            inbox.discard(key)
            inbox.flush()
            inbox.unlock()
            break               # Found destination, so stop looking.

for box in boxes.itervalues():
    box.close()