mailbox — Manipulera brevlådor i olika format

Källkod: Lib/mailbox.py


Den här modulen definierar två klasser, Mailbox och Message, för åtkomst till och manipulering av postlådor på disk och de meddelanden de innehåller. Mailbox erbjuder en ordboksliknande mappning från nycklar till meddelanden. Message utökar email.message-modulens Message-klass med formatspecifikt tillstånd och beteende. Brevlådeformat som stöds är Maildir, mbox, MH, Babyl och MMDF.

Se även

Modul email

Representera och manipulera meddelanden.

Mailbox-objekt

class mailbox.Mailbox

En brevlåda som kan inspekteras och modifieras.

Klassen Mailbox definierar ett gränssnitt och är inte avsedd att instansieras. Istället bör formatspecifika subklasser ärva från Mailbox och din kod bör instansiera en viss subklass.

Gränssnittet Mailbox är ordboksliknande, med små nycklar som motsvarar meddelanden. Nycklar utfärdas av den Mailbox-instans som de skall användas med och är endast meningsfulla för den Mailbox-instansen. En nyckel fortsätter att identifiera ett meddelande även om det motsvarande meddelandet ändras, t.ex. genom att det ersätts med ett annat meddelande.

Meddelanden kan läggas till i en instans av Mailbox med den set-liknande metoden add() och tas bort med del-satsen eller de set-liknande metoderna remove() och discard().

Mailbox gränssnittssemantik skiljer sig från ordbokssemantik på några anmärkningsvärda sätt. Varje gång ett meddelande begärs genereras en ny representation (vanligtvis en Message-instans) baserat på brevlådans aktuella tillstånd. På samma sätt kopieras innehållet i den tillhandahållna meddelanderepresentationen när ett meddelande läggs till i en Mailbox-instans. Inte i något fall behålls en referens till meddelanderepresentationen av Mailbox-instansen.

Standard Mailbox iterator itererar över meddelanderepresentationer, inte nycklar som standard dictionary iterator gör. Dessutom är modifiering av en brevlåda under iteration säker och väldefinierad. Meddelanden som läggs till i brevlådan efter att en iterator har skapats kommer inte att ses av iteratorn. Meddelanden som tas bort från brevlådan innan iteratorn ger dem kommer att tyst hoppas över, men att använda en nyckel från en iterator kan resultera i ett KeyError undantag om motsvarande meddelande därefter tas bort.

Varning

Var mycket försiktig när du ändrar brevlådor som samtidigt kan ändras av någon annan process. Det säkraste brevlådeformatet att använda för sådana uppgifter är Maildir; försök att undvika att använda format med en enda fil som mbox för samtidig skrivning. Om du ändrar en brevlåda måste du låsa den genom att anropa metoderna lock() och unlock() innan du läser några meddelanden i filen eller gör några ändringar genom att lägga till eller ta bort ett meddelande. Om du inte låser brevlådan riskerar du att förlora meddelanden eller att hela brevlådan skadas.

Mailbox-instanser har följande metoder:

add(message)

Lägg till message i brevlådan och returnera den nyckel som har tilldelats den.

Parametern message kan vara en instans av Message, en instans av email.message.Message, en sträng, en byte-sträng eller ett filliknande objekt (som bör öppnas i binärt läge). Om message är en instans av den lämpliga formatspecifika Message-underklassen (t.ex. om det är en mboxMessage-instans och detta är en mbox-instans) används dess formatspecifika information. Annars används rimliga standardvärden för formatspecifik information.

Ändrad i version 3.2: Stöd för binär inmatning har lagts till.

remove(key)
__delitem__(key)
discard(key)

Ta bort meddelandet som motsvarar key från brevlådan.

Om inget sådant meddelande finns, uppstår ett KeyError undantag om metoden kallades som remove() eller __delitem__() men inget undantag uppstår om metoden kallades som discard(). Beteendet för discard() kan vara att föredra om det underliggande brevlådeformatet stöder samtidig modifiering av andra processer.

__setitem__(key, message)

Ersätt meddelandet som motsvarar key med message. Utlös ett KeyError-undantag om inget meddelande redan motsvarar key.

Precis som med add() kan parametern message vara en instans av Message, en instans av email.message.Message, en sträng, en byte-sträng eller ett filliknande objekt (som bör öppnas i binärt läge). Om message är en instans av den lämpliga formatspecifika Message-underklassen (t.ex. om det är en mboxMessage-instans och detta är en mbox-instans), används dess formatspecifika information. Annars lämnas den formatspecifika informationen för det meddelande som för närvarande motsvarar key oförändrad.

iterkeys()

Returnerar en iterator över alla nycklar

keys()

Samma sak som iterkeys(), förutom att en list returneras istället för en iterator

itervalues()
__iter__()

Returnerar en iterator över representationer av alla meddelanden. Meddelandena representeras som instanser av den lämpliga formatspecifika Message-underklassen om inte en anpassad meddelandefabrik specificerades när Mailbox-instansen initialiserades.

Anteckning

Beteendet hos __iter__() skiljer sig från det hos lexikon, som itererar över nycklar.

values()

Samma som itervalues(), förutom att en list returneras istället för en iterator

iteritems()

Returnerar en iterator över (key, message) par, där key är en nyckel och message är en meddelanderepresentation. Meddelandena representeras som instanser av den lämpliga formatspecifika Message-underklassen om inte en anpassad meddelandefabrik angavs när Mailbox-instansen initialiserades.

items()

Samma sak som iteritems(), förutom att en list av par returneras istället för en iterator av par.

get(key, default=None)
__getitem__(key)

Returnerar en representation av det meddelande som motsvarar key. Om inget sådant meddelande finns returneras default om metoden anropades som get() och ett KeyError-undantag görs om metoden anropades som __getitem__(). Meddelandet representeras som en instans av den lämpliga formatspecifika Message-underklassen om inte en anpassad meddelandefabrik specificerades när Mailbox-instansen initialiserades.

get_message(key)

Returnerar en representation av meddelandet som motsvarar key som en instans av den lämpliga formatspecifika Message-underklassen, eller ger upphov till ett KeyError-undantag om inget sådant meddelande finns.

get_bytes(key)

