email.generator: MIME-Dokumente generieren¶
Quellcode: Lib/email/generator.py
Eine der häufigsten Aufgaben ist die Generierung der flachen (serialisierten) Version der E-Mail-Nachricht, die durch eine Nachrichtenobjektstruktur dargestellt wird. Dies ist erforderlich, wenn Sie Ihre Nachricht über smtplib.SMTP.sendmail() senden oder die Nachricht auf der Konsole ausgeben möchten. Die Umwandlung einer Nachrichtenobjektstruktur in eine serialisierte Darstellung ist die Aufgabe der Generator-Klassen.
Wie beim Modul email.parser sind Sie nicht auf die Funktionalität des mitgelieferten Generators beschränkt; Sie könnten auch selbst einen von Grund auf neu schreiben. Der mitgelieferte Generator weiß jedoch, wie die meisten E-Mails standardkonform generiert werden, sollte MIME- und Nicht-MIME-E-Mail-Nachrichten problemlos verarbeiten und ist so konzipiert, dass die Byte-orientierten Parsing- und Generierungsoperationen invers sind, vorausgesetzt, derselbe nicht-transformierende policy wird für beide verwendet. Das heißt, wenn der serialisierte Byte-Stream über die Klasse BytesParser geparst und dann mit BytesGenerator wieder serialisiert wird, sollte die Ausgabe identisch mit der Eingabe sein [1]. (Andererseits kann die Verwendung des Generators für ein programmgesteuert erstelltes EmailMessage-Objekt zu Änderungen am EmailMessage-Objekt führen, da Standardwerte ausgefüllt werden.)
Die Klasse Generator kann verwendet werden, um eine Nachricht in eine textuelle (im Gegensatz zu binärer) serialisierte Darstellung zu überführen. Da Unicode jedoch keine Binärdaten direkt darstellen kann, wird die Nachricht zwangsläufig in etwas umgewandelt, das nur ASCII-Zeichen enthält, unter Verwendung der standardmäßigen E-Mail-RFC Content-Transfer-Encoding-Techniken zur Kodierung von E-Mail-Nachrichten für den Transport über Kanäle, die nicht "8-Bit-sauber" sind.
Um die reproduzierbare Verarbeitung von SMIME-signierten Nachrichten zu ermöglichen, deaktiviert Generator das Umbrechen von Kopfzeilen für Nachrichtenteile vom Typ multipart/signed und alle Unterteile.
- class email.generator.BytesGenerator(outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)¶
Gibt ein
BytesGenerator-Objekt zurück, das jede an die Methodeflatten()übergebene Nachricht oder jeden an die Methodewrite()übergebenen, als 'surrogateescape' kodierten Text an das dateiähnliche Objekt outfp schreibt. outfp muss einewrite-Methode unterstützen, die Binärdaten akzeptiert.Wenn das optionale Argument mangle_from_ auf
Truegesetzt ist, wird jeder Zeile im Body, die mit der exakten Zeichenkette"From "beginnt (d. h.Fromgefolgt von einem Leerzeichen am Zeilenanfang), ein>-Zeichen vorangestellt. mangle_from_ hat standardmäßig den Wert der Einstellungmangle_from_des policy (der für dencompat32-PolicyTrueund für alle anderenFalseist). mangle_from_ ist für die Verwendung gedacht, wenn Nachrichten im Unix-Mbox-Format gespeichert werden (siehemailboxund WARUM DAS CONTENT-LENGTH-FORMAT SCHLECHT IST).Wenn maxheaderlen nicht
Noneist, werden alle Kopfzeilen, die länger als maxheaderlen sind, neu umgebrochen, oder wenn0, werden keine Kopfzeilen umgebrochen. Wenn manheaderlenNone(Standard) ist, werden Kopfzeilen und andere Nachrichtenzeilen gemäß den policy-Einstellungen umgebrochen.Wenn policy angegeben ist, wird diese Policy zur Steuerung der Nachrichtengenerierung verwendet. Wenn policy
None(Standard) ist, wird die Policy verwendet, die mit demMessage- oderEmailMessage-Objekt verknüpft ist, das anflattenübergeben wird, um die Nachrichtengenerierung zu steuern. Einzelheiten dazu, was policy steuert, finden Sie unteremail.policy.Hinzugefügt in Version 3.2.
Geändert in Version 3.3: Das Schlüsselwort policy wurde hinzugefügt.
Geändert in Version 3.6: Das Standardverhalten der Parameter mangle_from_ und maxheaderlen ist nun, der Policy zu folgen.
- flatten(msg, unixfrom=False, linesep=None)¶
Gibt die textuelle Darstellung der Nachrichtenobjektstruktur, die bei msg verwurzelt ist, an die Ausgabedatei aus, die beim Erstellen der
BytesGenerator-Instanz angegeben wurde.Wenn die Policy-Option
cte_typedespolicyauf8bit(Standard) gesetzt ist, werden alle Kopfzeilen der ursprünglichen geparsten Nachricht, die nicht geändert wurden, mit den ursprünglichen Bits, deren höchstes Bit gesetzt ist, in die Ausgabe kopiert, und die nicht-ASCII Content-Transfer-Encoding von Nachrichtenteilen, die diese haben, wird beibehalten. Wenncte_typeauf7bitgesetzt ist, werden die Bits mit dem gesetzten höchsten Bit mithilfe einer ASCII-kompatiblen Content-Transfer-Encoding konvertiert. Das heißt, Teile mit nicht-ASCII Content-Transfer-Encoding (Content-Transfer-Encoding: 8bit) werden in eine ASCII-kompatible Content-Transfer-Encoding umgewandelt, und RFC-ungültige Nicht-ASCII-Bytes in Kopfzeilen werden unter Verwendung des MIME-Zeichensatzesunknown-8bitkodiert, wodurch sie RFC-konform werden.Wenn unixfrom auf
Truegesetzt ist, wird der von der Unix-Mbox-Formatierung verwendete Umschlagskopf-Begrenzer (siehemailbox) vor dem ersten der RFC 5322-Kopfzeilen des Stammobjekts ausgegeben. Wenn das Stammobjekt keinen Umschlagskopf hat, wird ein Standardkopf erstellt. Der Standardwert istFalse. Beachten Sie, dass für Unterteile niemals ein Umschlagskopf ausgegeben wird.Wenn linesep nicht
Noneist, wird es als Trennzeichen zwischen allen Zeilen der flachen Nachricht verwendet. Wenn linesepNone(Standard) ist, wird der Wert verwendet, der in der policy angegeben ist.
- clone(fp)¶
Gibt eine unabhängige Kopie dieser
BytesGenerator-Instanz mit exakt denselben Einstellungen und fp als neuer outfp zurück.
- write(s)¶
Kodiert s mit dem
ASCII-Codec und demsurrogateescape-Fehlerbehandlungsverfahren und übergibt es an die write-Methode des outfp, das dem Konstruktor desBytesGeneratorübergeben wurde.
Als Komfortfunktion bietet EmailMessage die Methoden as_bytes() und bytes(aMessage) (auch bekannt als __bytes__()), die die Generierung einer serialisierten binären Darstellung eines Nachrichtenobjekts vereinfachen. Weitere Details finden Sie unter email.message.
Da Zeichenketten keine Binärdaten darstellen können, muss die Klasse Generator alle Binärdaten in einer von ihr verarbeiteten Nachricht in ein ASCII-kompatibles Format konvertieren, indem sie diese in eine ASCII-kompatible Content-Transfer_Encoding umwandelt. In Anlehnung an die Terminologie der E-Mail-RFCs kann man sich dies so vorstellen, dass Generator in einen I/O-Stream serialisiert, der nicht "8-Bit-sauber" ist. Mit anderen Worten: Die meisten Anwendungen werden BytesGenerator und nicht Generator verwenden wollen.
- class email.generator.Generator(outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)¶
Gibt ein
Generator-Objekt zurück, das jede an die Methodeflatten()übergebene Nachricht oder jeden an die Methodewrite()übergebenen Text an das dateiähnliche Objekt outfp schreibt. outfp muss einewrite-Methode unterstützen, die Zeichenketten-Daten akzeptiert.Wenn das optionale Argument mangle_from_ auf
Truegesetzt ist, wird jeder Zeile im Body, die mit der exakten Zeichenkette"From "beginnt (d. h.Fromgefolgt von einem Leerzeichen am Zeilenanfang), ein>-Zeichen vorangestellt. mangle_from_ hat standardmäßig den Wert der Einstellungmangle_from_des policy (der für dencompat32-PolicyTrueund für alle anderenFalseist). mangle_from_ ist für die Verwendung gedacht, wenn Nachrichten im Unix-Mbox-Format gespeichert werden (siehemailboxund WARUM DAS CONTENT-LENGTH-FORMAT SCHLECHT IST).Wenn maxheaderlen nicht
Noneist, werden alle Kopfzeilen, die länger als maxheaderlen sind, neu umgebrochen, oder wenn0, werden keine Kopfzeilen umgebrochen. Wenn manheaderlenNone(Standard) ist, werden Kopfzeilen und andere Nachrichtenzeilen gemäß den policy-Einstellungen umgebrochen.Wenn policy angegeben ist, wird diese Policy zur Steuerung der Nachrichtengenerierung verwendet. Wenn policy
None(Standard) ist, wird die Policy verwendet, die mit demMessage- oderEmailMessage-Objekt verknüpft ist, das anflattenübergeben wird, um die Nachrichtengenerierung zu steuern. Einzelheiten dazu, was policy steuert, finden Sie unteremail.policy.Geändert in Version 3.3: Das Schlüsselwort policy wurde hinzugefügt.
Geändert in Version 3.6: Das Standardverhalten der Parameter mangle_from_ und maxheaderlen ist nun, der Policy zu folgen.
- flatten(msg, unixfrom=False, linesep=None)¶
Gibt die textuelle Darstellung der Nachrichtenobjektstruktur, die bei msg verwurzelt ist, an die Ausgabedatei aus, die beim Erstellen der
Generator-Instanz angegeben wurde.Wenn die Policy-Option
cte_typedespolicyauf8bitgesetzt ist, wird die Nachricht generiert, als ob die Option auf7bitgesetzt wäre. (Dies ist erforderlich, da Zeichenketten keine Nicht-ASCII-Bytes darstellen können.) Bits mit dem gesetzten höchsten Bit werden mithilfe einer ASCII-kompatiblen Content-Transfer-Encoding nach Bedarf konvertiert. Das heißt, Teile mit nicht-ASCII Content-Transfer-Encoding (Content-Transfer-Encoding: 8bit) werden in eine ASCII-kompatible Content-Transfer-Encoding umgewandelt, und RFC-ungültige Nicht-ASCII-Bytes in Kopfzeilen werden unter Verwendung des MIME-Zeichensatzesunknown-8bitkodiert, wodurch sie RFC-konform werden.Wenn unixfrom auf
Truegesetzt ist, wird der von der Unix-Mbox-Formatierung verwendete Umschlagskopf-Begrenzer (siehemailbox) vor dem ersten der RFC 5322-Kopfzeilen des Stammobjekts ausgegeben. Wenn das Stammobjekt keinen Umschlagskopf hat, wird ein Standardkopf erstellt. Der Standardwert istFalse. Beachten Sie, dass für Unterteile niemals ein Umschlagskopf ausgegeben wird.Wenn linesep nicht
Noneist, wird es als Trennzeichen zwischen allen Zeilen der flachen Nachricht verwendet. Wenn linesepNone(Standard) ist, wird der Wert verwendet, der in der policy angegeben ist.Geändert in Version 3.2: Unterstützung für die erneute Kodierung von
8bit-Nachrichten-Bodies und das Argument linesep hinzugefügt.
Als Komfortfunktion bietet EmailMessage die Methoden as_string() und str(aMessage) (auch bekannt als __str__()), die die Generierung einer formatierten Zeichenkettenrepräsentation eines Nachrichtenobjekts vereinfachen. Weitere Details finden Sie unter email.message.
Das Modul email.generator bietet außerdem eine abgeleitete Klasse, DecodedGenerator, die der Basisklasse Generator ähnelt, mit der Ausnahme, dass Nicht-text-Teile nicht serialisiert werden, sondern im Ausgabestrom durch eine Zeichenkette repräsentiert werden, die aus einer Vorlage abgeleitet ist, die mit Informationen über den Teil gefüllt wird.
- class email.generator.DecodedGenerator(outfp, mangle_from_=None, maxheaderlen=None, fmt=None, *, policy=None)¶
Verhält sich wie
Generator, außer dass für jeden Unterteil der anGenerator.flatten()übergebenen Nachricht, wenn der Unterteil vom Haupttyp text ist, der dekodierte Payload des Unterteils ausgegeben wird, und wenn der Haupttyp nicht text ist, wird anstelle der Ausgabe die Zeichenkette fmt mit Informationen aus dem Teil gefüllt und die resultierende gefüllte Zeichenkette ausgegeben.Um fmt zu füllen, wird
fmt % part_infoausgeführt, wobeipart_infoein Wörterbuch ist, das aus den folgenden Schlüsseln und Werten besteht:type– Vollständiger MIME-Typ des Nicht-text-Teilsmaintype– Haupt-MIME-Typ des Nicht-text-Teilssubtype– Unter-MIME-Typ des Nicht-text-Teilsfilename– Dateiname des Nicht-text-Teilsdescription– Beschreibung des Nicht-text-Teilsencoding– Content-Transfer-Encoding des Nicht-text-Teils
Wenn fmt
Noneist, wird die folgende Standard-fmt verwendet:“[Nicht-Text (%(type)s) Teil der Nachricht weggelassen, Dateiname %(filename)s]”
Optionale Argumente _mangle_from_ und maxheaderlen sind wie bei der Basisklasse
Generator.
Fußnoten