email.contentmanager
: Hantering av MIME-innehåll¶
Källkod: Lib/email/contentmanager.py
Tillagd i version 3.6: [1]
- class email.contentmanager.ContentManager¶
Basklass för innehållshanterare. Tillhandahåller standardregistermekanismer för att registrera omvandlare mellan MIME-innehåll och andra representationer, samt leveransmetoderna
get_content
ochset_content
.- get_content(msg, *args, **kw)¶
Leta upp en hanterarfunktion baserad på
mimetype
för msg (se nästa stycke), anropa den, skicka igenom alla argument och returnera resultatet av anropet. Förväntningen är att hanteraren kommer att extrahera nyttolasten från msg och returnera ett objekt som kodar information om de extraherade data.För att hitta hanteraren, leta efter följande nycklar i registret och sluta med den första som hittas:
den sträng som representerar den fullständiga MIME-typen (
maintype/subtype
)den sträng som representerar
maintypen
den tomma strängen
Om ingen av dessa nycklar producerar en hanterare, skapa ett
KeyError
för den fullständiga MIME-typen.
- set_content(msg, obj, *args, **kw)¶
Om
maintypen
ärmultipart
, skapa enTypeError
; annars leta upp en hanterarfunktion baserad på typen av obj (se nästa stycke), anropaclear_content()
på msg, och anropa hanterarfunktionen, genom att skicka igenom alla argument. Förväntningen är att hanteraren ska omvandla och lagra obj till msg och eventuellt göra andra ändringar i msg, t.ex. lägga till olika MIME-rubriker för att koda information som behövs för att tolka de lagrade uppgifterna.För att hitta hanteraren får du fram typen av obj (
typ = type(obj)
) och letar efter följande nycklar i registret, med början med den första som hittas:själva typen (
typ
)typens fullständigt kvalificerade namn (
typ.__module__ + '.' + typ.__qualname__
).typens
qualname
(typ.__qualname__
)typens
name
(typ.__name__
).
Om inget av ovanstående stämmer upprepar du alla kontroller ovan för var och en av typerna i MRO (
typ.__mro__
). Slutligen, om ingen annan nyckel ger en hanterare, kontrollera om det finns en hanterare för nyckelnNone
. Om det inte finns någon hanterare förNone
, skapa ettKeyError
för det fullständigt kvalificerade namnet på typen.Lägg också till en MIME-Version header om en sådan saknas (se även
MIMEPart
).
- add_get_handler(key, handler)¶
Registrera funktionen handler som hanterare för key. För de möjliga värdena för key, se
get_content()
.
- add_set_handler(typekey, handler)¶
Registrera handler som den funktion som ska anropas när ett objekt av en typ som matchar typekey skickas till
set_content()
. För de möjliga värdena för typekey, seset_content()
.
Instanser för innehållshanterare¶
För närvarande tillhandahåller e-postpaketet endast en konkret innehållshanterare, raw_data_manager
, men fler kan läggas till i framtiden. raw_data_manager
är den content_manager
som tillhandahålls av EmailPolicy
och dess derivat.
- email.contentmanager.raw_data_manager¶
Denna innehållshanterare tillhandahåller endast ett minimalt gränssnitt utöver det som tillhandahålls av
Message
själv: den hanterar endast text, råa byte-strängar ochMessage
-objekt. Trots detta ger det betydande fördelar jämfört med bas-API:et:get_content
på en textdel returnerar en unicode-sträng utan att programmet behöver avkoda den manuellt,set_content
ger en rik uppsättning alternativ för att kontrollera de rubriker som läggs till en del och kontrollera innehållets överföringskodning, och det gör det möjligt att använda de olikaadd_
-metoderna, vilket förenklar skapandet av flerpartsmeddelanden.- email.contentmanager.get_content(msg, errors='replace')¶
Returnera delens nyttolast som antingen en sträng (för
text
-delar), ettEmailMessage
-objekt (förmessage/rfc822
-delar) eller ettbytes
-objekt (för alla andra icke-multipart-typer). Generera ettKeyError
om det anropas på enmultipart
. Om delen är entext
-del och errors är angivet, använd det som felhanterare när nyttolasten avkodas till unicode. Standardfelhanteraren ärreplace
.
- email.contentmanager.set_content(msg, <'str'>, subtype="plain", charset='utf-8', cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)¶
- email.contentmanager.set_content(msg, <'bytes'>, maintype, subtype, cte="base64", disposition=None, filename=None, cid=None, params=None, headers=None)
- email.contentmanager.set_content(msg, <'EmailMessage'>, cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)
Lägg till rubriker och nyttolast i msg:
Lägg till ett Content-Type-huvud med värdet
maintype/subtype
.För
str
, sätt MIMEmaintype
tilltext
, och sätt subtypen till subtype om den är specificerad, ellerplain
om den inte är det.För
bytes
, använd den angivna maintype och subtype, eller skapa ettTypeError
om de inte är angivna.För
EmailMessage
-objekt, sätt huvudtypen tillmessage
, och sätt undertypen till subtype om den är specificerad ellerrfc822
om den inte är det. Om subtype ärpartial
, uppstår ett fel (bytes
-objekt måste användas för att konstrueramessage/partial
-delar).
Om charset anges (vilket endast är giltigt för
str
), kodas strängen till bytes med den angivna teckenuppsättningen. Standardvärdet ärutf-8
. Om den angivna charset är ett känt alias för ett MIME-standardcharsetnamn, används standardcharsetet istället.Om cte anges, kodas nyttolasten med den angivna innehållsöverföringskodningen och rubriken Content-Transfer-Encoding anges till det värdet. Möjliga värden för cte är
quoted-printable
,base64
,7bit
,8bit
ochbinary
. Om indata inte kan kodas i den angivna kodningen (t.ex. om du anger en cte på7bit
för indata som innehåller icke-ASCII-värden), uppstår ettValueError
.För
str
-objekt, om cte inte är angivet, används heuristik för att bestämma den mest kompakta kodningen. Före kodningen användsstr.splitlines()
för att normalisera alla radgränser, vilket säkerställer att varje rad i nyttolasten avslutas med den aktuella policynslinesep
-egenskap (även om den ursprungliga strängen inte slutade med en sådan).För
bytes
-objekt antas cte vara base64 om den inte är inställd, och den tidigare nämnda översättningen av nya rader utförs inte.För
EmailMessage
, per RFC 2046, skapa ett fel om en cte avquoted-printable
ellerbase64
begärs för subtyperfc822
, och för någon cte annan än7bit
för subtypeexternal-body
. Förmessage/rfc822
, använd8bit
om cte inte är specificerat. För alla andra värden av subtype, använd7bit
.
Anteckning
En cte av
binary
fungerar faktiskt inte korrekt ännu. ObjektetEmailMessage
som modifieras avset_content
är korrekt, menBytesGenerator
serialiserar det inte korrekt.Om disposition anges används det som värde för rubriken Content-Disposition. Om disposition inte har angetts och filnamn har angetts, läggs rubriken med värdet
attachment
till. Om disposition inte anges och filnamn inte heller anges, läggs inte rubriken till. De enda giltiga värdena för disposition ärattachment
ochinline
.Om filename anges används det som värde för parametern
filename
i rubriken Content-Disposition.Om cid anges, lägg till ett Content-ID-huvud med cid som värde.
Om params anges, itererar du dess
items
-metod och använder de resulterande(nyckel, värde)
-paren för att ange ytterligare parametrar för Content-Type-huvudet.Om headers anges och är en lista med strängar av formen
headername: headervalue
eller en lista medheader
-objekt (som skiljer sig från strängar genom att ha ettname
-attribut), lägg till headers i msg.
Fotnoter