Returnerar en byte-representation av meddelandet som motsvarar key, eller ger upphov till ett KeyError-undantag om inget sådant meddelande finns.

Tillagd i version 3.2.

get_string(key)

Returnerar en strängrepresentation av meddelandet som motsvarar key, eller ger upphov till ett KeyError-undantag om inget sådant meddelande finns. Meddelandet bearbetas genom email.message.Message för att konvertera det till en 7-bitars ren representation.

get_file(key)

Returnerar en filliknande representation av meddelandet som motsvarar nyckel, eller ger upphov till ett KeyError undantag om inget sådant meddelande finns. Det filliknande objektet beter sig som om det vore öppet i binärt läge. Den här filen bör stängas när den inte längre behövs.

Ändrad i version 3.2: File-objektet är verkligen en binary file; tidigare returnerades det felaktigt i textläge. Dessutom stöder nu file-like object-protokollet context manager: du kan använda en with-sats för att automatiskt stänga det.

Anteckning

Till skillnad från andra representationer av meddelanden är fil-liknande-representationer inte nödvändigtvis oberoende av Mailbox-instansen som skapade dem eller av den underliggande brevlådan. Mer specifik dokumentation tillhandahålls av varje underklass.

__contains__(key)

Returnerar True om key motsvarar ett meddelande, False annars.

__len__()

Returnerar en räkning av meddelanden i brevlådan.

clear()

Ta bort alla meddelanden från brevlådan.

pop(key, default=None)

Returnerar en representation av det meddelande som motsvarar key och raderar meddelandet. Om det inte finns något sådant meddelande returneras default. Meddelandet representeras som en instans av den lämpliga formatspecifika Message-underklassen om inte en anpassad meddelandefabrik specificerades när Mailbox-instansen initialiserades.

popitem()

Returnerar ett godtyckligt (key, message)-par, där key är en nyckel och message är en meddelanderepresentation, och tar bort motsvarande meddelande. Om brevlådan är tom, uppstår ett KeyError undantag. Meddelandet representeras som en instans av den lämpliga formatspecifika Message-underklassen om inte en anpassad meddelandefabrik specificerades när Mailbox-instansen initialiserades.

update(arg)

Parametern arg ska vara en mappning av key-till*message* eller en iterabel av paren (key, message). Uppdaterar brevlådan så att, för varje given key och message, det meddelande som motsvarar key sätts till message som om man använt __setitem__(). Precis som med __setitem__() måste varje key redan motsvara ett meddelande i brevlådan, annars kommer ett KeyError undantag att uppstå, så i allmänhet är det fel att arg är en Mailbox instans.

Anteckning

Till skillnad från ordböcker stöds inte nyckelordsargument.

flush()

Skriva alla väntande ändringar till filsystemet. För vissa Mailbox-underklasser skrivs ändringar alltid omedelbart och flush() gör ingenting, men du bör ändå göra det till en vana att anropa den här metoden.

lock()

Skaffa ett exklusivt rådgivande lås på brevlådan så att andra processer vet att de inte får ändra den. Ett ExternalClashError uppstår om låset inte är tillgängligt. De särskilda låsmekanismer som används beror på brevlådeformatet. Du bör alltid låsa brevlådan innan du gör några ändringar i dess innehåll.

unlock()

Släpp låset på brevlådan, om det finns något.

close()

Tömmer brevlådan, låser upp den om det behövs och stänger alla öppna filer. För vissa Mailbox-subklasser gör den här metoden ingenting.

Maildir-objekt

class mailbox.Maildir(dirname, factory=None, create=True)

En underklass till Mailbox för brevlådor i Maildir-format. Parametern factory är ett anropsbart objekt som accepterar en filliknande meddelanderepresentation (som beter sig som om den öppnats i binärt läge) och returnerar en anpassad representation. Om factory är None används MaildirMessage som standardrepresentation för meddelanden. Om create är True skapas brevlådan om den inte redan finns.

Om create är True och sökvägen dirname finns, kommer den att behandlas som en befintlig maildir utan att försöka verifiera dess kataloglayout.

Det är av historiska skäl som dirname benämns på detta sätt i stället för path.

Maildir är ett katalogbaserat brevlådeformat som uppfanns för qmail mail transfer agent och som nu stöds av många andra program. Meddelanden i en Maildir-brevlåda lagras i separata filer inom en gemensam katalogstruktur. Denna design gör att Maildir-brevlådor kan nås och ändras av flera olika program utan att data skadas, så fillåsning är onödigt.

Maildir-brevlådor innehåller tre underkataloger, nämligen: tmp, new och cur. Meddelanden skapas tillfälligt i underkatalogen tmp och flyttas sedan till underkatalogen new för att slutföra leveransen. En mail user agent kan därefter flytta meddelandet till underkatalogen cur och lagra information om meddelandets status i en speciell ”info”-sektion som bifogas filnamnet.

Mappar av den typ som introducerats av Courier mail transfer agent stöds också. Alla underkataloger till huvudbrevlådan betraktas som en mapp om '.' är det första tecknet i namnet. Mappnamn representeras av Maildir utan det inledande tecknet '.'. Varje mapp är i sig en Maildir-brevlåda men bör inte innehålla andra mappar. Istället anges en logisk nestning med hjälp av '.' för att avgränsa nivåer, t.ex. ”Archived.2005.07”.

colon

Maildir-specifikationen kräver att ett kolon (':') används i vissa filnamn för meddelanden. Vissa operativsystem tillåter dock inte detta tecken i filnamn, Om du vill använda ett Maildir-liknande format på ett sådant operativsystem bör du ange ett annat tecken som ska användas istället. Utropstecknet ('!') är ett populärt val. Till exempel:

import mailbox
mailbox.Maildir.colon = '!'

Attributet colon kan också ställas in för varje enskild instans.

Ändrad i version 3.13: Maildir ignorerar nu filer med en inledande punkt.

Maildir-instanser har alla metoder i Mailbox förutom följande:

list_folders()

Returnerar en lista med namnen på alla mappar.

get_folder(folder)

Returnerar en Maildir-instans som representerar mappen vars namn är folder. Ett NoSuchMailboxError-undantag uppstår om mappen inte finns.

add_folder(folder)

Skapa en mapp vars namn är folder och returnera en Maildir-instans som representerar den.

remove_folder(folder)

