o ½w[eÊ3ã@s>dZddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Z ddl Z ddl mZzddlZWn eyIdZYnwgd¢Zej d¡ZGdd„dƒZGdd „d eƒZGd d „d eƒZGd d „d eƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„dejjƒZGdd„deƒZGdd„deƒZGdd„deƒZ Gdd„deƒZ!Gd d!„d!eƒZ"Gd"d#„d#eƒZ#Gd$d%„d%ƒZ$Gd&d'„d'e$ƒZ%d?d)d*„Z&d+d,„Z'd-d.„Z(d/d0„Z)d1d2„Z*d3d4„Z+Gd5d6„d6e,ƒZ-Gd7d8„d8e-ƒZ.Gd9d:„d:e-ƒZ/Gd;d<„d„d>e-ƒZ1dS)@zDRead/write support for Maildir, mbox, MH, Babyl, and MMDF mailboxes.éN)Ú GenericAlias)ÚMailboxÚMaildirÚmboxÚMHÚBabylÚMMDFÚMessageÚMaildirMessageÚ mboxMessageÚ MHMessageÚ BabylMessageÚ MMDFMessageÚErrorÚNoSuchMailboxErrorÚ NotEmptyErrorÚExternalClashErrorÚ FormatErrorÚasciic@seZdZdZdCdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dDdd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„ZdDd0d1„Zd2d3„ZdDd4d5„Zd6d7„Zd8d9„Zd:d;„Zdd?„Z!d@Z"dEdAdB„Z#e$e%ƒZ&dS)Frz*A group of messages in a particular place.NTcCs tj tj |¡¡|_||_dS)zInitialize a Mailbox instance.N)ÚosÚpathÚabspathÚ expanduserÚ_pathÚ_factory©ÚselfrÚfactoryÚcreate©rú/usr/lib/python3.10/mailbox.pyÚ__init__%s zMailbox.__init__cCótdƒ‚)ú$Add message and return assigned key.ú&Method must be implemented by subclass©ÚNotImplementedError©rÚmessagerrr Úadd*óz Mailbox.addcCr")ú=Remove the keyed message; raise KeyError if it doesn't exist.r$r%©rÚkeyrrr Úremove.r*zMailbox.removecCs| |¡dS©N)r.r,rrr Ú __delitem__2szMailbox.__delitem__cCs&z| |¡WdStyYdSw©z'If the keyed message exists, remove it.N)r.ÚKeyErrorr,rrr Údiscard5s  ÿzMailbox.discardcCr")ú>Replace the keyed message; raise KeyError if it doesn't exist.r$r%©rr-r(rrr Ú __setitem__<r*zMailbox.__setitem__cCs$z| |¡WSty|YSw)z9Return the keyed message, or default if it doesn't exist.)Ú __getitem__r2)rr-Údefaultrrr Úget@s   ÿz Mailbox.getcCsN|js| |¡St | |¡¡ }| |¡WdƒS1s wYdS)z=Return the keyed message; raise KeyError if it doesn't exist.N)rÚ get_messageÚ contextlibÚclosingÚget_file)rr-Úfilerrr r7Gs  $ÿzMailbox.__getitem__cCr")ú4Return a Message representation or raise a KeyError.r$r%r,rrr r:Or*zMailbox.get_messagecCst | |¡¡ ¡S)zœReturn a string representation or raise a KeyError. Uses email.message.Message to create a 7bit clean string representation of the message.©ÚemailÚmessage_from_bytesÚ get_bytesÚ as_stringr,rrr Ú get_stringSszMailbox.get_stringcCr")z8Return a byte string representation or raise a KeyError.r$r%r,rrr rCZr*zMailbox.get_bytescCr")ú6Return a file-like representation or raise a KeyError.r$r%r,rrr r=^r*zMailbox.get_filecCr")úReturn an iterator over keys.r$r%©rrrr Úiterkeysbr*zMailbox.iterkeyscCó t| ¡ƒS)zReturn a list of keys.)ÚlistrIrHrrr Úkeysfó z Mailbox.keysc cs:| ¡D]}z||}Wn tyYqw|VqdS)z%Return an iterator over all messages.N©rIr2©rr-Úvaluerrr Ú itervaluesjs€   ÿûzMailbox.itervaluescCs| ¡Sr/)rQrHrrr Ú__iter__sszMailbox.__iter__cCrJ)z,Return a list of messages. Memory intensive.)rKrQrHrrr ÚvaluesvrMzMailbox.valuesc cs>| ¡D]}z||}Wn tyYqw||fVqdS)z.Return an iterator over (key, message) tuples.NrNrOrrr Ú iteritemszs€   ÿ ûzMailbox.iteritemscCrJ)z9Return a list of (key, message) tuples. Memory intensive.)rKrTrHrrr ÚitemsƒrMz Mailbox.itemscCr")ú9Return True if the keyed message exists, False otherwise.r$r%r,rrr Ú __contains__‡r*zMailbox.__contains__cCr")ú*Return a count of messages in the mailbox.r$r%rHrrr Ú__len__‹r*zMailbox.__len__cCs| ¡D]}| |¡qdS)zDelete all messages.N)rLr3r,rrr Úclears  ÿz Mailbox.clearcCs2z||}Wn ty|YSw| |¡|S)z3Delete the keyed message and return it, or default.)r2r3)rr-r8Úresultrrr Úpop”s  ÿ z Mailbox.popcCs&| ¡D] }|| |¡fStdƒ‚)z6Delete an arbitrary (key, message) pair and return it.zNo messages in mailbox)rIr\r2r,rrr Úpopitems zMailbox.popitemc Cspt|dƒr | ¡}n t|dƒr| ¡}n|}d}|D]\}}z|||<Wqty/d}Yqw|r6tdƒ‚dS)z4Change the messages that correspond to certain keys.rTrUFTzNo message with key(s)N)ÚhasattrrTrUr2)rÚargÚsourceÚbad_keyr-r(rrr Úupdate¤s       ÿÿzMailbox.updatecCr")ú&Write any pending changes to the disk.r$r%rHrrr Úflushµr*z Mailbox.flushcCr")úLock the mailbox.r$r%rHrrr Úlock¹r*z Mailbox.lockcCr")ú#Unlock the mailbox if it is locked.r$r%rHrrr Úunlock½r*zMailbox.unlockcCr")úFlush and close the mailbox.r$r%rHrrr ÚcloseÁr*z Mailbox.closecCs$z| d¡WStytdƒ‚w)Nrz?String input must be ASCII-only; use bytes or a Message instead)ÚencodeÚ UnicodeErrorÚ ValueErrorr'rrr Ú_string_to_bytesÅs   ÿzMailbox._string_to_bytesFc Csüt|tjjƒr?t ¡}tj ||d¡}| |¡|  d¡|  ¡}|  dt ¡}|  |¡|jr;| t ¡s=|  t ¡d Sd Sd St|tttjfƒr‰t|tjƒrYt dtd¡| ¡}t|tƒrc| |¡}|rk|  dd¡}|  dt ¡}|  |¡|jr…| t ¡s‡|  t ¡d Sd Sd St|dƒröt|dƒrt d td¡|j}d } | ¡}| d ¡r²|d d …d}n | d¡r¿|d d…d}|sÂn|rÑ| d¡rÑd|dd …}|  dt ¡}|  |¡|}q |jrð|rò| t ¡sô|  t ¡d Sd Sd Sd Stdt|ƒƒ‚)z%Dump message contents to target file.ró ú8Use of StringIO input is deprecated, use BytesIO insteadés From s >From ÚreadÚbufferúDUse of text mode files is deprecated, use a binary mode file insteadNTó éþÿÿÿó éÿÿÿÿóFrom s>From éúInvalid message type: %s)Ú isinstancerAr(r ÚioÚBytesIOÚ generatorÚBytesGeneratorÚflattenÚseekrrÚreplaceÚlinesepÚwriteÚ_append_newlineÚendswithÚstrÚbytesÚStringIOÚwarningsÚwarnÚDeprecationWarningÚgetvaluernr^rsÚreadlineÚ startswithÚ TypeErrorÚtype) rr(ÚtargetÚ mangle_from_rsÚgenÚdataÚlastlineÚlinerrr Ú _dump_messageÒsf    þ ÿ     þ  ÿ    ó þzMailbox._dump_message©NTr/©F)'Ú__name__Ú __module__Ú __qualname__Ú__doc__r!r)r.r0r3r6r9r7r:rErCr=rIrLrQrRrSrTrUrWrYrZr\r]rbrdrfrhrjrnr†r™Ú classmethodrÚ__class_getitem__rrrr r"sF        6rc@sÚeZdZdZdZd6dd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-Zd.d/„Zd0d1„Zd2d3„Zd4d5„ZdS)7rzA qmail-style Maildir mailbox.ú:NTcCs¬t ||||¡tj |jd¡tj |jd¡tj |jd¡dœ|_tj |j¡sE|r@t |jd¡|j  ¡D]}t |d¡q6nt |jƒ‚i|_ dddœ|_ d|_ d|_d S) zInitialize a Maildir instance.ÚtmpÚnewÚcur)r£r¤r¥éÀr)r¥r¤gš™™™™™¹?N)rr!rrÚjoinrÚ_pathsÚexistsÚmkdirrSrÚ_tocÚ _toc_mtimesÚ _last_readÚ _skewfactor)rÚdirnamerrrrrr r!s ýÿ   zMaildir.__init__c Csf| ¡}z| ||¡Wnty| ¡t |j¡‚wt|ƒt|t ƒr;|  ¡}|j |  ¡}||j kr:d}nd}d}tj  |j¡ |j ¡d}tj  |j|||¡}t|t ƒrlt |jtj  |j¡| ¡f¡z'z t |j|¡WnttfyŠt |j|¡YW|Swt |j¡W|Sty²}zt |j¡|jtjkr­td|ƒ‚‚d}~ww)r#Úr¤rz$Name clash with existing message: %sN)Ú _create_tmpr™Ú BaseExceptionrjrr.ÚnameÚ _sync_closer|r Ú get_subdirÚcolonÚget_inforÚbasenameÚsplitr§rÚutimeÚgetatimeÚget_dateÚlinkÚAttributeErrorÚPermissionErrorÚrenameÚOSErrorÚerrnoÚEEXISTr)rr(Útmp_fileÚsubdirÚsuffixÚuniqÚdestÚerrr r)$sR  ý  € ÿ õù  ÿ€úz Maildir.addcCs t tj |j| |¡¡¡dS©r+N)rr.rr§rÚ_lookupr,rrr r.Ns zMaildir.removec Cs*z| |¡WdSttfyYdSwr1)r.r2ÚFileNotFoundErrorr,rrr r3Rs ÿzMaildir.discardc CsÊ| |¡}| |¡}| |¡}t|tƒr|}n|}tj |¡}|j|vr0|j| |j¡d}nd}|  |¡tj  |j |¡} tj  |j |||¡} t|tƒr]t  | tj  | ¡| ¡f¡t | | ¡dS)r4rxr°N)rËr)r|r rrr¯r¶r¹r3r§rrºr»r¼rÀ) rr-r(Ú old_subpathÚtemp_keyÚ temp_subpathÚdominant_subpathrÅrÆÚtmp_pathÚnew_pathrrr r6Zs$        ÿzMaildir.__setitem__cCs¶| |¡}ttj |j|¡dƒ}|jr| |¡}nt|ƒ}Wdƒn1s(wYtj |¡\}}|  |¡|j |vrJ|  | |j ¡d¡|  tj  tj |j|¡¡¡|S)r?ÚrbNrx)rËÚopenrrr§rrr r¹Ú set_subdirr¶Úset_infoÚset_dateÚgetmtime)rr-ÚsubpathÚfÚmsgrÅr³rrr r:us  €ü  zMaildir.get_messagecCsPttj |j| |¡¡dƒ}| ¡ td¡WdƒS1s!wYdS)ú2Return a bytes representation or raise a KeyError.rÓroN) rÔrrr§rrËrrrƒr„©rr-rÚrrr rC„s$ÿzMaildir.get_bytescCs$ttj |j| |¡¡dƒ}t|ƒS)rFrÓ)rÔrrr§rrËÚ _ProxyFilerÝrrr r=‰szMaildir.get_filec csB| ¡|jD]}z| |¡Wn tyYqw|VqdS©rGN)Ú_refreshr«rËr2r,rrr rIŽs€  ÿûzMaildir.iterkeyscCó| ¡||jvS©rV)ràr«r,rrr rW˜ó zMaildir.__contains__cCó| ¡t|jƒS©rX)ràÚlenr«rHrrr rYrãzMaildir.__len__cCódS)ú"Write any pending changes to disk.NrrHrrr rd¢sz Maildir.flushcCrç)reNrrHrrr rf¨óz Maildir.lockcCrç)rgNrrHrrr rh¬rézMaildir.unlockcCrç©riNrrHrrr rj°réz Maildir.closecCs\g}t |j¡D]#}t|ƒdkr+|ddkr+tj tj |j|¡¡r+| |dd…¡q|S)úReturn a list of folder names.érÚ.N)rÚlistdirrrærÚisdirr§Úappend©rr[Úentryrrr Ú list_folders´sÿ€zMaildir.list_folderscCs ttj |jd|¡|jddS)z/Return a Maildir instance for the named folder.ríF©rr)rrrr§rr©rÚfolderrrr Ú get_folder½sþzMaildir.get_foldercCs\tj |jd|¡}t||jd}tj |d¡}tj |¡s,t t |tj tj Bd¡¡|S)z>Create a folder and return a Maildir instance representing it.rí©rÚ maildirfolderé¶) rrr§rrrr©rjrÔÚO_CREATÚO_WRONLY)rrörr[Úmaildirfolder_pathrrr Ú add_folderÃs ÿzMaildir.add_foldercCstj |jd|¡}t tj |d¡¡t tj |d¡¡D]}t|ƒdks,|ddkr2td|ƒ‚qt |¡D]!}|dkrY|dkrY|dkrYtj tj ||¡¡rYtd||fƒ‚q8tj|d d D]#\}}}|D] }t  tj ||¡¡qh|D] }t  tj ||¡¡qwqat  |¡d S) ú-Delete the named folder, which must be empty.rír¤r¥rìrzFolder contains message(s): %sr£z%Folder contains subdirectory '%s': %sF)ÚtopdownN) rrr§rrîrærrïÚwalkr.Úrmdir)rrörròÚrootÚdirsÚfilesrrr Ú remove_folderÍs,ÿ ÿÿÿ€ÿzMaildir.remove_foldercCsXt ¡}t tj |jd¡¡D]}tj |jd|¡}|tj |¡dkr)t |¡qdS)zDelete old files in "tmp".r£i@úN)Útimerrîrr§rr»r.)rÚnowròrrrr Úcleanàs €ýz Maildir.cleanrìc CsÐt ¡}t ¡}d|vr| dd¡}d|vr| dd¡}dt|ƒt|ddƒt ¡tj|f}tj   |j d|¡}zt  |¡Wn!t yatjd7_zt|ƒWYSty^YnwYnwtd |ƒ‚) z=Create a file in the tmp subdirectory and open and return it.ú/z\057r¢z\072z%s.M%sP%sQ%s.%srìg€„.Ar£z&Name clash prevented file creation: %s)rÚsocketÚ gethostnamerƒÚintrÚgetpidrÚ_countrr§rÚstatrÌÚ_create_carefullyÚFileExistsErrorr)rrÚhostnamerÇrrrr r±ês0  ÿ  ÿûÿzMaildir._create_tmpcCsØt ¡|jd|jkr/d}|jD]}tj |j|¡}||j|kr%d}||j|<q|s/dSi|_|jD]/}|j|}t  |¡D]"}tj  ||¡}tj  |¡rQqA|  |j ¡d}tj  ||¡|j|<qAq5t ¡|_dS)z!Update table of contents mapping.éFTNr)rr­r®r¬rrrØr¨r«rîr§rïr¹r¶)rÚrefreshrÅÚmtimerròÚprÇrrr ràs(     ûzMaildir._refreshcCstztj tj |j|j|¡¡r|j|WSWn ty Ynw| ¡z|j|WSty9td|ƒd‚w)z=Use TOC to return subpath for given key, or raise a KeyError.úNo message with key: %sN)rrr©r§rr«r2ràr,rrr rË&s ÿ ÿ  ÿzMaildir._lookupcCsLt|dƒs | ¡|_ z|t|jƒWStyYdSty%Yq w)z0Return the next message in a one-time iteration.Ú _onetime_keysTN)r^rIrÚnextÚ StopIterationr2rHrrr r4s    ÿz Maildir.nextrš)rœrržrŸr¶r!r)r.r3r6r:rCr=rIrWrYrdrfrhrjrór÷rþrr rr±ràrËrrrrr r s8 *   $ rc@s”eZdZdZd$dd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd%d d!„Zd"d#„ZdS)&Ú_singlefileMailboxzA single-file mailbox.NTc Cs¾t ||||¡zt|jdƒ}Wn7tyG}z+|jtjkr,|r't|jdƒ}nt|jƒ‚|jtjtj fvrt|ƒt|ƒkr6|r1| |ttƒ¡n| |¡| |¡d}n|sR|rL| |ttƒ¡n| |¡n |tkrYd}nd}qtt t ||ƒƒƒ|_ t|j ƒ|_ |j ¡|_ dS)ú0Generate key-to-(start, stop) table of contents.FrTryN)r!r‚r/rrrærðr„ÚdictÚ enumerateÚzipr«r"r&)rÚstartsÚstopsÚlast_was_emptyÚline_posr˜rrr rDXs2        é zmbox._generate_tocrš) rœrržrŸrZr†r!r5rDrrrr rFs  rc@s2eZdZdZd dd„Zdd„Zdd „Zd d „ZdS) rzAn MMDF mailbox.NTcCr])zInitialize an MMDF mailbox.N)rrKrIr!rrrr r!}r^z MMDF.__init__cCó| dt¡dS)rAóNr_r@rrr r3‚ózMMDF._pre_message_hookcCs| tdt¡dS)rCrjNr_r@rrr r5†szMMDF._post_message_hookcCsàgg}}|j d¡d} |}|j ¡}|j ¡}| dt¡rM| |¡ |}|j ¡}|j ¡}|dtkrC| |ttƒ¡n |sK| |¡nq'n|sPnqtt t ||ƒƒƒ|_ t|j ƒ|_ |j dd¡|j ¡|_ dS)rarTrjrN)r!r‚rr/rr„rðrærbrcrdr«r"r&)rrerfÚnext_posrhr˜rrr rDŠs8         ÷€ ï zMMDF._generate_tocrš)rœrržrŸr!r3r5rDrrrr rzs   rc@sÂeZdZdZd0dd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„ZdS)1rzAn MH mailbox.NTcCstt ||||¡tj |j¡s5|r0t |jd¡t t tj  |jd¡tj tj Btj Bd¡¡nt |jƒ‚d|_dS)zInitialize an MH instance.r¦ú .mh_sequencesi€FN)rr!rrr©rrªrjrÔr§rûÚO_EXCLrürr%rrrr r!ªsÿ  z MH.__init__cCsú| ¡}t|ƒdkr d}nt|ƒd}tj |jt|ƒ¡}t|ƒ}d}zQ|j r+t |ƒz7z|  ||¡Wnt yN|j rBt |ƒt|ƒd}t |¡‚wt|tƒrZ| ||¡W|j rbt |ƒn |j rkt |ƒwwW|sst|ƒ|S|s|t|ƒww)r#rrìFT)rLræÚmaxrrr§rrˆrr%r(r™r²r+r´r.r|r Ú_dump_sequences)rr(rLÚnew_keyrÒrÚÚclosedrrr r)¶sJ    ù  €€ÿ ÿ€þ ÿzMH.addc Csltj |jt|ƒ¡}zt|dƒ}Wnty*}z |jtjkr%t d|ƒ‚‚d}~ww|  ¡t  |¡dS)r+rrN) rrr§rrˆrÔrÁrÂrr2rjr.)rr-rrÚrÉrrr r.Øs  €üz MH.removec Csàtj |jt|ƒ¡}zt|dƒ}Wnty*}z |jtjkr%t d|ƒ‚‚d}~wwz?|j r3t |ƒz't  t |tj tjB¡¡| ||¡t|tƒrR| ||¡W|j rZt|ƒn |j rct|ƒwwWt|ƒdSt|ƒw)r4rrN)rrr§rrˆrÔrÁrÂrr2r%r(rjrüÚO_TRUNCr™r|r rpr+r´)rr-r(rrÚrÉrrr r6æs4  €ü   €€ÿ ÿ€zMH.__setitem__c Csz |jrttj |jt|ƒ¡dƒ}n ttj |jt|ƒ¡dƒ}Wnty9}z |jtj kr4t d|ƒ‚‚d}~ww|&|jrDt |ƒz t |ƒ}W|jrQt |ƒn |jrZt |ƒwwWdƒn1sewY| ¡ ¡D] \}}||vr}| |¡qp|S)r?rrÓrN)r%rÔrrr§rrˆrÁrÂrr2r(r r+Ú get_sequencesrUÚ add_sequence)rr-rÚrÉrÛr³Úkey_listrrr r:þs:€  €ü €ÿ ÿ€ú €zMH.get_messagec CsÞz |jrttj |jt|ƒ¡dƒ}n ttj |jt|ƒ¡dƒ}Wnty9}z |jtj kr4t d|ƒ‚‚d}~ww|)|jrDt |ƒz|  ¡  td¡W|jrTt|ƒWdƒS|jrdt|ƒww1shwYdS)rÜrrÓrNro)r%rÔrrr§rrˆrÁrÂrr2r(rrrƒr„r+©rr-rÚrÉrrr rCs.€  €üù ÿúz MH.get_bytesc CsXzttj |jt|ƒ¡dƒ}Wt |ƒSty+}z |jtjkr&t d|ƒ‚‚d}~ww)rFrÓrN) rÔrrr§rrˆrÁrÂrr2rÞrwrrr r=,sû  €üz MH.get_filecCsttdd„t |j¡DƒƒƒS)rGcss |] }| ¡rt|ƒVqdSr/)Úisdigitr )Ú.0ròrrr Ú 9s€ÿzMH.iterkeys..)Úiterr2rrîrrHrrr rI7sz MH.iterkeyscCstj tj |jt|ƒ¡¡Srâ)rrr©r§rrˆr,rrr rW<szMH.__contains__cCstt| ¡ƒƒSrå)rærKrIrHrrr rY@óz MH.__len__cCs6|jsttj |jd¡dƒ|_t|jƒd|_dSdS)rermrTN)r%rÔrrr§rr!r(rHrrr rfDs   ýzMH.lockcCs,|jrt|jƒt|jƒ|`d|_dSdSr*)r%r+r!r´rHrrr rhKs    üz MH.unlockcCrç)rcNrrHrrr rdSrézMH.flushcCs|jr | ¡dSdSrê)r%rhrHrrr rjWs ÿzMH.closecCs<g}t |j¡D]}tj tj |j|¡¡r| |¡q|S)rë)rrîrrrïr§rðrñrrr ró\s  €zMH.list_folderscCsttj |j|¡|jddS)z+Return an MH instance for the named folder.Frô©rrrr§rrrõrrr r÷dsÿz MH.get_foldercCsttj |j|¡|jdS)z:Create a folder and return an MH instance representing it.rør}rõrrr rþisÿz MH.add_foldercCs`tj |j|¡}t |¡}|dgkrt tj |d¡¡n |gkr"ntd|jƒ‚t |¡dS)rÿrmzFolder not empty: %sN)rrr§rrîr.rr)rrörÚentriesrrr rns  zMH.remove_folderc si}ttj |jd¡dddp}t| ¡ƒ‰|D]^}zM| d¡\}}tƒ}| ¡D]$}| ¡r7|  t |ƒ¡q)dd„| d¡Dƒ\}} |  t || d ƒ¡q)‡fd d „t |ƒDƒ||<t||ƒd krf||=Wqtyvtd | ¡ƒ‚wWdƒ|S1s‚wY|S)z=Return a name-to-key-list dictionary to define each sequence.rmÚrÚASCII©Úencodingr¢css|]}t|ƒVqdSr/)r )ryÚxrrr rz‡ó€z#MH.get_sequences..ú-rìcsg|]}|ˆvr|‘qSrr)ryr-©Úall_keysrr Ú ‰sÿz$MH.get_sequences..rz"Invalid sequence specification: %sN)rÔrrr§rÚsetrLr¹rxr)r rbÚranger2rærmrÚrstrip) rÚresultsrÚr˜r³ÚcontentsrLÚspecr;r<rr†r rtzs4  € ÿÿò þízMH.get_sequencescCsttj |jd¡ddd}zqt t |jtjtjB¡¡|  ¡D]W\}}t |ƒdkr+q |  |d¡d}d}t t |ƒƒD])}|d |krN|sMd }|  d ¡n|r\d}|  d ||f¡n|  d |¡|}q<|rr|  t|ƒd¡q |  d¡q Wt|ƒdSt|ƒw)z:Set sequences using the given name-to-key-list dictionary.rmzr+r€rrr¢NFrìTr…z%s %sz %sÚ )rÔrrr§rrjr³rürsrUrær…r2r‰rˆr´)rÚ sequencesrÚr³rLÚprevÚ completingr-rrr Ú set_sequences’s2   € ìzMH.set_sequencesc Cs8| ¡}d}g}| ¡D]`}|d|krh| ||df¡zt tj |jt|ƒ¡tj |jt|dƒ¡¡Wn#t t fyZt  tj |jt|ƒ¡tj |jt|dƒ¡¡Ynwt  tj |jt|ƒ¡¡|d7}q |d|_ t|ƒdkrzdS| ¡D]\}}|D]\}}||vr“||| |¡<q„q~| |¡dS)z?Re-name messages to eliminate numbering gaps. Invalidates keys.rrìN)rtrIrðrr½rr§rrˆr¾r¿rÀÚunlinkr"rærUÚindexr“) rrr‘Úchangesr-r³rvÚoldr¤rrr Úpack¯s6  ÿÿÿ    €þzMH.packcCst| ¡}| ¡}| ¡D]\}}||vr| |¡q ||vr$|| |¡=q |D] }||vr2|g||<q'| |¡dS)z;Inspect a new MHMessage and update sequences appropriately.N)rtrUrðr•r“)rr(r-Úpending_sequencesÚ all_sequencesr³rvÚsequencerrr rpÉs  € €zMH._dump_sequencesrš)rœrržrŸr!r)r.r6r:rCr=rIrWrYrfrhrdrjrór÷rþrrtr“r˜rprrrr r§s0  "   rc@s†eZdZdZehd£ƒZddd„Zdd„Zd d „Zd d „Z d d„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„ZdS) rzAn Rmail-style Babyl mailbox.>ÚfiledÚeditedÚresentÚunseenÚdeletedÚansweredÚ forwardedNTcCst ||||¡i|_dS)zInitialize a Babyl mailbox.N)rr!Ú_labelsrrrr r!Þs zBabyl.__init__cCs(t ||¡}t|tƒr| ¡|j|<|S)r#)rr)r|r Ú get_labelsr£)rr(r-rrr r)ãs  z Babyl.addcCs&t ||¡||jvr|j|=dSdSrÊ)rr.r£r,rrr r.ês   ÿz Babyl.removecCs.t |||¡t|tƒr| ¡|j|<dSdS)r4N)rr6r|r r¤r£r5rrr r6ðs ÿzBabyl.__setitem__c Cs| |¡\}}|j |¡|j ¡t ¡} |j ¡}|dtks$|s%n | | td¡¡qt ¡} |j ¡}|tks?|s@n | | td¡¡q4||j  ¡}|dksWJ‚|j  |¡}| td¡}t |  ¡|ƒ} |   |  ¡¡||jvr|  |j|¡| S)r?Tó *** EOOH ***ror)rËr!r‚rr}r~r„r…rƒr/rrr rŽÚ set_visibler£Ú set_labels) rr-r;r<Úoriginal_headersr˜Úvisible_headersÚnÚbodyrÛrrr r:ös4   ü  ü    zBabyl.get_messagec Cs¼| |¡\}}|j |¡|j ¡t ¡} |j ¡}|dtks$|s%n | | td¡¡q |j ¡}|tks;|s.rìNó,ór)r!r‚rr/r„rærðr¹rbrcrdr«r£r"r&)rrerfrlÚ label_listsrhr˜r°rrr rD5s:      ÿ €ï zBabyl._generate_toccCsVdt}|dt7}| ¡}dd„|Dƒ}|dd |¡t7}|d7}| |¡dS) r?sBABYL OPTIONS:s Version: 5css|]}| ¡VqdSr/)rkr³rrr rzXr„z*Babyl._pre_mailbox_hook..sLabels:rµr¶N)r„r¤r§r…)rrÚÚbabylr°rrr r1Ss zBabyl._pre_mailbox_hookcCri)rAó Nr_r@rrr r3]rkzBabyl._pre_message_hookcCs| td¡dS)rCr¶Nr_r@rrr r5arkzBabyl._post_message_hookcCs`|j ¡}t|tƒrXg}g}| ¡D]}||jvr| |¡q| |¡q|j d¡|D] }|j d| ¡¡q-|j d¡|D]}|j d| ¡d¡qB|j t ¡n|j dt ¡t|t j j ƒrþt  ¡}t j |dd¡}| |¡| d¡ | ¡}|j | d t ¡¡|d ks’|s“nq~|j d t ¡t|tƒrÌt  ¡} t j | dd¡} |  | ¡¡ |  ¡}|j | d t ¡¡|d ksÉ|sÊnqµn| d¡ | ¡}|j | d t ¡¡|d ksæ|sçnqÒ | d ¡} | sñn |j |  d t ¡¡qén)t|ttt jfƒr{t|t jƒrt d td¡| ¡}t|tƒr%| |¡}| d¡d} | ddkrf|j |d| … d t ¡¡|j d t ¡|j |d| … d t ¡¡|j || d… d t ¡¡nÁ|j d t t ¡|j | d t ¡¡n¬t |dƒrt |dƒr‘t dtd¡|j!}| ¡} d } | ¡}| "d¡r«|dd…d }n| "d¡r¹|dd…d }|j | d t ¡¡|d ksË|sß|rÞd}|j d t ¡| | ¡nnq˜ | ¡}|sên4| "d¡rù|dd…t }n| "d¡r|dd…t }n| "d ¡r|dd…t }|j |¡qânt#dt$|ƒƒ‚|j ¡}||fS)z0Write message contents and return (start, stop).ó1s, s,,ó rµs1,,FrTror¥r,rprqs rrxNrrsrtrurvrwr{)%r!r/r|r r¤r¯rðr…rkr„rAr(r r}r~rr€rr‚rrƒÚ get_visiblerrr‰rˆrŠr‹rŒrrŽrnrTr^rsr‡r‘r’)rr(r;Úspecial_labelsr°r´Ú orig_bufferÚorig_generatorr˜Ú vis_bufferÚ vis_generatorrsÚ body_startÚ original_posÚ first_passr<rrr rEesÖ           ü  ü  ü üÿ    ÿ   ò    õ zBabyl._install_messagerš)rœrržrŸÚ frozensetr¯r!r)r.r6r:rCr=r¤rDr1r3r5rErrrr rØs      rc@s*eZdZdZd dd„Zdd„Zdd„ZdS) r z0Message with mailbox-format-specific properties.NcCsÞt|tjjƒr| t |¡¡t|tƒr| |¡dSdSt|tƒr,| t  |¡¡dSt|t ƒr;| t  |¡¡dSt|t j ƒrK| t |¡¡dSt|dƒrZ| t |¡¡dS|durgtjj |¡dStdt|ƒƒ‚)zInitialize a Message instance.rrNr{)r|rAr(r Ú_become_messageÚcopyÚdeepcopyÚ _explain_tor‰rBrˆÚmessage_from_stringr}Ú TextIOWrapperÚmessage_from_filer^Úmessage_from_binary_filer!r‘r’r'rrr r!Ôs  ÿ    zMessage.__init__cCs4t|dgƒ}|jD]}||vr|j||j|<q dS)z0Assume the non-format-specific state of message.Ú_type_specific_attributesN)ÚgetattrÚ__dict__)rr(Ú type_specificr³rrr rÆçs  €þzMessage._become_messagecCst|tƒrdStdƒ‚)z:Copy format-specific state to message insofar as possible.Nz Cannot convert to specified type)r|r r‘r'rrr rÉîs zMessage._explain_tor/)rœrržrŸr!rÆrÉrrrr r Ñs   r c@szeZdZdZgd¢Zddd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„ZdS)r z)Message with Maildir-specific properties.)Ú_subdirÚ_infoÚ_dateNcCs&d|_d|_t ¡|_t ||¡dS)z%Initialize a MaildirMessage instance.r¤r°N)rÒrÓrrÔr r!r'rrr r!ûs zMaildirMessage.__init__cCó|jS)zReturn 'new' or 'cur'.)rÒrHrrr rµózMaildirMessage.get_subdircCs&|dks|dkr ||_dStd|ƒ‚)zSet subdir to 'new' or 'cur'.r¤r¥z!subdir must be 'new' or 'cur': %sN)rÒrm)rrÅrrr rÕs  zMaildirMessage.set_subdircCs|j d¡r |jdd…SdS)ú*Return as a string the flags that are set.ú2,rNr°)rÓrrHrrr Ú get_flags s zMaildirMessage.get_flagscCsdd t|ƒ¡|_dS)ú)Set the given flags and unset all others.rØr°N)r§r2rÓ)rÚflagsrrr Ú set_flagsr­zMaildirMessage.set_flagscCó$| d t| ¡ƒt|ƒB¡¡dS©z.Set the given flag(s) without changing others.r°N©rÜr§r‰rÙ©rÚflagrrr Úadd_flagó$zMaildirMessage.add_flagcCs0| ¡r| d t| ¡ƒt|ƒ¡¡dSdS)ú7Unset the given string flag(s) without changing others.r°N)rÙrÜr§r‰ràrrr Ú remove_flags$ÿzMaildirMessage.remove_flagcCrÕ)zSet "From " line, formatting and appending time_ if specified.NTú )rrYrXrö)rrRÚtime_rrr rLus  z_mboxMMDFMessage.set_fromcCs| dd¡| dd¡S)r×ÚStatusr°úX-Status)r9rHrrr rÙ}r­z_mboxMMDFMessage.get_flagscCsÎt|ƒ}d\}}dD]}||vr||7}| |¡q dD]}||vr+||7}| |¡q|d t|ƒ¡7}z| d|¡WntyL| d|¡Ynwz | d|¡WdStyf| d|¡YdSw)rÚ)r°r°)rêrë)rírîrïr°rùrúN)r‰r.r§r2Úreplace_headerr2Ú add_header)rrÛÚ status_flagsÚ xstatus_flagsrárrr rÜs. € € ÿ ÿz_mboxMMDFMessage.set_flagscCrÝrÞrßràrrr râ—rãz_mboxMMDFMessage.add_flagcCs8d|vsd|vr| d t| ¡ƒt|ƒ¡¡dSdS)rärùrúr°Nrßràrrr rå›s$ÿz_mboxMMDFMessage.remove_flagc CsÎt|tƒrgt| ¡ƒ}d|vr| d¡d|vr| d¡d|vr&| d¡d|vr/| d¡d|vr8| d¡|d =|d =d  | ¡ ¡d d …¡}z|  t   t   |d¡¡¡Wd SttfyfYd Swt|tƒr|| | ¡¡| | ¡¡d St|tƒrªt| ¡ƒ}d|vr| d¡d|vr™| d¡d|vr¢| d¡|d =|d =d St|tƒrØt| ¡ƒ}d|vr¾| d¡d|vrÇ| d¡d|vrÐ| d¡|d =|d =d St|tƒrßd Stdt|ƒƒ‚)zACopy mbox- or MMDF-specific state to message insofar as possible.rër¥rîrïrêrérírìÚstatuszx-statusr÷éûÿÿÿNz%a %b %d %H:%M:%S %YrŸrñròr r¡rô)r|r r‰rÙrÕrâr§rVr¹r×ÚcalendarÚtimegmrÚstrptimermÚ OverflowErrorrUrÜrLr rur rõr r‘r’)rr(rÛÚ maybe_daterrr rÉ sd       ÿÿ              ÿz_mboxMMDFMessage._explain_tor/) rœrržrŸrÎr!rVrLrÙrÜrârårÉrrrr rUcs   rUc@óeZdZdZdS)r z&Message with mbox-specific properties.N©rœrržrŸrrrr r Ôór c@sHeZdZdZdgZddd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dS)r z$Message with MH-specific properties.Ú _sequencesNcCsg|_t ||¡dS)z!Initialize an MHMessage instance.N)r r r!r'rrr r!ÝszMHMessage.__init__cCó|jdd…S)z4Return a list of sequences that include the message.N)r rHrrr rtâr`zMHMessage.get_sequencescCót|ƒ|_dS)z3Set the list of sequences that include the message.N)rKr )rrrrr r“ær`zMHMessage.set_sequencescCó8t|tƒr||jvr|j |¡dSdStdt|ƒƒ‚)z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)r|rˆr rðr‘r’©rr›rrr ruêó  ÿzMHMessage.add_sequencecCó(z |j |¡WdStyYdSw)zARemove sequence from the list of sequences including the message.N)r r.rmr rrr Úremove_sequenceòó  ÿzMHMessage.remove_sequencecCsPt|tƒr5t| ¡ƒ}d|vr| d¡n | d¡| d¡d|vr(| d¡d|vr3| d¡d Sd St|tƒret| ¡ƒ}d|vrJ| d¡n| d ¡d|vrX| d¡d|vrc| d ¡d Sd St|tƒrx| ¡D]}| |¡qnd St|t ƒr™t| ¡ƒ}d|vrŒ|  d¡d|vr—|  d ¡d Sd St|t ƒr d St d t |ƒƒ‚)z6Copy MH-specific state to message insofar as possible.rŸr¥réròrîrñrêÚROrërïr¡rôN)r|r r‰rtrÕrârUr rur rõr r‘r’)rr(rr›rrr rÉùsJ      ÿ     ÿ   ÿ   ÿ ÿzMHMessage._explain_tor/) rœrržrŸrÎr!rtr“rurrÉrrrr r Øs  r c@sbeZdZdZddgZddd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dS)r z'Message with Babyl-specific properties.r£Ú_visibleNcCsg|_tƒ|_t ||¡dS)z#Initialize a BabylMessage instance.N)r£r rr!r'rrr r!%szBabylMessage.__init__cCr )z'Return a list of labels on the message.N)r£rHrrr r¤+r`zBabylMessage.get_labelscCr )z&Set the list of labels on the message.N)rKr£)rr°rrr r§/r`zBabylMessage.set_labelscCr )z+Add label to list of labels on the message.zlabel must be a string: %sN)r|rˆr£rðr‘r’©rr´rrr rõ3rzBabylMessage.add_labelcCr)z4Remove label from the list of labels on the message.N)r£r.rmrrrr Ú remove_label;rzBabylMessage.remove_labelcCs t|jƒS)z3Return a Message representation of visible headers.©r rrHrrr r¼Bs zBabylMessage.get_visiblecCr )z2Set the Message representation of visible headers.Nr)rÚvisiblerrr r¦Fr`zBabylMessage.set_visiblecCsb|j ¡D]}||vr|j |||¡q|j|=qdD]}||vr.||jvr.|||j|<qdS)z9Update and/or sensibly generate a set of visible headers.)ÚDateÚFromzReply-ToÚToÚCCÚSubjectN)rrLrû)rÚheaderrrr Úupdate_visibleJs €þzBabylMessage.update_visiblecCsxt|tƒrBt| ¡ƒ}d|vr| d¡n | d¡| d¡d|vs'd|vr,| d¡d|vr5| d¡d |vr@| d ¡dSdSt|tƒrrt| ¡ƒ}d|vrW| d ¡n| d ¡d |vre| d ¡d|vrp| d¡dSdSt|tƒr“t| ¡ƒ}d|vr†| d¡d|vr‘| d¡dSdSt|t ƒr­|  |  ¡¡| ¡D]}|  |¡q£dSt|t ƒr´dStdt|ƒƒ‚)z9Copy Babyl-specific state to message insofar as possible.rŸr¥rér¢ržrór¡rêr rìrrërírïrñrôN)r|r r‰r¤rÕrârUr rur r¦r¼rõr r‘r’)rr(r°r´rrr rÉUsP       ÿ     ÿ   ÿ   ÿ ÿzBabylMessage._explain_tor/)rœrržrŸrÎr!r¤r§rõrr¼r¦rrÉrrrr r s  r c@r)rz&Message with MMDF-specific properties.Nrrrrr rrrc@s°eZdZdZd&dd„Zd&dd„Zd&dd„Zd&d d „Zd&d d „Zd d„Z dd„Z d'dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zed$d%„ƒZeeƒZdS)(rÞzA read-only wrapper of a file.NcCs&||_|dur| ¡|_dS||_dS)zInitialize a _ProxyFile.N)r!r/Ú_pos)rrÚÚposrrr r!†s z_ProxyFile.__init__cCó| ||jj¡S©z Read bytes.)Ú_readr!rr©rÚsizerrr rrŽr|z_ProxyFile.readcCr!r")r#r!Úread1r$rrr r&’r|z_ProxyFile.read1cCr!)z Read a line.)r#r!rr$rrr r–r|z_ProxyFile.readlinecCs>g}|D]}| |¡|dur|t|ƒ8}|dkr|Sq|S)zRead multiple lines.Nr)rðræ)rÚsizehintr[r˜rrr Ú readlinesšs  €z_ProxyFile.readlinesccs | ¡}|s dS|Vq)zIterate over lines.TN)r)rr˜rrr rR¥s€üz_ProxyFile.__iter__cCrÕ)zReturn the position.)rrHrrr r/­rÖz_ProxyFile.tellrcCs4|dkr |j |j¡|j ||¡|j ¡|_dS)zChange position.rìN©r!r‚rr/©rÚoffsetÚwhencerrr r‚±sz_ProxyFile.seekcCs@t|dƒrzt|jdƒr|j ¡W|`dSW|`dS|`wdS)zClose the file.r!rjN)r^r!rjrHrrr rj¸s   ýûz_ProxyFile.closecCs2|durd}|j |j¡||ƒ}|j ¡|_|S)z"Read size bytes using read_method.Nrxr))rr%Ú read_methodr[rrr r#Ás  z_ProxyFile._readcCs|S)z$Context management protocol support.rrHrrr Ú __enter__Êréz_ProxyFile.__enter__cGs | ¡dSr/)rj)rÚexcrrr Ú__exit__Îs z_ProxyFile.__exit__cCó |j ¡Sr/)r!ÚreadablerHrrr r2Ñó z_ProxyFile.readablecCr1r/)r!ÚwritablerHrrr r4Ôr3z_ProxyFile.writablecCr1r/)r!ÚseekablerHrrr r5×r3z_ProxyFile.seekablecCr1r/)r!rdrHrrr rdÚr3z_ProxyFile.flushcCs&t|dƒsdSt|jdƒsdS|jjS)Nr!TrrF)r^r!rrrHrrr rrÝs  z_ProxyFile.closedr/©r)rœrržrŸr!rrr&rr(rRr/r‚rjr#r.r0r2r4r5rdÚpropertyrrr rr¡rrrr rÞƒs*           rÞc@s<eZdZdZddd„Zdd„Zddd „Zd d „Zd d „ZdS)rSz&A read-only wrapper of part of a file.NcCst |||¡||_||_dS)zInitialize a _PartialFile.N)rÞr!Ú_startÚ_stop)rrÚr;r<rrr r!ës z_PartialFile.__init__cCst |¡|jS)z*Return the position with respect to start.)rÞr/r8rHrrr r/ñr|z_PartialFile.tellrcCs<|dkr |j|_d}n |dkr|j|_d}t |||¡dS)z8Change position, possibly with respect to start or stop.rrìrN)r8rr9rÞr‚r*rrr r‚õsz_PartialFile.seekcCsB|j|j}|dkr dS|dus|dks||kr|}t |||¡S)z;Read size bytes using read_method, honoring start and stop.rrJN)r9rrÞr#)rr%r-Ú remainingrrr r#ÿs z_PartialFile._readcCst|dƒr |`dSdS)Nr!)r^r!rHrrr rjs ÿz_PartialFile.close)NNr6) rœrržrŸr!r/r‚r#rjrrrr rSès   rSTc Cs„d}z¨tr1z t |tjtjB¡Wnty0}z|jtjtjtjfvr+t d|j ƒ‚‚d}~ww|r¨z t |j dƒ}|  ¡Wnty^}z|jtjtjfvrYWYd}~WdS‚d}~wwz4zt  |j |j d¡d}Wnttfy…t  |j |j d¡d}Yn wt  |j ¡WWdSWWdSty§t  |j ¡t d|j ƒ‚wWdStr·t |tj¡|rÁt  |j d¡‚)z(Lock file f using lockf and dot locking.Fzlockf: lock unavailable: %sNú.lockTzdot lock unavailable: %s)ÚfcntlÚlockfÚLOCK_EXÚLOCK_NBrÁrÂÚEAGAINrr rr³r0rjrr½r¾r¿rÀr”rr.ÚLOCK_UN)rÚr-Ú dotlock_donerÉÚpre_lockrrr r(s\ÿ€û €üþþ  ÿþîr(cCs<tr t |tj¡tj |jd¡rt |jd¡dSdS)z*Unlock file f using lockf and dot locking.r;N)r<r=rArrr©r³r.©rÚrrr r+9s ÿr+c Cs@t |tjtjBtjBd¡}z t|dƒWt |¡St |¡w)zCCreate a file if it doesn't exist and open for reading and writing.rúr)rrÔrûrnÚO_RDWRrj)rÚfdrrr r@s rcCs$td|tt ¡ƒt ¡t ¡fƒS)zBCreate a temp file based on path and open for reading and writing.z %s.%s.%s.%s)rr rr r rr)rrrr r0Hsþr0cCs(| ¡ttdƒrt | ¡¡dSdS)z0Ensure changes to file f are physically on disk.ÚfsyncN)rdr^rrGÚfilenorDrrr r.Ns ÿr.cCst|ƒ| ¡dS)z:Close file f, ensuring all changes are physically on disk.N)r.rjrDrrr r´Ts r´c@r)rz"Raised for module-specific errors.Nrrrrr rZrrc@r)rz:The specified mailbox does not exist and won't be created.Nrrrrr r]rrc@r)rz>The specified mailbox is not empty and deletion was requested.Nrrrrr r`rrc@r)rz)Another process caused an action to fail.Nrrrrr rcrrc@r)rz)A file appears to have an invalid format.Nrrrrr rfrr)T)2rŸrrrr rÂrÇr‹rAÚ email.messageÚemail.generatorr}r;Útypesrr<Ú ImportErrorÚ__all__r„rkrrrrIrrrrr(r r rUr r r rrÞrSr(r+rr0r.r´Ú Exceptionrrrrrrrrr Úsp   ÿ j8DB4-3z%mqH_e '*