email.message.Message: Representerar ett e-postmeddelande med hjälp av compat32 API

Klassen Message är mycket lik klassen EmailMessage, utan de metoder som lagts till av den klassen, och med standardbeteendet för vissa andra metoder som är något annorlunda. Vi dokumenterar också här några metoder som, även om de stöds av klassen EmailMessage, inte rekommenderas om du inte har att göra med äldre kod.

Filosofin och strukturen för de två klasserna är i övrigt densamma.

Detta dokument beskriver beteendet under standardpolicyn (för Message) Compat32. Om du tänker använda en annan policy bör du använda klassen EmailMessage istället.

Ett e-postmeddelande består av headers och en payload. Headers måste vara namn och värden i stil med RFC 5322, där fältnamnet och värdet separeras med ett kolon. Kolonet är inte en del av vare sig fältnamnet eller fältvärdet. Nyttolasten kan vara ett enkelt textmeddelande, ett binärt objekt eller en strukturerad sekvens av undermeddelanden, vart och ett med sin egen uppsättning rubriker och sin egen nyttolast. Den senare typen av nyttolast indikeras av att meddelandet har en MIME-typ som multipart/* eller message/rfc822.

Den konceptuella modell som tillhandahålls av ett Message-objekt är en ordnad ordbok med rubriker med ytterligare metoder för åtkomst till både specialiserad information från rubrikerna, för åtkomst till nyttolasten, för generering av en serialiserad version av meddelandet och för rekursiv vandring över objektträdet. Observera att duplicerade headers stöds men att särskilda metoder måste användas för att komma åt dem.

Pseudoordboken Message indexeras av rubriknamnen, som måste vara ASCII-värden. Värdena i ordlistan är strängar som endast ska innehålla ASCII-tecken; det finns viss specialhantering för icke-ASCII-data, men den ger inte alltid rätt resultat. Rubrikerna lagras och returneras med bibehållen skiftlägespresentation, men fältnamnen matchas utan hänsyn till skiftlägespresentation. Det kan också finnas ett enda kuverthuvud, även känt som Unix-From-huvudet eller From_-huvudet. payload är antingen en sträng eller bytes, när det gäller enkla meddelandeobjekt, eller en lista med Message-objekt, för MIME-containerdokument (t.ex. multipart/* och message/rfc822).

Här är metoderna i klassen Message:

class email.message.Message(policy=compat32)

Om policy anges (den måste vara en instans av en policy-klass) används de regler som anges för att uppdatera och serialisera representationen av meddelandet. Om policy inte anges används compat32-policyn, som upprätthåller bakåtkompatibilitet med Python 3.2-versionen av e-postpaketet. För mer information se policy-dokumentationen.

Ändrad i version 3.3: Nyckelordsargumentet policy har lagts till.

as_string(unixfrom=False, maxheaderlen=0, policy=None)

Returnerar hela meddelandet plattat som en sträng. När det valfria unixfrom är true inkluderas kuvertrubriken i den returnerade strängen. unixfrom har False som standard. Av bakåtkompatibilitetsskäl är maxheaderlen standardvärdet 0, så om du vill ha ett annat värde måste du uttryckligen åsidosätta det (det värde som anges för max_line_length i policyn ignoreras av den här metoden). Argumentet policy kan användas för att åsidosätta den standardpolicy som hämtas från meddelandeinstansen. Detta kan användas för att kontrollera en del av formateringen som produceras av metoden, eftersom den angivna policyn kommer att skickas till Generator.

Att göra meddelandet plattare kan leda till ändringar i Message om standardvärden måste fyllas i för att slutföra omvandlingen till en sträng (till exempel kan MIME-gränser genereras eller ändras).

Observera att den här metoden är en bekvämlighetsåtgärd och att den kanske inte alltid formaterar meddelandet på det sätt du vill. Som standard görs t.ex. inte den mangling av rader som börjar med From som krävs av Unix mbox-format. För mer flexibilitet kan du instansiera en Generator-instans och använda dess flatten()-metod direkt. Till exempel:

from io import StringIO
from email.generator import Generator
fp = StringIO()
g = Generator(fp, mangle_from_=True, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()

Om meddelandeobjektet innehåller binära data som inte är kodade enligt RFC-standarder, kommer de data som inte uppfyller kraven att ersättas av kodpunkter för ”okända tecken” i Unicode. (Se även as_bytes() och BytesGenerator.)

Ändrad i version 3.4: nyckelordsargumentet policy har lagts till.

__str__()

Motsvarar as_string(). Tillåter str(msg) att producera en sträng som innehåller det formaterade meddelandet.

as_bytes(unixfrom=False, policy=None)

Returnerar hela meddelandet plattat som ett bytesobjekt. När det valfria unixfrom är true inkluderas kuvertrubriken i den returnerade strängen. unixfrom är som standard False. Argumentet policy kan användas för att åsidosätta den standardpolicy som hämtas från meddelandeinstansen. Detta kan användas för att styra en del av formateringen som produceras av metoden, eftersom den angivna policyn kommer att skickas till BytesGenerator.

Att göra meddelandet plattare kan leda till ändringar i Message om standardvärden måste fyllas i för att slutföra omvandlingen till en sträng (till exempel kan MIME-gränser genereras eller ändras).

Observera att den här metoden är en bekvämlighetsåtgärd och att den kanske inte alltid formaterar meddelandet på det sätt du vill. Som standard görs t.ex. inte den mangling av rader som börjar med From som krävs av Unix mbox-format. För mer flexibilitet kan du instansiera en BytesGenerator-instans och använda dess flatten()-metod direkt. Till exempel:

from io import BytesIO
from email.generator import BytesGenerator
fp = BytesIO()
g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()

Tillagd i version 3.4.

__bytes__()

Motsvarar as_bytes(). Tillåter bytes(msg) att producera ett bytesobjekt som innehåller det formaterade meddelandet.

Tillagd i version 3.4.

is_multipart()

Returnerar True om meddelandets nyttolast är en lista med sub-objekt av Message, annars returneras False. När is_multipart() returnerar False, bör nyttolasten vara ett strängobjekt (som kan vara en CTE-kodad binär nyttolast). (Observera att om is_multipart() returnerar True betyder det inte nödvändigtvis att ”msg.get_content_maintype() == ’multipart’” kommer att returnera True. Till exempel kommer is_multipart att returnera True när Message är av typen message/rfc822)

set_unixfrom(unixfrom)

Ställ in meddelandets kuverthuvud på unixfrom, som ska vara en sträng.

get_unixfrom()

Returnerar meddelandets kuverthuvud. Standardvärdet är None om kuverthuvudet aldrig har angetts.

attach(payload)

Lägger till den angivna payload till den aktuella payloaden, som måste vara None eller en lista med Message-objekt före anropet. Efter anropet kommer nyttolasten alltid att vara en lista med Message-objekt. Om du vill ställa in nyttolasten till ett skalärt objekt (t.ex. en sträng), använd set_payload() istället.

Detta är en äldre metod. I klassen EmailMessage ersätts dess funktionalitet av set_content() och de relaterade metoderna make och add.

get_payload(i=None, decode=False)

Returnerar den aktuella nyttolasten, som kommer att vara en lista av Message-objekt när is_multipart() är True, eller en sträng när is_multipart() är False. Om nyttolasten är en lista och du muterar listobjektet, ändrar du meddelandets nyttolast på plats.

Med det valfria argumentet i returnerar get_payload() det i-tredje elementet i payloaden, räknat från noll, om is_multipart() är True. Ett IndexError kommer att uppstå om i är mindre än 0 eller större än eller lika med antalet element i payloaden. Om nyttolasten är en sträng (d.v.s. is_multipart() är False) och i anges, kommer ett TypeError att uppstå.

Valfritt decode är en flagga som anger om nyttolasten skall avkodas eller inte, enligt Content-Transfer-Encoding-rubriken. När True och meddelandet inte är en multipart, kommer nyttolasten att avkodas om värdet på denna header är quoted-printable eller base64. Om någon annan kodning används, eller om Content-Transfer-Encoding-headern saknas, returneras nyttolasten som den är (odekodad). I samtliga fall är det returnerade värdet binära data. Om meddelandet är ett multipart och flaggan decode är True, returneras None. Om nyttolasten är base64 och den inte var perfekt formad (saknar utfyllnad, tecken utanför base64-alfabetet), kommer en lämplig defekt att läggas till meddelandets defektegenskap (InvalidBase64PaddingDefect eller InvalidBase64CharactersDefect, respektive).

När decode är False (standard) returneras meddelandet som en sträng utan avkodning av Content-Transfer-Encoding. För en Content-Transfer-Encoding på 8bit görs dock ett försök att avkoda de ursprungliga bytena med hjälp av det charset som anges i Content-Type-huvudet, med hjälp av felhanteraren replace. Om ingen charset anges, eller om den charset som anges inte känns igen av e-postpaketet, avkodas texten med standard ASCII-charset.

Detta är en äldre metod. I klassen EmailMessage ersätts dess funktionalitet av get_content() och iter_parts().

set_payload(payload, charset=None)

Ställ in hela meddelandeobjektets payload till payload. Det är klientens ansvar att se till att nyttolasten är invariant. Valfri charset anger meddelandets standardteckensats; se set_charset() för detaljer.

Detta är en äldre metod. I klassen EmailMessage ersätts dess funktionalitet av set_content().

set_charset(charset)

Ställer in teckenuppsättningen för nyttolasten till charset, som antingen kan vara en Charset-instans (se email.charset), en sträng som namnger en teckenuppsättning eller None. Om det är en sträng kommer den att konverteras till en Charset-instans. Om charset är None kommer parametern charset att tas bort från Content-Type-rubriken (meddelandet kommer inte att ändras på något annat sätt). Allt annat kommer att generera ett TypeError.

Om det inte finns någon befintlig MIME-Version header kommer en sådan att läggas till. Om det inte finns någon befintlig Content-Type header, kommer en sådan att läggas till med värdet text/plain. Oavsett om rubriken Content-Type redan finns eller inte, kommer dess parameter charset att sättas till charset.output_charset. Om charset.input_charset och charset.output_charset skiljer sig åt kommer nyttolasten att kodas om till output_charset. Om det inte finns något befintligt Content-Transfer-Encoding-huvud, kommer nyttolasten att överföringskodas, om det behövs, med hjälp av den angivna Charset, och ett huvud med lämpligt värde kommer att läggas till. Om en Content-Transfer-Encoding header redan finns, antas nyttolasten redan vara korrekt kodad med hjälp av den Content-Transfer-Encoding och ändras inte.

Detta är en äldre metod. I klassen EmailMessage ersätts dess funktionalitet av parametern charset i metoden email.message.EmailMessage.set_content().

get_charset()

Returnerar Charset-instansen som är associerad med meddelandets nyttolast.

Detta är en äldre metod. I klassen EmailMessage returnerar den alltid None.

Följande metoder implementerar ett mappningsliknande gränssnitt för åtkomst till meddelandets RFC 2822-rubriker. Observera att det finns vissa semantiska skillnader mellan dessa metoder och ett normalt mappningsgränssnitt (dvs. ett dictionary-gränssnitt). I en dictionary finns det t.ex. inga duplicerade nycklar, men här kan det finnas duplicerade meddelandehuvuden. I ordböcker finns det inte heller någon garanterad ordning på de nycklar som returneras av keys(), men i ett Message-objekt returneras alltid rubrikerna i den ordning de förekom i det ursprungliga meddelandet eller lades till i meddelandet senare. Eventuella rubriker som raderats och sedan lagts till igen läggs alltid till i slutet av rubriklistan.

Dessa semantiska skillnader är avsiktliga och syftar till maximal bekvämlighet.

Observera att i samtliga fall ingår inte eventuella kuvertrubriker som finns i meddelandet i mappningsgränssnittet.

I en modell som genereras från byte kommer alla rubrikvärden som (i strid med RFC) innehåller icke-ASCII-byte, när de hämtas via detta gränssnitt, att representeras som Header-objekt med en teckenuppsättning på unknown-8bit.

__len__()

Returnerar det totala antalet headers, inklusive dubbletter.

__contains__(name)

Returnerar True om meddelandeobjektet har ett fält med namnet name. Matchning sker utan hänsyn till skiftlägesskillnader och namn bör inte innehålla kolon. Används för operatorn in, t.ex.:

if 'message-id' in myMessage:
   print('Message-ID:', myMessage['message-id'])
__getitem__(name)

Returnerar värdet för det namngivna rubrikfältet. name bör inte innehålla fältavgränsaren kolon. Om rubriken saknas returneras None; ett KeyError uppstår aldrig.

Observera att om det namngivna fältet förekommer mer än en gång i meddelandets rubriker är det odefinierat exakt vilket av dessa fältvärden som kommer att returneras. Använd metoden get_all() för att få värdena för alla befintliga namngivna rubriker.

__setitem__(name, val)

Lägg till en rubrik i meddelandet med fältnamnet name och värdet val. Fältet läggs till i slutet av meddelandets befintliga fält.

Observera att detta inte skriver över eller raderar någon befintlig header med samma namn. Om du vill vara säker på att det nya sidhuvudet är det enda som finns i meddelandet med fältnamnet namn, raderar du fältet först, t.ex.:

del msg['subject']
msg['subject'] = 'Python roolz!'
__delitem__(name)

Ta bort alla förekomster av fältet med namnet namn från meddelandets rubriker. Inget undantag görs om det namngivna fältet inte finns med i sidhuvudet.

keys()

Returnerar en lista med alla namn på fält i meddelandets header.

values()

Returnerar en lista med alla fältvärden i meddelandet.

items()

Returnerar en lista med 2-tuples som innehåller alla meddelandets fältrubriker och värden.

get(name, failobj=None)

Returnerar värdet för det namngivna rubrikfältet. Detta är identiskt med __getitem__() förutom att den valfria failobj returneras om det angivna sidhuvudet saknas (standard är None).

Här är några ytterligare användbara metoder:

get_all(name, failobj=None)

Returnerar en lista med alla värden för fältet med namnet name. Om det inte finns några sådana namngivna rubriker i meddelandet returneras failobj (standardvärde är None).

add_header(_name, _value, **_params)

Utökad inställning av sidhuvud. Den här metoden liknar __setitem__() förutom att ytterligare rubrikparametrar kan anges som nyckelordsargument. _name är rubrikfältet som ska läggas till och _value är det primära värdet för rubriken.

För varje objekt i nyckelordets argumentordbok _params tas nyckeln som parameternamn, med understrykningar konverterade till bindestreck (eftersom bindestreck är olagliga i Python-identifierare). Normalt kommer parametern att läggas till som key="value" om inte värdet är None, i vilket fall endast nyckeln kommer att läggas till. Om värdet innehåller icke-ASCII-tecken kan det specificeras som en tupel med tre tecken i formatet (CHARSET, LANGUAGE, VALUE), där CHARSET är en sträng som namnger det teckenuppsättning som skall användas för att koda värdet, LANGUAGE kan vanligtvis sättas till None eller tomsträngen (se RFC 2231 för andra möjligheter), och VALUE är strängvärdet som innehåller icke-ASCII-kodpunkter. Om en tupel med tre inte skickas och värdet innehåller icke-ASCII-tecken, kodas det automatiskt i RFC 2231-format med CHARSET utf-8 och LANGUAGE None.

Här är ett exempel:

msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')

Detta kommer att lägga till en rubrik som ser ut som

Content-Disposition: attachment; filename="bud.gif"

Ett exempel med icke-ASCII-tecken:

msg.add_header('Content-Disposition', 'attachment',
               filename=('iso-8859-1', '', 'Fußballer.ppt'))

Som producerar

Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"
replace_header(_name, _value)

Ersätt ett huvud. Ersätt den första headern som hittas i meddelandet som matchar _namn, med bibehållen headerordning och skiftlägesordning för fältnamn. Om inget matchande huvud hittades, uppstår ett KeyError.

get_content_type()

Returnerar meddelandets innehållstyp. Den returnerade strängen är tvingad till gemener av formen maintype/subtype. Om det inte fanns någon Content-Type header i meddelandet returneras standardtypen som anges av get_default_type(). Eftersom meddelanden enligt RFC 2045 alltid har en standardtyp, kommer get_content_type() alltid att returnera ett värde.

Enligt RFC 2045 är standardtypen för ett meddelande text/plain, såvida det inte finns i en multipart/digest-behållare, i vilket fall det skulle vara message/rfc822. Om rubriken Content-Type har en ogiltig typspecifikation, föreskriver RFC 2045 att standardtypen skall vara text/plain.

get_content_maintype()

Returnerar meddelandets huvudsakliga innehållstyp. Detta är maintype-delen av strängen som returneras av get_content_type().

get_content_subtype()

Returnerar meddelandets typ av underinnehåll. Detta är subtype-delen av strängen som returneras av get_content_type().

get_default_type()

Returnerar den förvalda innehållstypen. De flesta meddelanden har standardinnehållstypen text/plain, utom meddelanden som är underdelar av behållare av typen multipart/digest. Sådana underdelar har en standardinnehållstyp av typen message/rfc822.

set_default_type(ctype)

Ställer in standardinnehållstypen. ctype bör antingen vara text/plain eller message/rfc822, även om detta inte är obligatoriskt. Standardinnehållstypen lagras inte i rubriken Content-Type.

get_params(failobj=None, header='content-type', unquote=True)

Returnera meddelandets Content-Type-parametrar som en lista. Elementen i den returnerade listan är 2-tupler av nyckel/värde-par, uppdelade med tecknet '='. Vänster sida av '=' är nyckeln, medan höger sida är värdet. Om det inte finns något '='-tecken i parametern är värdet den tomma strängen, annars är värdet som beskrivs i get_param() och är utan citattecken om det valfria unquote är True (standard).

Valfritt failobj är det objekt som skall returneras om det inte finns något Content-Type-huvud. Valfritt header är rubriken som ska sökas i stället för Content-Type.

Detta är en äldre metod. I klassen EmailMessage ersätts dess funktionalitet av egenskapen params i de enskilda rubrikobjekt som returneras av metoderna för rubrikåtkomst.

get_param(param, failobj=None, header='content-type', unquote=True)

Returnerar värdet av Content-Type-headerns parameter param som en sträng. Om meddelandet inte har någon Content-Type-rubrik eller om det inte finns någon sådan parameter returneras failobj (standardvärde är None).

Valfritt header om det anges, anger meddelandehuvudet som ska användas i stället för Content-Type.

Parameternycklar jämförs alltid utan hänsyn till skift. Returvärdet kan antingen vara en sträng eller en 3-tupel om parametern var RFC 2231-kodad. När det är en 3-tupel är elementen i värdet av formen (CHARSET, LANGUAGE, VALUE). Observera att både CHARSET och LANGUAGE kan vara None, i vilket fall du bör betrakta VALUE som kodat i us-ascii charset. Du kan vanligtvis ignorera LANGUAGE.

Om din applikation inte bryr sig om huruvida parametern kodades enligt RFC 2231, kan du kollapsa parametervärdet genom att anropa email.utils.collapse_rfc2231_value() och skicka in returvärdet från get_param(). Detta kommer att returnera en lämpligt avkodad Unicode-sträng när värdet är en tupel, eller originalsträngen utan citat om den inte är det. Till exempel:

rawparam = msg.get_param('foo')
param = email.utils.collapse_rfc2231_value(rawparam)

I vilket fall som helst är parametervärdet (antingen den returnerade strängen eller VALUE-objektet i 3-tupeln) alltid ociterat, såvida inte unquote är satt till False.

Detta är en äldre metod. I klassen EmailMessage ersätts dess funktionalitet av egenskapen params i de enskilda rubrikobjekt som returneras av metoderna för rubrikåtkomst.

set_param(param, value, header='Content-Type', requote=True, charset=None, language='', replace=False)

Ange en parameter i Content-Type -rubriken. Om parametern redan finns i rubriken kommer dess värde att ersättas med värde. Om rubriken Content-Type ännu inte har definierats för detta meddelande, kommer den att sättas till text/plain och det nya parametervärdet kommer att läggas till enligt RFC 2045.

Det valfria header anger ett alternativt huvud till Content-Type, och alla parametrar kommer att citeras vid behov om inte det valfria requote är False (standard är True).

Om charset anges som tillval kommer parametern att kodas enligt RFC 2231. Det valfria language anger RFC 2231-språket, med den tomma strängen som standard. Både charset och language bör vara strängar.

Om replace är False (standard) flyttas rubriken till slutet av listan med rubriker. Om replace är True kommer rubriken att uppdateras på plats.

Ändrad i version 3.4: nyckelordet replace har lagts till.

del_param(param, header='content-type', requote=True)

Tar bort den angivna parametern helt från Content-Type-huvudet. Rubriken kommer att skrivas om på plats utan parametern eller dess värde. Alla värden kommer att citeras vid behov om inte requote är False (standard är True). Valfria header anger ett alternativ till Content-Type.

set_type(type, header='Content-Type', requote=True)

Anger huvudtyp och undertyp för rubriken Content-Type. type måste vara en sträng i formen maintype/subtype, annars uppstår ett ValueError.

Denna metod ersätter Content-Type-headern och behåller alla parametrar på plats. Om requote är False, lämnas den befintliga headerns citering som den är, annars kommer parametrarna att citeras (standard).

Ett alternativt huvud kan anges i argumentet header. När rubriken Content-Type anges läggs även rubriken MIME-Version till.

Detta är en äldre metod. I klassen EmailMessage ersätts dess funktionalitet av metoderna make_ och add_.

get_filename(failobj=None)

Returnerar värdet på parametern filename i Content-Disposition-rubriken i meddelandet. Om rubriken inte har någon parameter för filename, går denna metod tillbaka till att leta efter parametern name i rubriken Content-Type. Om ingen av dessa hittas, eller om rubriken saknas, returneras failobj. Den returnerade strängen kommer alltid att vara ociterad enligt email.utils.unquote().

get_boundary(failobj=None)

Returnerar värdet på parametern boundary i Content-Type-rubriken i meddelandet, eller failobj om rubriken saknas eller inte har någon parameter för boundary. Den returnerade strängen kommer alltid att vara ociterad enligt email.utils.unquote().

set_boundary(boundary)

Ställ in parametern boundary i rubriken Content-Type till boundary. set_boundary() kommer alltid att citera boundary om det behövs. Ett HeaderParseError uppstår om meddelandeobjektet inte har något Content-Type-huvud.

Observera att den här metoden är något annorlunda än att ta bort den gamla Content-Type-rubriken och lägga till en ny med den nya gränsen via add_header(), eftersom set_boundary() bevarar ordningen på Content-Type-rubriken i listan över rubriker. Den bevarar dock inte några fortsättningsrader som kan ha funnits i den ursprungliga Content-Type-rubriken.

get_content_charset(failobj=None)

Returnerar parametern charset för rubriken Content-Type, omgjord till gemener. Om det inte finns någon Content-Type header, eller om den headern inte har någon charset parameter, returneras failobj.

Observera att den här metoden skiljer sig från get_charset() som returnerar Charset-instansen för standardkodningen av meddelandetexten.

get_charsets(failobj=None)

Returnerar en lista som innehåller teckenuppsättningsnamnen i meddelandet. Om meddelandet är en multipart, kommer listan att innehålla ett element för varje underdel i nyttolasten, annars kommer det att vara en lista med längden 1.

Varje post i listan kommer att vara en sträng som är värdet på parametern charset i Content-Type-huvudet för den representerade underdelen. Men om underdelen inte har något Content-Type-huvud, ingen charset-parameter eller inte är av huvud-MIME-typen text, kommer den posten i den returnerade listan att vara failobj.

get_content_disposition()

Returnerar det gemena värdet (utan parametrar) av meddelandets Content-Disposition-huvud om det har ett sådant, eller None. De möjliga värdena för denna metod är inline, attachment eller None om meddelandet följer RFC 2183.

Tillagd i version 3.5.

walk()

Metoden walk() är en allroundgenerator som kan användas för att iterera över alla delar och underdelar i ett meddelandeobjektträd, i djupförsta traversalordning. Du kommer vanligtvis att använda walk() som iterator i en for-loop; varje iteration returnerar nästa underdel.

Här är ett exempel som skriver ut MIME-typen för varje del i en flerdelad meddelandestruktur:

>>> 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

walk itererar över underdelarna av alla delar där is_multipart`() returnerar True, även om msg.get_content_maintype() == 'multipart' kan returnera False. Vi kan se detta i vårt exempel genom att använda hjälpfunktionen _structure debug:

>>> 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

Här är message delarna inte multiparts, men de innehåller subparts. is_multipart() returnerar True och walk går ner i underdelarna.

Message-objekt kan också innehålla två instansattribut, som kan användas när man genererar klartexten i ett MIME-meddelande.

preamble

Formatet för ett MIME-dokument tillåter viss text mellan blankraden efter rubrikerna och den första multipart boundary-strängen. Normalt är denna text aldrig synlig i en MIME-medveten e-postläsare eftersom den faller utanför MIME-standarden. Men när man tittar på råtexten i meddelandet, eller när man tittar på meddelandet i en läsare som inte är MIME-medveten, kan denna text bli synlig.

Attributet preamble innehåller denna ledande extra pansartext för MIME-dokument. När Parser upptäcker text efter rubrikerna men före den första gränssträngen, tilldelar den denna text till meddelandets preamble-attribut. När Generator skriver ut klartextrepresentationen av ett MIME-meddelande och upptäcker att meddelandet har ett preamble-attribut, skriver den denna text i området mellan rubrikerna och den första gränssträngen. Se email.parser och email.generator för mer information.

Observera att om meddelandeobjektet inte har någon preamble, kommer attributet preamble att vara None.

epilogue

Attributet epilogue fungerar på samma sätt som attributet preamble, förutom att det innehåller text som visas mellan den sista boundary och slutet av meddelandet.

Du behöver inte sätta epilogen till den tomma strängen för att Generator ska skriva ut en ny rad i slutet av filen.

defects

Attributet defects innehåller en lista över alla problem som upptäcktes när meddelandet analyserades. Se email.errors för en detaljerad beskrivning av de möjliga defekterna vid tolkningen.