Raderar mappen vars namn är folder. Om mappen innehåller några meddelanden kommer ett NotEmptyError undantag att uppstå och mappen kommer inte att tas bort.

clean()

Ta bort temporära filer från brevlådan som inte har öppnats under de senaste 36 timmarna. Maildir-specifikationen säger att e-postläsningsprogram bör göra detta ibland.

get_flags(key)

Returnerar som en sträng de flaggor som är inställda på meddelandet som motsvarar nyckel. Detta är samma sak som get_message(key).get_flags() men mycket snabbare, eftersom meddelandefilen inte öppnas. Använd den här metoden när du itererar över nycklarna för att avgöra vilka meddelanden som är intressanta att hämta.

Om du har ett MaildirMessage-objekt ska du använda dess get_flags()-metod i stället, eftersom ändringar som görs med meddelandets set_flags()-, add_flag()- och remove_flag()-metoder inte återspeglas här förrän brevlådans __setitem__()-metod anropas.

Tillagd i version 3.13.

set_flags(key, flags)

På meddelandet som motsvarar key, sätt de flaggor som anges av flags och ta bort alla andra. Att anropa some_mailbox.set_flags(key, flags) liknar

one_message = some_mailbox.get_message(key)
one_message.set_flags(flags)
some_mailbox[key] = one_message

men snabbare, eftersom den inte öppnar meddelandefilen.

Om du har ett MaildirMessage-objekt, använd dess set_flags()-metod istället, eftersom ändringar som görs med denna brevlådemetod inte kommer att vara synliga för meddelandeobjektets metod, get_flags().

Tillagd i version 3.13.

add_flag(key, flag)

På meddelandet som motsvarar nyckel, sätt de flaggor som anges av flag utan att ändra andra flaggor. För att lägga till mer än en flagga åt gången kan flag vara en sträng med mer än ett tecken.

Överväganden för att använda denna metod jämfört med meddelandeobjektets add_flag()-metod liknar dem för set_flags(); se diskussionen där.

Tillagd i version 3.13.

remove_flag(key, flag)

På meddelandet som motsvarar nyckel, ta bort de flaggor som anges av flag utan att ändra andra flaggor. För att ta bort mer än en flagga åt gången kan flag vara en sträng med mer än ett tecken.

Överväganden för att använda denna metod jämfört med meddelandeobjektets remove_flag()-metod liknar dem för set_flags(); se diskussionen där.

Tillagd i version 3.13.

get_info(key)

Returnerar en sträng som innehåller information om meddelandet som motsvarar nyckel. Detta är samma sak som get_message(key).get_info() men mycket snabbare, eftersom meddelandefilen inte öppnas. Använd den här metoden när du itererar över nycklarna för att avgöra vilka meddelanden som är intressanta att hämta.

Om du har ett MaildirMessage-objekt ska du använda dess get_info()-metod i stället, eftersom ändringar som görs med meddelandets set_info()-metod inte återspeglas här förrän brevlådans __setitem__()-metod anropas.

Tillagd i version 3.13.

set_info(key, info)

Ställ in info för meddelandet som motsvarar key till info. Att anropa some_mailbox.set_info(key, flags) liknar

one_message = some_mailbox.get_message(key)
one_message.set_info(info)
some_mailbox[key] = one_message

men snabbare, eftersom den inte öppnar meddelandefilen.

Om du har ett MaildirMessage-objekt, använd dess set_info()-metod istället, eftersom ändringar som görs med den här brevlådemetoden inte kommer att vara synliga för meddelandeobjektets metod, get_info().

Tillagd i version 3.13.

Vissa Mailbox-metoder som implementeras av Maildir förtjänar särskilda kommentarer:

add(message)
__setitem__(key, message)
update(arg)

Varning

Dessa metoder genererar unika filnamn baserade på det aktuella process-ID:t. När flera trådar används kan oupptäckta namnkrockar uppstå och orsaka korruption i brevlådan om inte trådarna samordnas så att dessa metoder inte används för att manipulera samma brevlåda samtidigt.

flush()

Alla ändringar i Maildir-brevlådor tillämpas omedelbart, så den här metoden gör ingenting.

lock()
unlock()

Maildir-brevlådor har inte stöd för (eller kräver) låsning, så dessa metoder gör ingenting.

close()

Maildir-instanser har inga öppna filer och de underliggande brevlådorna har inte stöd för låsning, så den här metoden gör ingenting.

get_file(key)

Beroende på värdplattformen kanske det inte är möjligt att ändra eller ta bort det underliggande meddelandet medan den returnerade filen förblir öppen.

Se även

maildir man page från Courier

En specifikation av formatet. Beskriver ett vanligt tillägg för att stödja mappar.

Använder maildir-format

Anteckningar om Maildir av dess uppfinnare. Innehåller ett uppdaterat schema för namnskapande och detaljer om ”info”-semantik.

mbox-objekt

class mailbox.mbox(path, factory=None, create=True)

En underklass till Mailbox för brevlådor i mbox-format. Parametern factory är ett anropsbart objekt som accepterar en filliknande meddelanderepresentation (som beter sig som om den öppnats i binärt läge) och returnerar en anpassad representation. Om factory är None används mboxMessage som standardrepresentation för meddelanden. Om create är True skapas brevlådan om den inte redan finns.

Formatet mbox är det klassiska formatet för lagring av e-post på Unix-system. Alla meddelanden i en mbox-brevlåda lagras i en enda fil där början på varje meddelande anges med en rad vars fem första tecken är ”From”.

Flera varianter av mbox-formatet finns för att åtgärda upplevda brister i originalet. För kompatibilitetens skull implementerar mbox det ursprungliga formatet, som ibland kallas mboxo. Detta innebär att rubriken Content-Length, om den finns, ignoreras och att alla förekomster av ”From ” i början av en rad i ett meddelande omvandlas till ”>From ” när meddelandet lagras, även om förekomster av ”>From ” inte omvandlas till ”From ” när meddelandet läses.

Vissa Mailbox-metoder som implementeras av mbox förtjänar särskilda kommentarer:

get_bytes(key, from_=False)

Anm: Denna metod har en extra parameter (from_) jämfört med andra klasser. Den första raden i en mbox-filpost är Unix ”From”-raden. Om from_ är False utelämnas den första raden i filen.

