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ånMailbox
och din kod bör instansiera en viss subklass.Gränssnittet
Mailbox
är ordboksliknande, med små nycklar som motsvarar meddelanden. Nycklar utfärdas av denMailbox
-instans som de skall användas med och är endast meningsfulla för denMailbox
-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 metodenadd()
och tas bort meddel
-satsen eller de set-liknande metodernaremove()
ochdiscard()
.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 enMessage
-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 enMailbox
-instans. Inte i något fall behålls en referens till meddelanderepresentationen avMailbox
-instansen.Standard
Mailbox
iterator itererar över meddelanderepresentationer, inte nycklar som standarddictionary
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 ettKeyError
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 sommbox
för samtidig skrivning. Om du ändrar en brevlåda måste du låsa den genom att anropa metodernalock()
ochunlock()
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 avemail.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 formatspecifikaMessage
-underklassen (t.ex. om det är enmboxMessage
-instans och detta är enmbox
-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 somremove()
eller__delitem__()
men inget undantag uppstår om metoden kallades somdiscard()
. Beteendet fördiscard()
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 avMessage
, en instans avemail.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 formatspecifikaMessage
-underklassen (t.ex. om det är enmboxMessage
-instans och detta är enmbox
-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.
- keys()¶
Samma sak som
iterkeys()
, förutom att enlist
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ärMailbox
-instansen initialiserades.Anteckning
Beteendet hos
__iter__()
skiljer sig från det hos lexikon, som itererar över nycklar.
- values()¶
Samma som
itervalues()
, förutom att enlist
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ärMailbox
-instansen initialiserades.
- items()¶
Samma sak som
iteritems()
, förutom att enlist
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 ettKeyError
-undantag görs om metoden anropades som__getitem__()
. Meddelandet representeras som en instans av den lämpliga formatspecifikaMessage
-underklassen om inte en anpassad meddelandefabrik specificerades närMailbox
-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 ettKeyError
-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 genomemail.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ärMailbox
-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 formatspecifikaMessage
-underklassen om inte en anpassad meddelandefabrik specificerades närMailbox
-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 ettKeyError
undantag att uppstå, så i allmänhet är det fel att arg är enMailbox
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 ochflush()
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 ärNone
användsMaildirMessage
som standardrepresentation för meddelanden. Om create ärTrue
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
ochcur
. Meddelanden skapas tillfälligt i underkatalogentmp
och flyttas sedan till underkatalogennew
för att slutföra leveransen. En mail user agent kan därefter flytta meddelandet till underkatalogencur
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 avMaildir
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 iMailbox
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. EttNoSuchMailboxError
-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 dessget_flags()
-metod i stället, eftersom ändringar som görs med meddelandetsset_flags()
-,add_flag()
- ochremove_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)
liknarone_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 dessset_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örset_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örset_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 dessget_info()
-metod i stället, eftersom ändringar som görs med meddelandetsset_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)
liknarone_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 dessset_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 avMaildir
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 ärNone
användsmboxMessage
som standardrepresentation för meddelanden. Om create ärTrue
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 avmbox
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()
ellerclose()
på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.
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 ärNone
användsMHMessage
som standardrepresentation för meddelanden. Om create ärTrue
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 filernacontext
eller.mh_profile
som används av mh för att lagra dess tillstånd och konfiguration.MH
-instanser har alla metoder iMailbox
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. EttNoSuchMailboxError
-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 avMH
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()
ochlockf()
. 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.
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 ärNone
användsBabylMessage
som standardrepresentation för meddelanden. Om create ärTrue
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 iMailbox
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 avBabyl
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.
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 ärNone
användsMMDFMessage
som standardrepresentation för meddelanden. Om create ärTrue
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 avMMDF
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()
ellerclose()
på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.
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
-modulensMessage
. Subklasser avmailbox.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 avMessage
. 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 medMailbox
-instanser. I vissa situationer kan den tid och det minne som krävs för att genereraMessage
-representationer vara oacceptabelt. För sådana situationer erbjuderMailbox
-instanser också sträng- och filliknande representationer, och en anpassad meddelandefabrik kan anges när enMailbox
-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 underkatalogencur
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 icur
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 inew
.) ”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 underkatalogencur
).Anteckning
Ett meddelande flyttas vanligtvis från
new
tillcur
efter att dess brevlåda har öppnats, oavsett om meddelandet har lästs eller inte. Ett meddelandemsg
har lästs om"S" i msg.get_flags()
ärTrue
.
- 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 |
|
---|---|
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 |
|
---|---|
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 |
|
---|---|
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 tilltime.strftime()
, ellerTrue
(för att användatime.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 |
|
---|---|
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 |
|
---|---|
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 |
|
---|---|
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 |
|
---|---|
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 |
|
---|---|
”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 |
|
---|---|
”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 |
|
---|---|
”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 avemail.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 |
|
---|---|
”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 |
|
---|---|
”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 |
|
---|---|
”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 avmboxMessage
:- 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 tilltime.strftime()
, ellerTrue
(för att användatime.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 |
|
---|---|
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 |
|
---|---|
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 |
|
---|---|
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 |
|
---|---|
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.
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()