email.message.Message: Repräsentation einer E-Mail-Nachricht mit der compat32 API¶
Die Klasse Message ist der Klasse EmailMessage sehr ähnlich, jedoch ohne die von letzterer hinzugefügten Methoden und mit leicht abweichendem Standardverhalten für bestimmte andere Methoden. Wir dokumentieren hier auch einige Methoden, die zwar von der Klasse EmailMessage unterstützt werden, aber nur dann empfohlen werden, wenn Sie mit Legacy-Code arbeiten.
Die Philosophie und Struktur der beiden Klassen ist ansonsten gleich.
Dieses Dokument beschreibt das Verhalten unter der Standardrichtlinie (für Message) Compat32. Wenn Sie eine andere Richtlinie verwenden möchten, sollten Sie stattdessen die Klasse EmailMessage verwenden.
Eine E-Mail-Nachricht besteht aus Headern und einer Payload. Header müssen Namen und Werte im Stil von RFC 5322 sein, wobei Feldname und Wert durch einen Doppelpunkt getrennt sind. Der Doppelpunkt ist weder Teil des Feldnamens noch des Feldwerts. Die Payload kann eine einfache Textnachricht, ein Binärobjekt oder eine strukturierte Sequenz von Unter-Nachrichten sein, jede mit ihren eigenen Headern und ihrer eigenen Payload. Letzterer Typ von Payload wird dadurch angezeigt, dass die Nachricht einen MIME-Typ wie multipart/* oder message/rfc822 hat.
Das von einem Message-Objekt bereitgestellte konzeptionelle Modell ist das eines geordneten Wörterbuchs von Headern mit zusätzlichen Methoden für den Zugriff auf spezialisierte Informationen aus den Headern, für den Zugriff auf die Payload, für die Generierung einer serialisierten Version der Nachricht und für das rekursive Durchlaufen des Objektbaums. Beachten Sie, dass doppelte Header unterstützt werden, aber spezielle Methoden verwendet werden müssen, um auf sie zuzugreifen.
Das Message-Pseudo-Wörterbuch wird von den Headernamen indiziert, die ASCII-Werte sein müssen. Die Werte des Wörterbuchs sind Zeichenfolgen, die nur ASCII-Zeichen enthalten sollen; es gibt eine spezielle Handhabung für Nicht-ASCII-Eingaben, die jedoch nicht immer die richtigen Ergebnisse liefert. Header werden in Groß- und Kleinschreibung erhaltener Form gespeichert und zurückgegeben, Feldnamen werden jedoch ohne Berücksichtigung der Groß- und Kleinschreibung abgeglichen. Es kann auch einen einzelnen Umschlag-Header geben, der auch als Unix-From-Header oder From_-Header bezeichnet wird. Die Payload ist entweder eine Zeichenkette oder Bytes im Falle einfacher Nachrichtenobjekte oder eine Liste von Message-Objekten für MIME-Containerdokumente (z. B. multipart/* und message/rfc822).
Hier sind die Methoden der Klasse Message
- class email.message.Message(policy=compat32)¶
Wenn policy angegeben ist (es muss eine Instanz einer Klasse aus
email.policysein), werden die von ihr spezifizierten Regeln verwendet, um die Darstellung der Nachricht zu aktualisieren und zu serialisieren. Wenn policy nicht gesetzt ist, wird diecompat32-Richtlinie verwendet, die die Abwärtskompatibilität mit der Python 3.2-Version des E-Mail-Pakets aufrechterhält. Weitere Informationen finden Sie in der Dokumentation zupolicy.Geändert in Version 3.3: Das Schlüsselwortargument policy wurde hinzugefügt.
- as_string(unixfrom=False, maxheaderlen=0, policy=None)¶
Gibt die gesamte Nachricht als Zeichenkette zurück. Wenn das optionale unixfrom True ist, wird der Umschlag-Header in die zurückgegebene Zeichenkette aufgenommen. unixfrom ist standardmäßig
False. Aus Gründen der Abwärtskompatibilität ist maxheaderlen standardmäßig0. Wenn Sie also einen anderen Wert wünschen, müssen Sie ihn explizit überschreiben (der für max_line_length in der Richtlinie angegebene Wert wird von dieser Methode ignoriert). Das Argument policy kann verwendet werden, um die Standardrichtlinie der Nachrichteninstanz zu überschreiben. Dies kann verwendet werden, um die von der Methode erzeugte Formatierung zu steuern, da die angegebene policy an denGeneratorweitergegeben wird.Das Abflachen der Nachricht kann zu Änderungen an der
Messageführen, wenn Standardwerte aufgefüllt werden müssen, um die Transformation in eine Zeichenkette abzuschließen (z. B. können MIME-Grenzen generiert oder geändert werden).Beachten Sie, dass diese Methode als Komfortfunktion bereitgestellt wird und die Nachricht möglicherweise nicht immer wie gewünscht formatiert. Sie erledigt beispielsweise standardmäßig nicht die Behandlung von Zeilen, die mit
Frombeginnen und für das Unix-Mbox-Format erforderlich sind. Für mehr Flexibilität instanziieren Sie eineGenerator-Instanz und verwenden Sie derenflatten()-Methode direkt. Zum Beispielfrom io import StringIO from email.generator import Generator fp = StringIO() g = Generator(fp, mangle_from_=True, maxheaderlen=60) g.flatten(msg) text = fp.getvalue()
Wenn das Nachrichtenobjekt Binärdaten enthält, die nicht gemäß RFC-Standards codiert sind, werden die nicht konformen Daten durch Unicode-"Unbekannte Zeichen"-Codepunkte ersetzt. (Siehe auch
as_bytes()undBytesGenerator.)Geändert in Version 3.4: Das Schlüsselwortargument policy wurde hinzugefügt.
- __str__()¶
Entspricht
as_string(). Ermöglicht, dassstr(msg)eine Zeichenkette mit der formatierten Nachricht erzeugt.
- as_bytes(unixfrom=False, policy=None)¶
Gibt die gesamte Nachricht als Bytes-Objekt zurück. Wenn das optionale unixfrom True ist, wird der Umschlag-Header in die zurückgegebene Zeichenkette aufgenommen. unixfrom ist standardmäßig
False. Das Argument policy kann verwendet werden, um die Standardrichtlinie der Nachrichteninstanz zu überschreiben. Dies kann verwendet werden, um die von der Methode erzeugte Formatierung zu steuern, da die angegebene policy an denBytesGeneratorweitergegeben wird.Das Abflachen der Nachricht kann zu Änderungen an der
Messageführen, wenn Standardwerte aufgefüllt werden müssen, um die Transformation in eine Zeichenkette abzuschließen (z. B. können MIME-Grenzen generiert oder geändert werden).Beachten Sie, dass diese Methode als Komfortfunktion bereitgestellt wird und die Nachricht möglicherweise nicht immer wie gewünscht formatiert. Sie erledigt beispielsweise standardmäßig nicht die Behandlung von Zeilen, die mit
Frombeginnen und für das Unix-Mbox-Format erforderlich sind. Für mehr Flexibilität instanziieren Sie eineBytesGenerator-Instanz und verwenden Sie derenflatten()-Methode direkt. Zum Beispielfrom io import BytesIO from email.generator import BytesGenerator fp = BytesIO() g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60) g.flatten(msg) text = fp.getvalue()
Hinzugefügt in Version 3.4.
- __bytes__()¶
Entspricht
as_bytes(). Ermöglicht, dassbytes(msg)ein Bytes-Objekt mit der formatierten Nachricht erzeugt.Hinzugefügt in Version 3.4.
- is_multipart()¶
Gibt
Truezurück, wenn die Payload der Nachricht eine Liste von Sub-Message-Objekten ist, andernfallsFalse. Wennis_multipart()Falsezurückgibt, sollte die Payload ein Zeichenkettenobjekt sein (was eine CTE-codierte binäre Payload sein könnte). (Beachten Sie, dassis_multipart()nicht unbedingtTruezurückgibt, nur weil „msg.get_content_maintype() == ‘multipart'“ True ist. Zum Beispiel gibtis_multipartTruezurück, wenn dieMessagevom Typmessage/rfc822ist.)
- set_unixfrom(unixfrom)¶
Setzt den Umschlag-Header der Nachricht auf unixfrom, was eine Zeichenkette sein sollte.
- get_unixfrom()¶
Gibt den Umschlag-Header der Nachricht zurück. Standardmäßig
None, wenn der Umschlag-Header nie gesetzt wurde.
- attach(payload)¶
Fügt die gegebene payload zur aktuellen Payload hinzu, die vor dem Aufruf
Noneoder eine Liste vonMessage-Objekten sein muss. Nach dem Aufruf ist die Payload immer eine Liste vonMessage-Objekten. Wenn Sie die Payload auf ein Skalarobjekt (z. B. eine Zeichenkette) setzen möchten, verwenden Sie stattdessenset_payload().Dies ist eine Legacy-Methode. Auf der Klasse
EmailMessagewird ihre Funktionalität durchset_content()und die zugehörigen Methodenmakeundaddersetzt.
- get_payload(i=None, decode=False)¶
Gibt die aktuelle Payload zurück, die eine Liste von
Message-Objekten ist, wennis_multipart()Trueist, oder eine Zeichenkette, wennis_multipart()Falseist. Wenn die Payload eine Liste ist und Sie das Listenobjekt verändern, verändern Sie die Payload der Nachricht direkt.Mit dem optionalen Argument i gibt
get_payload()das i-te Element der Payload zurück, beginnend bei Null, wennis_multipart()Trueist. EinIndexErrorwird ausgelöst, wenn i kleiner als 0 oder größer oder gleich der Anzahl der Elemente in der Payload ist. Wenn die Payload eine Zeichenkette ist (d. h.is_multipart()Falseist) und i angegeben ist, wird einTypeErrorausgelöst.Optionales decode ist ein Flag, das angibt, ob die Payload gemäß dem Content-Transfer-Encoding-Header dekodiert werden soll. Wenn
Trueist und die Nachricht keine Multipart ist, wird die Payload dekodiert, wenn der Wert dieses Headersquoted-printableoderbase64ist. Wenn eine andere Codierung verwendet wird oder der Content-Transfer-Encoding-Header fehlt, wird die Payload unverändert zurückgegeben (undekodiert). In allen Fällen handelt es sich bei dem zurückgegebenen Wert um Binärdaten. Wenn die Nachricht eine Multipart ist und das decode-FlagTrueist, wirdNonezurückgegeben. Wenn die Payload base64 ist und nicht perfekt formatiert war (fehlende Auffüllung, Zeichen außerhalb des base64-Alphabets), wird ein entsprechender Fehler zur Fehlereigenschaft der Nachricht hinzugefügt (InvalidBase64PaddingDefectoderInvalidBase64CharactersDefect).Wenn decode
False(Standard) ist, wird der Body als Zeichenkette ohne Dekodierung des Content-Transfer-Encoding zurückgegeben. Bei einem Content-Transfer-Encoding von 8bit wird jedoch versucht, die ursprünglichen Bytes mit der im Content-Type-Header angegebenencharsetunter Verwendung des Fehlerbehandlungsverfahrensreplacezu dekodieren. Wenn keincharsetangegeben ist oder wenn das angegebenecharsetvom E-Mail-Paket nicht erkannt wird, wird der Body mit dem Standard-ASCII-Zeichensatz dekodiert.Dies ist eine Legacy-Methode. Auf der Klasse
EmailMessagewird ihre Funktionalität durchget_content()unditer_parts()ersetzt.
- set_payload(payload, charset=None)¶
Setzt die gesamte Payload des Nachrichtenobjekts auf payload. Es liegt in der Verantwortung des Clients, die Payload-Invarianten sicherzustellen. Optionales charset setzt den Standardzeichensatz der Nachricht; siehe
set_charset()für Details.Dies ist eine Legacy-Methode. Auf der Klasse
EmailMessagewird ihre Funktionalität durchset_content()ersetzt.
- set_charset(charset)¶
Setzt den Zeichensatz der Payload auf charset, was entweder eine Instanz von
Charset(sieheemail.charset), eine Zeichenkette, die einen Zeichensatz benennt, oderNonesein kann. Wenn es eine Zeichenkette ist, wird sie in eine Instanz vonCharsetkonvertiert. Wenn charsetNoneist, wird der Parametercharsetaus dem Content-Type-Header entfernt (die Nachricht wird nicht anderweitig verändert). Alles andere löst einenTypeErroraus.Wenn kein vorhandener MIME-Version-Header vorhanden ist, wird einer hinzugefügt. Wenn kein vorhandener Content-Type-Header vorhanden ist, wird einer mit dem Wert text/plain hinzugefügt. Unabhängig davon, ob der Content-Type-Header bereits vorhanden ist oder nicht, wird sein Parameter
charsetauf charset.output_charset gesetzt. Wenn charset.input_charset und charset.output_charset sich unterscheiden, wird die Payload in den output_charset neu codiert. Wenn kein vorhandener Content-Transfer-Encoding-Header vorhanden ist, wird die Payload bei Bedarf mit dem angegebenenCharsettransfercodiert und ein Header mit dem entsprechenden Wert hinzugefügt. Wenn ein Content-Transfer-Encoding-Header bereits vorhanden ist, wird angenommen, dass die Payload bereits mit diesem Content-Transfer-Encoding korrekt codiert ist und wird nicht verändert.Dies ist eine Legacy-Methode. Auf der Klasse
EmailMessagewird ihre Funktionalität durch den charset-Parameter der Methodeemail.message.EmailMessage.set_content()ersetzt.
- get_charset()¶
Gibt die
Charset-Instanz zurück, die mit der Payload der Nachricht verknüpft ist.Dies ist eine Legacy-Methode. Auf der Klasse
EmailMessagegibt sie immerNonezurück.
Die folgenden Methoden implementieren eine Mapping-ähnliche Schnittstelle für den Zugriff auf die RFC 2822-Header der Nachricht. Beachten Sie, dass es semantische Unterschiede zwischen diesen Methoden und einer normalen Mapping-Schnittstelle (d. h. einem Wörterbuch) gibt. Zum Beispiel gibt es in einem Wörterbuch keine doppelten Schlüssel, aber hier kann es doppelte Nachrichten-Header geben. Außerdem gibt es in Wörterbüchern keine garantierte Reihenfolge der von
keys()zurückgegebenen Schlüssel, aber in einemMessage-Objekt werden Header immer in der Reihenfolge zurückgegeben, in der sie in der ursprünglichen Nachricht erschienen sind oder später zur Nachricht hinzugefügt wurden. Jeder gelöschte und dann neu hinzugefügte Header wird immer am Ende der Header-Liste angehängt.Diese semantischen Unterschiede sind beabsichtigt und auf maximale Benutzerfreundlichkeit ausgerichtet.
Beachten Sie, dass in allen Fällen ein etwaiger Umschlag-Header in der Nachricht nicht in der Mapping-Schnittstelle enthalten ist.
In einem aus Bytes generierten Modell werden Header-Werte, die (entgegen den RFCs) Nicht-ASCII-Bytes enthalten, bei Abruf über diese Schnittstelle als
Header-Objekte mit einem Zeichensatz vonunknown-8bitdargestellt.- __len__()¶
Gibt die Gesamtzahl der Header zurück, einschließlich Duplikaten.
- __contains__(name)¶
Gibt
Truezurück, wenn das Nachrichtenobjekt ein Feld mit dem Namen name hat. Die Übereinstimmung erfolgt unabhängig von der Groß- und Kleinschreibung, und name sollte den nachfolgenden Doppelpunkt nicht enthalten. Wird für denin-Operator verwendet, z. B.if 'message-id' in myMessage: print('Message-ID:', myMessage['message-id'])
- __getitem__(name)¶
Gibt den Wert des benannten Headerfelds zurück. name sollte den Doppelpunkt-Feldtrenner nicht enthalten. Wenn der Header fehlt, wird
Nonezurückgegeben; einKeyErrorwird nie ausgelöst.Beachten Sie, dass, wenn das benannte Feld mehr als einmal in den Headern der Nachricht vorkommt, undefiniert ist, welcher dieser Feldwerte zurückgegeben wird. Verwenden Sie die Methode
get_all(), um die Werte aller vorhandenen benannten Header zu erhalten.
- __setitem__(name, val)¶
Fügt einen Header zur Nachricht mit dem Feldnamen name und dem Wert val hinzu. Das Feld wird am Ende der vorhandenen Felder der Nachricht angehängt.
Beachten Sie, dass dadurch vorhandene Header mit demselben Namen *nicht* überschrieben oder gelöscht werden. Wenn Sie sicherstellen möchten, dass der neue Header der einzige ist, der in der Nachricht mit dem Feldnamen name vorhanden ist, löschen Sie das Feld zuerst, z. B.
del msg['subject'] msg['subject'] = 'Python roolz!'
- __delitem__(name)¶
Löscht alle Vorkommen des Felds mit dem Namen name aus den Headern der Nachricht. Es wird keine Ausnahme ausgelöst, wenn das benannte Feld nicht in den Headern vorhanden ist.
- keys()¶
Gibt eine Liste aller Headerfeldnamen der Nachricht zurück.
- values()¶
Gibt eine Liste aller Feldwerte der Nachricht zurück.
- items()¶
Gibt eine Liste von 2-Tupeln zurück, die alle Feld-Header und Werte der Nachricht enthalten.
- get(name, failobj=None)¶
Gibt den Wert des benannten Headerfelds zurück. Dies ist identisch mit
__getitem__(), außer dass das optionale failobj zurückgegeben wird, wenn der benannte Header fehlt (standardmäßigNone).
Hier sind einige zusätzliche nützliche Methoden
- get_all(name, failobj=None)¶
Gibt eine Liste aller Werte für das Feld mit dem Namen name zurück. Wenn keine solchen benannten Header in der Nachricht vorhanden sind, wird failobj zurückgegeben (standardmäßig
None).
- add_header(_name, _value, **_params)¶
Erweiterte Header-Einstellung. Diese Methode ähnelt
__setitem__(), außer dass zusätzliche Header-Parameter als Schlüsselwortargumente bereitgestellt werden können. _name ist das hinzuzufügende Header-Feld und _value ist der primäre Wert für den Header.Für jedes Element im Schlüsselwortargumenten-Wörterbuch _params wird der Schlüssel als Parametername genommen, wobei Unterstriche durch Bindestriche ersetzt werden (da Bindestriche in Python-Bezeichnern illegal sind). Normalerweise wird der Parameter als
key="value"hinzugefügt, es sei denn, der Wert istNone, in diesem Fall wird nur der Schlüssel hinzugefügt. Wenn der Wert Nicht-ASCII-Zeichen enthält, kann er als Dreier-Tupel im Format(CHARSET, LANGUAGE, VALUE)angegeben werden, wobeiCHARSETein String ist, der die zu verwendende Zeichenkodierung für den Wert angibt,LANGUAGEnormalerweise aufNoneoder den leeren String gesetzt werden kann (siehe RFC 2231 für andere Möglichkeiten) undVALUEder String-Wert ist, der Nicht-ASCII-Codepunkte enthält. Wenn kein Dreier-Tupel übergeben wird und der Wert Nicht-ASCII-Zeichen enthält, wird er automatisch im RFC 2231-Format mit einerCHARSETvonutf-8und einerLANGUAGEvonNonekodiert.Hier ist ein Beispiel
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
Dies fügt einen Header hinzu, der so aussieht
Content-Disposition: attachment; filename="bud.gif"
Ein Beispiel mit Nicht-ASCII-Zeichen
msg.add_header('Content-Disposition', 'attachment', filename=('iso-8859-1', '', 'Fußballer.ppt'))
Was ergibt
Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"
- replace_header(_name, _value)¶
Ersetzt einen Header. Ersetzt den ersten im Nachricht gefundenen Header, der mit _name übereinstimmt, wobei die Header-Reihenfolge und die Groß-/Kleinschreibung des Feldnamens beibehalten werden. Wenn kein übereinstimmender Header gefunden wurde, wird ein
KeyErrorausgelöst.
- get_content_type()¶
Gibt den Inhaltstyp der Nachricht zurück. Der zurückgegebene String wird in Kleinbuchstaben im Format maintype/subtype umgewandelt. Wenn kein Content-Type-Header in der Nachricht vorhanden war, wird der Standardtyp gemäß
get_default_type()zurückgegeben. Da Nachrichten gemäß RFC 2045 immer einen Standardtyp haben, gibtget_content_type()immer einen Wert zurück.RFC 2045 definiert den Standardtyp einer Nachricht als text/plain, es sei denn, sie erscheint innerhalb eines multipart/digest-Containers, in diesem Fall wäre sie message/rfc822. Wenn der Content-Type-Header eine ungültige Typangabe enthält, schreibt RFC 2045 vor, dass der Standardtyp text/plain ist.
- get_content_maintype()¶
Gibt den Hauptinhaltstyp der Nachricht zurück. Dies ist der maintype-Teil des von
get_content_type()zurückgegebenen Strings.
- get_content_subtype()¶
Gibt den Unterinhaltstyp der Nachricht zurück. Dies ist der subtype-Teil des von
get_content_type()zurückgegebenen Strings.
- get_default_type()¶
Gibt den Standardinhaltstyp zurück. Die meisten Nachrichten haben einen Standardinhaltstyp von text/plain, außer Nachrichten, die Unterteile von multipart/digest-Containern sind. Solche Unterteile haben einen Standardinhaltstyp von message/rfc822.
- set_default_type(ctype)¶
Legt den Standardinhaltstyp fest. ctype sollte entweder text/plain oder message/rfc822 sein, obwohl dies nicht erzwungen wird. Der Standardinhaltstyp wird nicht im Content-Type-Header gespeichert.
- get_params(failobj=None, header='content-type', unquote=True)¶
Gibt die Parameter des Content-Type-Headers der Nachricht als Liste zurück. Die Elemente der zurückgegebenen Liste sind 2-Tupel von Schlüssel/Wert-Paaren, wie sie am Zeichen
'='aufgeteilt sind. Die linke Seite des'='ist der Schlüssel, während die rechte Seite der Wert ist. Wenn kein'='-Zeichen im Parameter vorhanden ist, ist der Wert die leere Zeichenkette, andernfalls ist der Wert wie inget_param()beschrieben und wird optional entquotet, wenn unquoteTrueist (Standard).Das optionale failobj ist das Objekt, das zurückgegeben wird, wenn kein Content-Type-Header vorhanden ist. Das optionale header ist der Header, der anstelle von Content-Type durchsucht werden soll.
Dies ist eine Legacy-Methode. In der Klasse
EmailMessagewird ihre Funktionalität durch die params-Eigenschaft der einzelnen Header-Objekte ersetzt, die von den Header-Zugriffsmethoden zurückgegeben werden.
- get_param(param, failobj=None, header='content-type', unquote=True)¶
Gibt den Wert des Parameters param des Content-Type-Headers als String zurück. Wenn die Nachricht keinen Content-Type-Header hat oder wenn es einen solchen Parameter nicht gibt, wird failobj zurückgegeben (Standard ist
None).Das optionale header, falls angegeben, gibt den Nachrichtenkopf an, der anstelle von Content-Type verwendet werden soll.
Parameter-Schlüssel werden immer case-insensitiv verglichen. Der Rückgabewert kann entweder ein String sein oder ein 3-Tupel, wenn der Parameter RFC 2231-kodiert war. Wenn es sich um ein 3-Tupel handelt, haben die Elemente des Werts die Form
(CHARSET, LANGUAGE, VALUE). Beachten Sie, dass sowohlCHARSETals auchLANGUAGENonesein können, in diesem Fall sollten SieVALUEals in derus-ascii-Zeichenkodierung kodiert betrachten. Sie könnenLANGUAGEnormalerweise ignorieren.Wenn Ihre Anwendung nicht darauf achtet, ob der Parameter wie in RFC 2231 kodiert wurde, können Sie den Parameterwert durch Aufrufen von
email.utils.collapse_rfc2231_value()zusammenführen, wobei der Rückgabewert vonget_param()übergeben wird. Dies gibt einen entsprechend dekodierten Unicode-String zurück, wenn der Wert ein Tupel ist, oder den ursprünglichen String unquotet, wenn er es nicht ist. Zum Beispielrawparam = msg.get_param('foo') param = email.utils.collapse_rfc2231_value(rawparam)
In jedem Fall ist der Parameterwert (entweder der zurückgegebene String oder das
VALUE-Element im 3-Tupel) immer unquotet, es sei denn, unquote ist aufFalsegesetzt.Dies ist eine Legacy-Methode. In der Klasse
EmailMessagewird ihre Funktionalität durch die params-Eigenschaft der einzelnen Header-Objekte ersetzt, die von den Header-Zugriffsmethoden zurückgegeben werden.
- set_param(param, value, header='Content-Type', requote=True, charset=None, language='', replace=False)¶
Setzt einen Parameter im Content-Type-Header. Wenn der Parameter bereits im Header vorhanden ist, wird sein Wert durch value ersetzt. Wenn der Content-Type-Header für diese Nachricht noch nicht definiert wurde, wird er auf text/plain gesetzt und der neue Parameterwert wird gemäß RFC 2045 angehängt.
Der optionale header gibt einen alternativen Header zu Content-Type an, und alle Parameter werden nach Bedarf gequotet, es sei denn, das optionale requote ist
False(Standard istTrue).Wenn das optionale charset angegeben ist, wird der Parameter gemäß RFC 2231 kodiert. Das optionale language gibt die RFC 2231-Sprache an und hat standardmäßig den leeren String. Sowohl charset als auch language sollten Strings sein.
Wenn replace
False(Standard) ist, wird der Header ans Ende der Liste der Header verschoben. Wenn replaceTrueist, wird der Header an Ort und Stelle aktualisiert.Geändert in Version 3.4: Das Schlüsselwort
replacewurde hinzugefügt.
- del_param(param, header='content-type', requote=True)¶
Entfernt den angegebenen Parameter vollständig aus dem Content-Type-Header. Der Header wird an Ort und Stelle ohne den Parameter oder seinen Wert neu geschrieben. Alle Werte werden nach Bedarf gequotet, es sei denn, requote ist
False(Standard istTrue). Das optionale header gibt eine Alternative zu Content-Type an.
- set_type(type, header='Content-Type', requote=True)¶
Legt den Haupttyp und Untertyp für den Content-Type-Header fest. type muss ein String im Format maintype/subtype sein, andernfalls wird ein
ValueErrorausgelöst.Diese Methode ersetzt den Content-Type-Header und behält alle Parameter bei. Wenn requote
Falseist, bleiben die Quoten des vorhandenen Headers unverändert, andernfalls werden die Parameter gequotet (Standard).Ein alternativer Header kann im Argument header angegeben werden. Wenn der Content-Type-Header gesetzt wird, wird auch ein MIME-Version-Header hinzugefügt.
Dies ist eine Legacy-Methode. In der Klasse
EmailMessagewird ihre Funktionalität durch die Methodenmake_undadd_ersetzt.
- get_filename(failobj=None)¶
Gibt den Wert des
filename-Parameters des Content-Disposition-Headers der Nachricht zurück. Wenn der Header keinenfilename-Parameter hat, greift diese Methode auf die Suche nach demname-Parameter im Content-Type-Header zurück. Wenn keiner von beiden gefunden wird oder der Header fehlt, wird failobj zurückgegeben. Der zurückgegebene String wird immer gemäßemail.utils.unquote()unquotet.
- get_boundary(failobj=None)¶
Gibt den Wert des
boundary-Parameters des Content-Type-Headers der Nachricht zurück, oder failobj, wenn entweder der Header fehlt oder keinenboundary-Parameter hat. Der zurückgegebene String wird immer gemäßemail.utils.unquote()unquotet.
- set_boundary(boundary)¶
Setzt den
boundary-Parameter des Content-Type-Headers auf boundary.set_boundary()wird boundary immer bei Bedarf quoten. EinHeaderParseErrorwird ausgelöst, wenn das Nachrichtenobjekt keinen Content-Type-Header hat.Beachten Sie, dass die Verwendung dieser Methode subtil anders ist als das Löschen des alten Content-Type-Headers und das Hinzufügen eines neuen mit dem neuen Boundary über
add_header(), daset_boundary()die Reihenfolge des Content-Type-Headers in der Liste der Header beibehält. Es behält jedoch keine fortlaufenden Zeilen bei, die möglicherweise im ursprünglichen Content-Type-Header vorhanden waren.
- get_content_charset(failobj=None)¶
Gibt den
charset-Parameter des Content-Type-Headers zurück, umgewandelt in Kleinbuchstaben. Wenn kein Content-Type-Header vorhanden ist oder dieser Header keinencharset-Parameter hat, wird failobj zurückgegeben.Beachten Sie, dass diese Methode von
get_charset()abweicht, das dieCharset-Instanz für die Standardkodierung des Nachrichtentexts zurückgibt.
- get_charsets(failobj=None)¶
Gibt eine Liste zurück, die die Zeichensetznahmen in der Nachricht enthält. Wenn die Nachricht ein multipart ist, enthält die Liste ein Element für jeden Unterteil in der Nutzlast, andernfalls ist sie eine Liste der Länge 1.
Jedes Element in der Liste ist ein String, der den Wert des
charset-Parameters im Content-Type-Header für den dargestellten Unterteil darstellt. Wenn der Unterteil jedoch keinen Content-Type-Header, keinencharset-Parameter hat oder nicht vom MIME-Typ text ist, ist dieses Element in der zurückgegebenen Liste failobj.
- get_content_disposition()¶
Gibt den kleingeschriebenen Wert (ohne Parameter) des Content-Disposition-Headers der Nachricht zurück, falls vorhanden, oder
None. Die möglichen Werte für diese Methode sind inline, attachment oderNone, wenn die Nachricht RFC 2183 folgt.Hinzugefügt in Version 3.5.
- walk()¶
Die Methode
walk()ist ein Allzweck-Generator, der verwendet werden kann, um alle Teile und Unterteile eines Nachrichtenobjektbaums in Tiefensuche-Reihenfolge zu durchlaufen. Typischerweise verwenden Siewalk()als Iterator in einerfor-Schleife; jede Iteration gibt den nächsten Unterteil zurück.Hier ist ein Beispiel, das den MIME-Typ jedes Teils einer multipart-Nachrichtenstruktur ausgibt
>>> for part in msg.walk(): ... print(part.get_content_type()) multipart/report text/plain message/delivery-status text/plain text/plain message/rfc822 text/plain
walkdurchläuft die Unterteile jedes Teils, für denis_multipart()Truezurückgibt, auch wennmsg.get_content_maintype() == 'multipart'Falsezurückgeben kann. Dies können wir in unserem Beispiel sehen, indem wir die Debug-Hilfsfunktion_structureverwenden>>> for part in msg.walk(): ... print(part.get_content_maintype() == 'multipart', ... part.is_multipart()) True True False False False True False False False False False True False False >>> _structure(msg) multipart/report text/plain message/delivery-status text/plain text/plain message/rfc822 text/plain
Hier sind die
message-Teile keinemultiparts, aber sie enthalten Unterteile.is_multipart()gibtTruezurück undwalksteigt in die Unterteile ab.
Message-Objekte können auch optional zwei Instanzattribute enthalten, die bei der Generierung des Klartextes einer MIME-Nachricht verwendet werden können.- preamble¶
Das Format eines MIME-Dokuments erlaubt Text zwischen der Leerzeile nach den Headern und dem ersten Multipart-Boundary-String. Normalerweise ist dieser Text in einem MIME-fähigen Mailreader nie sichtbar, da er außerhalb der Standard-MIME-Hülle liegt. Beim Betrachten des reinen Textes der Nachricht oder beim Betrachten der Nachricht in einem nicht-MIME-fähigen Reader kann dieser Text jedoch sichtbar werden.
Das Attribut preamble enthält diesen führenden zusätzlichen Hüllen-Text für MIME-Dokumente. Wenn der
ParserText nach den Headern, aber vor dem ersten Boundary-String entdeckt, weist er diesen Text dem preamble-Attribut der Nachricht zu. Wenn derGeneratordie Klartextdarstellung einer MIME-Nachricht schreibt und feststellt, dass die Nachricht ein preamble-Attribut hat, schreibt er diesen Text in den Bereich zwischen den Headern und dem ersten Boundary. Einzelheiten finden Sie inemail.parserundemail.generator.Beachten Sie, dass das Attribut preamble
Noneist, wenn das Nachrichtenobjekt keine Präambel hat.
- epilogue¶
Das Attribut epilogue verhält sich genauso wie das Attribut preamble, nur dass es Text enthält, der zwischen dem letzten Boundary und dem Ende der Nachricht steht.
Sie müssen den Epilog nicht auf die leere Zeichenkette setzen, damit der
Generatoram Ende der Datei einen Zeilenumbruch schreibt.
- defects¶
Das Attribut defects enthält eine Liste aller Probleme, die beim Parsen dieser Nachricht gefunden wurden. Eine detaillierte Beschreibung der möglichen Parsing-Fehler finden Sie in
email.errors.