get_file(key, from_=False)

Om du använder filen efter att ha anropat flush() eller close()mbox-instansen kan det ge oförutsägbara resultat eller leda till ett undantag.

Anm: Denna metod har en extra parameter (from_) jämfört med andra klasser. Den första raden i en mbox-filpost är Unix ”From”-raden. Om from_ är False utelämnas den första raden i filen.

get_string(key, from_=False)

Anm: Denna metod har en extra parameter (from_) jämfört med andra klasser. Den första raden i en mbox-filpost är Unix ”From”-raden. Om from_ är False utelämnas den första raden i filen.

lock()
unlock()

Tre låsmekanismer används - punktlåsning och, om tillgängligt, systemanropen flock() och lockf().

Se även

mbox man-sida från tin

En specifikation av formatet, med detaljer om låsning.

Konfigurera Netscape Mail på Unix: Varför Content-Length-formatet är dåligt

Ett argument för att använda det ursprungliga mbox-formatet snarare än en variant.

”mbox” är en familj av flera ömsesidigt inkompatibla brevlådeformat

En historia av mbox-variationer.

MH-objekt

class mailbox.MH(path, factory=None, create=True)

En underklass till Mailbox för brevlådor i MH-format. Parametern factory är ett anropsbart objekt som accepterar en filliknande meddelanderepresentation (som beter sig som om den öppnats i binärt läge) och returnerar en anpassad representation. Om factory är None används MHMessage som standardrepresentation för meddelanden. Om create är True skapas brevlådan om den inte redan finns.

MH är ett katalogbaserat brevlådeformat som uppfanns för MH Message Handling System, en användaragent för e-post. Varje meddelande i en MH-brevlåda ligger i sin egen fil. En MH-brevlåda kan innehålla andra MH-brevlådor (kallas mappar) utöver meddelanden. Mappar kan vara nästlade på obestämd tid. MH-brevlådor stöder också sequences, som är namngivna listor som används för att logiskt gruppera meddelanden utan att flytta dem till undermappar. Sekvenser definieras i en fil som heter .mh_sequences i varje mapp.

Klassen MH hanterar MH-brevlådor, men den försöker inte efterlikna alla beteenden hos mh. I synnerhet modifierar den inte och påverkas inte av filerna context eller .mh_profile som används av mh för att lagra dess tillstånd och konfiguration.

MH-instanser har alla metoder i Mailbox förutom följande:

Ändrad i version 3.13: Mappar som inte innehåller en .mh_sequences-fil stöds.

list_folders()

Returnerar en lista med namnen på alla mappar.

get_folder(folder)

Returnerar en MH-instans som representerar mappen vars namn är folder. Ett NoSuchMailboxError-undantag uppstår om mappen inte finns.

add_folder(folder)

Skapa en mapp vars namn är folder och returnera en MH-instans som representerar den.

remove_folder(folder)

Raderar mappen vars namn är folder. Om mappen innehåller några meddelanden kommer ett NotEmptyError undantag att uppstå och mappen kommer inte att tas bort.

get_sequences()

Returnerar en ordbok med sekvensnamn som mappats till nyckellistor. Om det inte finns några sekvenser returneras den tomma ordlistan.

set_sequences(sequences)

Omdefiniera de sekvenser som finns i brevlådan baserat på sequences, en ordbok med namn som mappats till nyckellistor, som returneras av get_sequences().

pack()

Byt namn på meddelanden i brevlådan vid behov för att eliminera luckor i numreringen. Posterna i sekvenslistan uppdateras på motsvarande sätt.

Anteckning

Redan utfärdade nycklar ogiltigförklaras av denna operation och bör inte användas senare.

Vissa Mailbox-metoder som implementeras av MH förtjänar särskilda kommentarer:

remove(key)
__delitem__(key)
discard(key)

Dessa metoder raderar omedelbart meddelandet. MH:s konvention att markera ett meddelande för borttagning genom att lägga till ett kommatecken till dess namn används inte.

lock()
unlock()

Tre låsmekanismer används: punktlåsning och, om tillgängligt, systemanropen flock() och lockf(). För MH-brevlådor innebär låsning av brevlådan att filen .mh_sequences låses och att enskilda meddelandefiler låses, endast under tiden för de operationer som påverkar dem.

get_file(key)

Beroende på värdplattformen kanske det inte är möjligt att ta bort det underliggande meddelandet medan den returnerade filen förblir öppen.

flush()

Alla ändringar i MH-brevlådorna tillämpas omedelbart, så den här metoden gör ingenting.

close()

MH-instanser har inga öppna filer, så den här metoden är likvärdig med unlock().

Se även

nmh - System för meddelandehantering

Startsida för nmh, en uppdaterad version av det ursprungliga mh.

MH & nmh: E-post för användare och programmerare

En GPL-licensierad bok om mh och nmh, med viss information om brevlådeformatet.

Babyl objekt

class mailbox.Babyl(path, factory=None, create=True)

En underklass till Mailbox för brevlådor i Babyl-format. Parametern factory är ett anropbart objekt som accepterar en filliknande meddelanderepresentation (som beter sig som om den öppnats i binärt läge) och returnerar en anpassad representation. Om factory är None används BabylMessage som standardrepresentation för meddelanden. Om create är True skapas brevlådan om den inte redan finns.

Babyl är ett brevlådeformat med en enda fil som används av Rmail, en användaragent för e-post som ingår i Emacs. Början på ett meddelande indikeras av en rad som innehåller de två tecknen Control-Underscore ('\037') och Control-L ('\014'). Slutet på ett meddelande indikeras av början på nästa meddelande eller, i fallet med det sista meddelandet, en rad som innehåller Control-Underscore ('\037').

Meddelanden i en Babyl-brevlåda har två uppsättningar rubriker, originalrubriker och så kallade synliga rubriker. Synliga rubriker är vanligtvis en delmängd av de ursprungliga rubrikerna som har omformaterats eller förkortats för att bli mer attraktiva. Varje meddelande i en Babyl-brevlåda har också en medföljande lista med labels, eller korta strängar som innehåller extra information om meddelandet, och en lista över alla användardefinierade etiketter som finns i brevlådan finns i avsnittet Babyl options.

