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
Mailboxdefiniert eine Schnittstelle und ist nicht zur Instanziierung gedacht. Stattdessen sollten format-spezifische Unterklassen vonMailboxerben, 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 derMailbox-Instanz ausgegeben, mit der sie verwendet werden, und sind nur für dieseMailbox-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 Methodeadd()hinzugefügt und mit einerdel-Anweisung oder den mengenartigen Methodenremove()unddiscard()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 eineMessage-Instanz) basierend auf dem aktuellen Zustand der Mailbox generiert. Ähnlich wird beim Hinzufügen einer Nachricht zu einerMailbox-Instanz der Inhalt der bereitgestellten Nachrichtenrepräsentation kopiert. In keinem Fall wird eine Referenz auf die Nachrichtenrepräsentation von derMailbox-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 einerKeyError-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 wiemboxfür gleichzeitiges Schreiben zu vermeiden. Wenn Sie eine Mailbox modifizieren, *müssen* Sie sie sperren, indem Sie die Methodenlock()undunlock()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, eineemail.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-spezifischenMessage-Unterklasse ist (z. B. wenn es einemboxMessage-Instanz ist und dies einembox-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 alsremove()oder__delitem__()aufgerufen wurde, aber keine Ausnahme wird ausgelöst, wenn die Methode alsdiscard()aufgerufen wurde. Das Verhalten vondiscard()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 eineMessage-Instanz, eineemail.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-spezifischenMessage-Unterklasse ist (z. B. wenn es einemboxMessage-Instanz ist und dies einembox-Instanz ist), werden ihre format-spezifischen Informationen verwendet. Andernfalls bleiben die format-spezifischen Informationen der Nachricht, die derzeit key entspricht, unverändert.
- keys()¶
Das Gleiche wie
iterkeys(), nur dass eineListeanstelle 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 derMailbox-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 eineListevon 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 derMailbox-Instanz angegeben.
- items()¶
Das Gleiche wie
iteritems(), nur dass eineListevon 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 eineKeyError-Ausnahme wird ausgelöst, wenn die Methode als__getitem__()aufgerufen wurde. Die Nachricht wird als Instanz der entsprechenden format-spezifischenMessage-Unterklasse dargestellt, es sei denn, es wurde eine benutzerdefinierte Nachrichtenfabrik bei der Initialisierung derMailbox-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 eineKeyError-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 überemail.message.Messageverarbeitet, 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
Truezurück, wenn key einer Nachricht entspricht, andernfallsFalse.
- __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 derMailbox-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-spezifischenMessage-Unterklasse dargestellt, es sei denn, es wurde eine benutzerdefinierte Nachrichtenfabrik bei der Initialisierung derMailbox-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 eineKeyError-Ausnahme ausgelöst. Daher ist es im Allgemeinen falsch, wenn arg eineMailbox-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 undflush()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
ExternalClashErrorwird 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
Mailboxfü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 factoryNoneist, wirdMaildirMessageals Standard-Nachrichtenrepräsentation verwendet. Wenn createTrueist, wird die Mailbox erstellt, falls sie nicht existiert.Wenn create
Trueist 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,newundcur. Nachrichten werden kurzzeitig im Unterverzeichnistmperstellt und dann in das Unterverzeichnisnewverschoben, um die Zustellung abzuschließen. Ein Mail-User-Agent kann die Nachricht anschließend in das Unterverzeichniscurverschieben 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 durchMaildirohne 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 Beispielimport mailbox mailbox.Maildir.colon = '!'
Das Attribut
colonkann auch pro Instanz festgelegt werden.
Geändert in Version 3.13:
Maildirignoriert nun Dateien mit einem führenden Punkt.Maildir-Instanzen haben alle Methoden vonMailboxzusä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 TypNoSuchMailboxErrorwird 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
NotEmptyErrorausgelö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 Methodeget_flags(), da Änderungen, die von den Methodenset_flags(),add_flag()undremove_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 wieone_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 Methodeset_flags(), da mit dieser Postfachmethode vorgenommene Änderungen für die Methodeget_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ürset_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ürset_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 Methodeget_info(), da mit der Methodeset_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 wieone_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 Methodeset_info(), da mit dieser Postfachmethode vorgenommene Änderungen für die Methodeget_info()des Nachrichtenobjekts nicht sichtbar sind.Hinzugefügt in Version 3.13.
Einige von
MaildirimplementierteMailbox-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
Mailboxfü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 factoryNoneist, wirdmboxMessageals Standardnachrichtenrepräsentation verwendet. Wenn createTrueist, 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
mboxdas 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
mboximplementierteMailbox-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()oderclose()auf dermbox-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.
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
Mailboxfü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 factoryNoneist, wirdMHMessageals Standardnachrichtenrepräsentation verwendet. Wenn createTrueist, 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_sequencesin jedem Ordner definiert.Die Klasse
MHmanipuliert MH-Postfächer, versucht aber nicht, alle Verhaltensweisen von mh nachzuahmen. Insbesondere modifiziert sie nicht und wird nicht von den Dateiencontextoder.mh_profilebeeinflusst, die von mh zur Speicherung seines Zustands und seiner Konfiguration verwendet werden.MH-Instanzen haben alle Methoden vonMailboxzusätzlich zu den folgendenGeä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 TypNoSuchMailboxErrorwird 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
NotEmptyErrorausgelö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
MHimplementierteMailbox-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()undlockf(). Für MH-Postfächer bedeutet die Sperrung des Postfachs die Sperrung der Datei.mh_sequencesund, 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 zuunlock().
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
Mailboxfü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 factoryNoneist, wirdBabylMessageals Standardnachrichtenrepräsentation verwendet. Wenn createTrueist, 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 vonMailboxzusä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
BabylimplementierteMailbox-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.
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
Mailboxfü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 factoryNoneist, wirdMMDFMessageals Standardnachrichtendarstellung verwendet. Wenn createTrueist, 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 vonMMDFimplementiert 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()oderclose()auf derMMDF-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.
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-KlasseMessage. Unterklassen vonmailbox.Messagefü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 eineMessage-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 mitMailbox-Instanzen abgerufen wurden. In einigen Situationen sind der Zeit- und Speicheraufwand für die Erzeugung vonMessage-Darstellungen möglicherweise nicht akzeptabel. Für solche Situationen bietenMailbox-Instanzen auch String- und dateiähnliche Darstellungen an, und eine benutzerdefinierte Nachrichtenfabrik kann bei der Initialisierung einerMailbox-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
newin das Unterverzeichniscur, 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 incurhat 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 innewhinzufü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
newgespeichert werden soll) oder „cur“ (wenn die Nachricht im Unterverzeichniscurgespeichert werden soll) zurück.Hinweis
Eine Nachricht wird typischerweise von
newnachcurverschoben, nachdem auf ihre Mailbox zugegriffen wurde, unabhängig davon, ob die Nachricht gelesen wurde oder nicht. Eine Nachrichtmsgwurde gelesen, wenn"S" in msg.get_flags()Trueist.
- 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 |
|
|---|---|
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 |
|
|---|---|
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 |
|
|---|---|
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 antime.strftime()übergeben werden kann, oderTrue(umtime.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 |
|
|---|---|
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 |
|
|---|---|
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 |
|
|---|---|
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 |
|
|---|---|
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 |
|
|---|---|
„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 |
|
|---|---|
„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 |
|
|---|---|
„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
BabylMessageverwendet 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, eineemail.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 |
|
|---|---|
„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 |
|
|---|---|
„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 |
|
|---|---|
„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 vonmboxMessagesind- 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 antime.strftime()übergeben werden kann, oderTrue(umtime.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 |
|
|---|---|
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 |
|
|---|---|
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 |
|
|---|---|
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 |
|
|---|---|
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 aufFalsegesetzt), 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.
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()