Babyl-instanser har alla metoder i Mailbox förutom följande:

get_labels()

Returnerar en lista med namnen på alla användardefinierade etiketter som används i brevlådan.

Anteckning

De faktiska meddelandena inspekteras för att avgöra vilka etiketter som finns i brevlådan i stället för att konsultera listan över etiketter i Babyl-alternativavsnittet, men Babyl-avsnittet uppdateras när brevlådan ändras.

Några Mailbox-metoder som implementerats av Babyl förtjänar särskilda kommentarer:

get_file(key)

I Babyls brevlådor lagras inte rubrikerna i ett meddelande i anslutning till meddelandetexten. För att skapa en filliknande representation kopieras rubrikerna och meddelandetexten tillsammans till en io.BytesIO-instans, som har ett API som är identiskt med en fils. Resultatet blir att det filliknande objektet är helt oberoende av den underliggande brevlådan men sparar inte minne jämfört med en strängrepresentation.

lock()
unlock()

Tre låsmekanismer används - punktlåsning och, om tillgängligt, systemanropen flock() och lockf().

Se även

Format för version 5 av Babyl Files

En specifikation av Babyl-formatet.

Läsa e-post med Rmail

Rmail-manualen, med viss information om Babyl-semantik.

MMDF-objekt

class mailbox.MMDF(path, factory=None, create=True)

En underklass till Mailbox för brevlådor i MMDF-format. Parametern factory är ett anropsbart objekt som accepterar en filliknande meddelanderepresentation (som beter sig som om den öppnats i binärt läge) och returnerar en anpassad representation. Om factory är None används MMDFMessage som standardrepresentation för meddelanden. Om create är True skapas brevlådan om den inte redan finns.

MMDF är ett brevlådeformat med en enda fil som uppfanns för Multichannel Memorandum Distribution Facility, en förmedlare av post. Varje meddelande är utformat på samma sätt som ett mbox-meddelande, men har före och efter parenteser med rader som innehåller fyra Control-A-tecken ('\001'). Liksom i mbox-formatet anges början på varje meddelande med en rad vars fem första tecken är ”From ”, men ytterligare förekomster av ”From ” omvandlas inte till ”>From ” vid lagring av meddelanden eftersom de extra meddelandeseparatorraderna förhindrar att sådana förekomster misstas för början på efterföljande meddelanden.

Några Mailbox-metoder som implementerats av MMDF förtjänar särskilda kommentarer:

get_bytes(key, from_=False)

Anm: Denna metod har en extra parameter (from_) jämfört med andra klasser. Den första raden i en mbox-filpost är Unix ”From”-raden. Om from_ är False utelämnas den första raden i filen.

get_file(key, from_=False)

Att använda filen efter anrop av flush() eller close()MMDF-instansen kan ge oförutsägbara resultat eller leda till ett undantag.

Anm: Denna metod har en extra parameter (from_) jämfört med andra klasser. Den första raden i en mbox-filpost är Unix ”From”-raden. Om from_ är False utelämnas den första raden i filen.

lock()
unlock()

Tre låsmekanismer används - punktlåsning och, om tillgängligt, systemanropen flock() och lockf().

Se även

mmdf man-sida från tin

En specifikation av MMDF-formatet från dokumentationen av tin, en nyhetsläsare.

MMDF

En Wikipedia-artikel som beskriver Multichannel Memorandum Distribution Facility.

Message-objekt

class mailbox.Message(message=None)

En underklass till email.message-modulens Message. Subklasser av mailbox.Message lägger till tillstånd och beteende som är specifika för brevlådeformatet.

Om message utelämnas skapas den nya instansen i ett tomt standardtillstånd. Om message är en instans av email.message.Message kopieras dess innehåll; dessutom konverteras all formatspecifik information i den mån det är möjligt om message är en instans av Message. Om message är en sträng, en byte-sträng eller en fil, bör den innehålla ett meddelande som uppfyller kraven i RFC 2822, som läses och analyseras. Filer bör vara öppna i binärt läge, men filer i textläge accepteras för bakåtkompatibilitet.

De formatspecifika tillstånd och beteenden som erbjuds av underklasser varierar, men i allmänhet är det bara de egenskaper som inte är specifika för en viss brevlåda som stöds (även om egenskaperna förmodligen är specifika för ett visst brevlådeformat). Exempelvis behålls inte filoffset för brevlådeformat med en fil och filnamn för katalogbaserade brevlådeformat, eftersom de endast är tillämpliga på den ursprungliga brevlådan. Men uppgifter som t.ex. om ett meddelande har lästs av användaren eller markerats som viktigt sparas, eftersom de gäller själva meddelandet.

Det finns inget krav på att Message-instanser används för att representera meddelanden som hämtas med Mailbox-instanser. I vissa situationer kan den tid och det minne som krävs för att generera Message-representationer vara oacceptabelt. För sådana situationer erbjuder Mailbox-instanser också sträng- och filliknande representationer, och en anpassad meddelandefabrik kan anges när en Mailbox-instans initieras.

MaildirMessage-objekt

class mailbox.MaildirMessage(message=None)

Ett meddelande med Maildir-specifika beteenden. Parametern message har samma betydelse som i konstruktören Message.

Vanligtvis flyttar en mail user agent-applikation alla meddelanden i underkatalogen new till underkatalogen cur efter första gången användaren öppnar och stänger brevlådan, vilket innebär att meddelandena är gamla oavsett om de har lästs eller inte. Varje meddelande i cur har ett ”info”-avsnitt som läggs till i filnamnet för att lagra information om dess status. (Vissa e-postläsare kan också lägga till ett ”info”-avsnitt i meddelanden i new.) ”info”-avsnittet kan ha en av två former: det kan innehålla ”2”, följt av en lista med standardiserade flaggor (t.ex. ”2,FR”) eller ”1”, följt av s.k. experimentell information. Standardflaggor för Maildir-meddelanden är följande:

Flagga

Betydelse

Förklaring

D

Utkast

Under sammansättning

F

Flaggat

Markerad som viktig

P

Godkänd

Vidarebefordrad, återsänd eller studsad

R

Besvarad

Svarade på

S

Sedd

Läst

T

Förkastad

Markerad för senare borttagning

MaildirMessage instanser erbjuder följande metoder:

get_subdir()

Returnerar antingen ”new” (om meddelandet ska lagras i underkatalogen new) eller ”cur” (om meddelandet ska lagras i underkatalogen cur).

Anteckning

Ett meddelande flyttas vanligtvis från new till cur efter att dess brevlåda har öppnats, oavsett om meddelandet har lästs eller inte. Ett meddelande msg har lästs om "S" i msg.get_flags() är True.

set_subdir(subdir)

Ange den underkatalog som meddelandet ska lagras i. Parametern subdir måste vara antingen ”new” eller ”cur”.

get_flags()

Returnerar en sträng som anger vilka flaggor som för närvarande är inställda. Om meddelandet överensstämmer med standard Maildir-formatet är resultatet en sammankoppling i alfabetisk ordning av noll eller en förekomst av var och en av 'D', 'F', 'P', 'R', 'S' och 'T'. Den tomma strängen returneras om inga flaggor är inställda eller om ”info” innehåller experimentell semantik.

set_flags(flags)

Ställ in de flaggor som anges av flags och ta bort alla andra.

add_flag(flag)

Ställ in den eller de flaggor som anges av flag utan att ändra andra flaggor. För att lägga till mer än en flagga åt gången kan flag vara en sträng med mer än ett tecken. Den aktuella ”info” skrivs över oavsett om den innehåller experimentell information eller inte, snarare än flaggor.

remove_flag(flag)

Ta bort den eller de flaggor som anges av flag utan att ändra andra flaggor. För att ta bort mer än en flagga åt gången kan flag vara en sträng med mer än ett tecken. Om ”info” innehåller experimentell information i stället för flaggor, ändras inte aktuell ”info”.

get_date()

Returnerar leveransdatumet för meddelandet som ett flyttal som representerar sekunder sedan epoken.

set_date(date)

Ställ in leveransdatumet för meddelandet till date, ett flyttal som representerar sekunder sedan epoken.

get_info()

Returnerar en sträng som innehåller ”info” för ett meddelande. Detta är användbart för att få tillgång till och ändra ”info” som är experimentell (dvs. inte en lista med flaggor).

set_info(info)

Sätt ”info” till info, som ska vara en sträng.

När en instans av MaildirMessage skapas baserat på en instans av mboxMessage eller MMDFMessage, utelämnas rubrikerna Status och X-Status och följande konverteringar sker:

Utgående tillstånd

mboxMessage eller MMDFMessage tillstånd

underkatalogen ”cur”

O-flagga

F-flagga

F-flagga

R-flagga

A-flagga

S-flagga

R-flagga

T-flagga

D-flagga

När en MaildirMessage-instans skapas baserat på en MHMessage-instans, sker följande konverteringar:

Utgående tillstånd

MHMessage tillstånd

underkatalogen ”cur”

”osedd” sekvens

underkatalog ”cur” och S-flagga

ingen ”osedd” sekvens

F-flagga

”Flaggad” sekvens

R-flagga

”besvarad” sekvens

När en MaildirMessage-instans skapas baserat på en BabylMessage-instans, sker följande konverteringar:

Utgående tillstånd

BabylMessage tillstånd

underkatalogen ”cur”

”osynlig” etikett

underkatalog ”cur” och S-flagga

ingen ”osynlig” etikett

P-flagga

”vidarebefordrad” eller ”återsänd” etikett

R-flagga

”besvarad” etikett

T-flagga

”raderad” etikett

mboxMessage-objekt

class mailbox.mboxMessage(message=None)

Ett meddelande med mbox-specifika beteenden. Parametern message har samma betydelse som i Message-konstruktören.

Meddelanden i en mbox-brevlåda lagras tillsammans i en enda fil. Avsändarens kuvertadress och leveranstiden lagras vanligtvis på en rad som börjar med ”From” och som används för att ange början på ett meddelande, även om det finns stora variationer i det exakta formatet för dessa data mellan olika mbox-implementationer. Flaggor som anger meddelandets status, t.ex. om det har lästs eller om det har markerats som viktigt, lagras vanligtvis i rubrikerna Status och X-Status.

Konventionella flaggor för mbox-meddelanden är följande:

Flagga

Betydelse

Förklaring

R

Läst

Läst

O

Gammal

Tidigare upptäckt av MUA

D

Raderad

Markerad för senare borttagning

F

Flaggat

Markerad som viktig

A

Besvarad

Svarade på

Flaggorna ”R” och ”O” lagras i rubriken Status och flaggorna ”D”, ”F” och ”A” lagras i rubriken X-Status. Flaggorna och rubrikerna visas normalt i den ordning som nämns.

mboxMessage instanser erbjuder följande metoder:

get_from()

Returnerar en sträng som representerar ”From”-raden som markerar början på meddelandet i en mbox-brevlåda. Det inledande ”From ” och det efterföljande nya strecket exkluderas.

set_from(from_, time_=None)

Ange ”From”-raden till from_, som bör anges utan en inledande ”From” eller efterföljande ny rad. För enkelhetens skull kan time_ anges och kommer då att formateras på lämpligt sätt och läggas till from_. Om time_ anges bör det vara en instans av time.struct_time, en tupel som kan skickas till time.strftime(), eller True (för att använda time.gmtime()).

get_flags()

Returnerar en sträng som anger vilka flaggor som för närvarande är inställda. Om meddelandet följer det konventionella formatet är resultatet en sammankoppling i följande ordning av noll eller en förekomst av var och en av 'R', 'O', 'D', 'F' och 'A'.

set_flags(flags)

Ställ in de flaggor som anges av flags och ta bort alla andra. Parametern flags bör vara en sammankoppling i valfri ordning av noll eller flera förekomster av var och en av 'R', 'O', 'D', 'F' och 'A'.

add_flag(flag)

Ställ in den eller de flaggor som anges av flag utan att ändra andra flaggor. För att lägga till mer än en flagga åt gången kan flag vara en sträng med mer än ett tecken.

remove_flag(flag)

Ta bort den eller de flaggor som anges av flag utan att ändra andra flaggor. För att ta bort mer än en flagga åt gången kan flag vara en sträng med mer än ett tecken.

När en mboxMessage-instans skapas baserat på en MaildirMessage-instans, genereras en ”From”-rad baserat på MaildirMessage-instansens leveransdatum, och följande konverteringar sker:

Utgående tillstånd

MaildirMessage-tillstånd

R-flagga

S-flagga

O-flagga

underkatalogen ”cur”

D-flagga

T-flagga

F-flagga

F-flagga

A-flagga

R-flagga

När en mboxMessage-instans skapas baserat på en MHMessage-instans, sker följande konverteringar:

Utgående tillstånd

MHMessage tillstånd

R-flagga och O-flagga

ingen ”osedd” sekvens

O-flagga

”osedd” sekvens

F-flagga

”Flaggad” sekvens

A-flagga

”besvarad” sekvens

När en mboxMessage-instans skapas baserat på en BabylMessage-instans, sker följande konverteringar:

Utgående tillstånd

BabylMessage tillstånd

R-flagga och O-flagga

ingen ”osynlig” etikett

O-flagga

”osynlig” etikett

D-flagga

”raderad” etikett

A-flagga

”besvarad” etikett

När en mboxMessage-instans skapas baserat på en MMDFMessage-instans kopieras ”From”-raden och alla flaggor motsvarar varandra direkt:

Utgående tillstånd

MMDFMessage-tillstånd

R-flagga

R-flagga

O-flagga

O-flagga

D-flagga

D-flagga

F-flagga

F-flagga

A-flagga

A-flagga

MHMessage-objekt

class mailbox.MHMessage(message=None)

Ett meddelande med MH-specifika beteenden. Parametern message har samma betydelse som i Message-konstruktorn.

MH-meddelanden stöder inte märken eller flaggor i traditionell mening, men de stöder sekvenser, som är logiska grupperingar av godtyckliga meddelanden. Vissa postläsningsprogram (dock inte standardprogrammen mh och nmh) använder sekvenser på ungefär samma sätt som flaggor används med andra format, enligt följande:

Sekvens

Förklaring

inte sedd

Inte läst, men tidigare upptäckt av MUA

svarade

Svarade på

flaggad

Markerad som viktig

MHMessage instanser erbjuder följande metoder:

get_sequences()

Returnerar en lista med namnen på sekvenser som innehåller detta meddelande.

set_sequences(sequences)

Ange listan över sekvenser som innehåller detta meddelande.

add_sequence(sequence)

Lägg till sequence i listan över sekvenser som innehåller detta meddelande.

remove_sequence(sequence)

Ta bort sequence från listan över sekvenser som innehåller detta meddelande.

När en MHMessage-instans skapas baserat på en MaildirMessage-instans, sker följande konverteringar:

Utgående tillstånd

MaildirMessage-tillstånd

”osedd” sekvens

ingen S-flagga

”besvarad” sekvens

R-flagga

”Flaggad” sekvens

F-flagga

När en instans av MHMessage skapas baserat på en instans av mboxMessage eller MMDFMessage, utelämnas rubrikerna Status och X-Status och följande konverteringar sker:

Utgående tillstånd

mboxMessage eller MMDFMessage tillstånd

”osedd” sekvens

ingen R-flagga

”besvarad” sekvens

A-flagga

”Flaggad” sekvens

F-flagga

När en MHMessage-instans skapas baserat på en BabylMessage-instans, sker följande konverteringar:

Utgående tillstånd

BabylMessage tillstånd

”osedd” sekvens

”osynlig” etikett

”besvarad” sekvens

”besvarad” etikett

BabylMessage objekt

class mailbox.BabylMessage(message=None)

Ett meddelande med Babyl-specifika beteenden. Parametern message har samma betydelse som i konstruktören Message.

Vissa meddelandeetiketter, som kallas attributes, har enligt konvention särskilda betydelser. Attributen är följande:

Etikett

Förklaring

inte sedd

Inte läst, men tidigare upptäckt av MUA

borttagen

Markerad för senare borttagning

arkiverad

Kopieras till en annan fil eller brevlåda

besvarad

Svarade på

vidarebefordrad

Vidarebefordrad

redigerad

Ändrad av användaren

återsänd

Återsänd

Som standard visar Rmail endast synliga rubriker. Klassen BabylMessage använder dock de ursprungliga rubrikerna eftersom de är mer kompletta. Synliga rubriker kan nås explicit om så önskas.

BabylMessage instanser erbjuder följande metoder:

get_labels()

Returnerar en lista med etiketter på meddelandet.

set_labels(labels)

Ställ in listan över etiketter i meddelandet till labels.

add_label(label)

Lägg till label i listan över etiketter i meddelandet.

remove_label(label)

Ta bort label från listan över etiketter i meddelandet.

get_visible()

Returnerar en Message-instans vars headers är meddelandets synliga headers och vars body är tom.

set_visible(visible)

Ställer in meddelandets synliga rubriker så att de är desamma som rubrikerna i message. Parametern visible ska vara en instans av Message, en instans av email.message.Message, en sträng eller ett filliknande objekt (som ska vara öppet i textläge).

update_visible()

När en BabylMessage-instanss originalheaders ändras, ändras inte de synliga headers automatiskt för att motsvara detta. Denna metod uppdaterar de synliga rubrikerna enligt följande: varje synlig rubrik med en motsvarande originalrubrik sätts till värdet för originalrubriken, varje synlig rubrik utan en motsvarande originalrubrik tas bort, och någon av Date, From, Reply-To, To, CC, och Subject som finns i originalrubrikerna men inte i de synliga rubrikerna läggs till i de synliga rubrikerna.

När en BabylMessage-instans skapas baserat på en MaildirMessage-instans, sker följande konverteringar:

Utgående tillstånd

MaildirMessage-tillstånd

”osynlig” etikett

ingen S-flagga

”raderad” etikett

T-flagga

”besvarad” etikett

R-flagga

”vidarebefordrad” etikett

P-flagga

När en instans av BabylMessage skapas baserat på en instans av mboxMessage eller MMDFMessage, utelämnas rubrikerna Status och X-Status och följande konverteringar sker:

Utgående tillstånd

mboxMessage eller MMDFMessage tillstånd

”osynlig” etikett

ingen R-flagga

”raderad” etikett

D-flagga

”besvarad” etikett

A-flagga

När en BabylMessage-instans skapas baserat på en MHMessage-instans, sker följande konverteringar:

Utgående tillstånd

MHMessage tillstånd

”osynlig” etikett

”osedd” sekvens

”besvarad” etikett

”besvarad” sekvens

MMDFMessage-objekt

class mailbox.MMDFMessage(message=None)

Ett meddelande med MMDF-specifika beteenden. Parametern message har samma betydelse som i Message-konstruktorn.

Precis som för meddelanden i en mbox-brevlåda lagras MMDF-meddelanden med avsändarens adress och leveransdatum på en första rad som börjar med ”From”. På samma sätt lagras flaggor som anger meddelandets status vanligtvis i rubrikerna Status och X-Status.

De konventionella flaggorna för MMDF-meddelanden är identiska med dem för mbox-meddelanden och är följande:

Flagga

Betydelse

Förklaring

R

Läst

Läst

O

Gammal

Tidigare upptäckt av MUA

D

Raderad

Markerad för senare borttagning

F

Flaggat

Markerad som viktig

A

Besvarad

Svarade på

Flaggorna ”R” och ”O” lagras i rubriken Status och flaggorna ”D”, ”F” och ”A” lagras i rubriken X-Status. Flaggorna och rubrikerna visas normalt i den ordning som nämns.

MMDFMessage instanser erbjuder följande metoder, som är identiska med de som erbjuds av mboxMessage:

get_from()

Returnerar en sträng som representerar ”From”-raden som markerar början på meddelandet i en mbox-brevlåda. Det inledande ”From ” och det efterföljande nya strecket exkluderas.

set_from(from_, time_=None)

Ange ”From”-raden till from_, som bör anges utan en inledande ”From” eller efterföljande ny rad. För enkelhetens skull kan time_ anges och kommer då att formateras på lämpligt sätt och läggas till from_. Om time_ anges bör det vara en instans av time.struct_time, en tupel som kan skickas till time.strftime(), eller True (för att använda time.gmtime()).

get_flags()

Returnerar en sträng som anger vilka flaggor som för närvarande är inställda. Om meddelandet följer det konventionella formatet är resultatet en sammankoppling i följande ordning av noll eller en förekomst av var och en av 'R', 'O', 'D', 'F' och 'A'.

set_flags(flags)

Ställ in de flaggor som anges av flags och ta bort alla andra. Parametern flags bör vara en sammankoppling i valfri ordning av noll eller flera förekomster av var och en av 'R', 'O', 'D', 'F' och 'A'.

add_flag(flag)

Ställ in den eller de flaggor som anges av flag utan att ändra andra flaggor. För att lägga till mer än en flagga åt gången kan flag vara en sträng med mer än ett tecken.

remove_flag(flag)

Ta bort den eller de flaggor som anges av flag utan att ändra andra flaggor. För att ta bort mer än en flagga åt gången kan flag vara en sträng med mer än ett tecken.

När en MMDFMessage-instans skapas baserat på en MaildirMessage-instans, genereras en ”From”-rad baserat på MaildirMessage-instansens leveransdatum, och följande konverteringar sker:

Utgående tillstånd

MaildirMessage-tillstånd

R-flagga

S-flagga

O-flagga

underkatalogen ”cur”

D-flagga

T-flagga

F-flagga

F-flagga

A-flagga

R-flagga

När en MMDFMessage-instans skapas baserat på en MHMessage-instans, sker följande konverteringar:

Utgående tillstånd

MHMessage tillstånd

R-flagga och O-flagga

ingen ”osedd” sekvens

O-flagga

”osedd” sekvens

F-flagga

”Flaggad” sekvens

A-flagga

”besvarad” sekvens

När en MMDFMessage-instans skapas baserat på en BabylMessage-instans, sker följande konverteringar:

Utgående tillstånd

BabylMessage tillstånd

R-flagga och O-flagga

ingen ”osynlig” etikett

O-flagga

”osynlig” etikett

D-flagga

”raderad” etikett

A-flagga

”besvarad” etikett

När en MMDFMessage-instans skapas baserat på en mboxMessage-instans kopieras ”From”-raden och alla flaggor motsvarar varandra direkt:

Utgående tillstånd

mboxMessage tillstånd

R-flagga

R-flagga

O-flagga

O-flagga

D-flagga

D-flagga

F-flagga

F-flagga

A-flagga

A-flagga

Undantag

Följande undantagsklasser är definierade i modulen mailbox:

exception mailbox.Error

Den baserade klassen för alla andra modulspecifika undantag.

exception mailbox.NoSuchMailboxError

Utlöses när en brevlåda förväntas men inte hittas, t.ex. när en Mailbox-underklass instansieras med en sökväg som inte finns (och med parametern create inställd på False), eller när en mapp som inte finns öppnas.

exception mailbox.NotEmptyError

Uppstår när en brevlåda inte är tom men förväntas vara det, t.ex. när en mapp som innehåller meddelanden raderas.

exception mailbox.ExternalClashError

Utlöses när något brevlåde-relaterat villkor utanför programmets kontroll gör att det inte kan fortsätta, t.ex. när det inte lyckas förvärva ett lås som ett annat program redan har ett lås för, eller när ett unikt genererat filnamn redan finns.

exception mailbox.FormatError

Utlöses när data i en fil inte kan tolkas, t.ex. när en instans av MH försöker läsa en skadad fil av .mh_sequences.

Exempel

Ett enkelt exempel på att skriva ut ämnena för alla meddelanden i en brevlåda som verkar intressanta:

import mailbox
for message in mailbox.mbox('~/mbox'):
    subject = message['subject']       # Could possibly be None.
    if subject and 'python' in subject.lower():
        print(subject)

Så här kopierar du all post från en Babyl-brevlåda till en MH-brevlåda och konverterar all formatspecifik information som kan konverteras:

import mailbox
destination = mailbox.MH('~/Mail')
destination.lock()
for message in mailbox.Babyl('~/RMAIL'):
    destination.add(mailbox.MHMessage(message))
destination.flush()
destination.unlock()

I det här exemplet sorteras e-post från flera e-postlistor i olika brevlådor, varvid man är noga med att undvika att e-post förvanskas på grund av samtidig ändring av andra program, att e-post går förlorad på grund av att programmet avbryts eller att programmet avslutas i förtid på grund av felaktiga meddelanden i brevlådan:

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