o ?OgÊ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ú./opt/alt/python310/lib64/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_bytesZ 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.)ÚlistrHrGrrr Úkeysfó z Mailbox.keysc cs:| ¡D]}z||}Wn tyYqw|VqdS)z%Return an iterator over all messages.N©rHr2©rr-Úvaluerrr Ú itervaluesjs€   ÿûzMailbox.itervaluescCs| ¡Sr/)rPrGrrr Ú__iter__sszMailbox.__iter__cCrI)z,Return a list of messages. Memory intensive.)rJrPrGrrr ÚvaluesvrLzMailbox.valuesc cs>| ¡D]}z||}Wn tyYqw||fVqdS)z.Return an iterator over (key, message) tuples.NrMrNrrr Ú iteritemszs€   ÿ ûzMailbox.iteritemscCrI)z9Return a list of (key, message) tuples. Memory intensive.)rJrSrGrrr ÚitemsƒrLz 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%rGrrr Ú__len__‹r*zMailbox.__len__cCs| ¡D]}| |¡qdS)zDelete all messages.N)rKr3r,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)rHr[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.rSrTFTzNo message with key(s)N)ÚhasattrrSrTr2)rÚargÚsourceZbad_keyr-r(rrr Úupdate¤s       ÿÿzMailbox.updatecCr")ú&Write any pending changes to the disk.r$r%rGrrr Úflushµr*z Mailbox.flushcCr")úLock the mailbox.r$r%rGrrr Úlock¹r*z Mailbox.lockcCr")ú#Unlock the mailbox if it is locked.r$r%rGrrr Úunlock½r*zMailbox.unlockcCr")úFlush and close the mailbox.r$r%rGrrr Ú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ÚseekrpÚreplaceÚlinesepÚwriteÚ_append_newlineÚendswithÚstrÚbytesÚStringIOÚwarningsÚwarnÚDeprecationWarningÚgetvaluerlr]rqÚreadlineÚ startswithÚ TypeErrorÚtype) rr(ÚtargetZ mangle_from_rqÚgenÚdataZlastlineÚlinerrr Ú _dump_messageÒsf    þ ÿ     þ  ÿ    ó þzMailbox._dump_message©NTr/©F)'Ú__name__Ú __module__Ú __qualname__Ú__doc__r!r)r.r0r3r6r9r7r:rDrCr=rHrKrPrQrRrSrTrVrXrYr[r\r`rbrdrfrhrlr„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ÚmkdirrRrÚ_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•Ú BaseExceptionrhrr.ÚnameÚ _sync_closerzr Ú get_subdirÚcolonÚget_inforÚbasenameÚsplitr£rÚutimeÚgetatimeÚget_dateÚlinkÚAttributeErrorÚPermissionErrorÚrenameÚOSErrorÚerrnoZEEXISTr)rr(Ztmp_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)r4rvr¬N)rÅr)rzr rrr«r²rµr3r£rr¶r·r¸r¼) rr-r(Z old_subpathZtemp_keyZ temp_subpathZdominant_subpathr¿rÀZtmp_pathÚnew_pathrrr r6Zs$        ÿzMaildir.__setitem__cCs¶| |¡}ttj |j|¡dƒ}|jr| |¡}nt|ƒ}Wdƒn1s(wYtj |¡\}}|  |¡|j |vrJ|  | |j ¡d¡|  tj  tj |j|¡¡¡|S)r?ÚrbNrv)rÅÚopenrrr£rrr rµÚ set_subdirr²Úset_infoÚset_dateÚgetmtime)rr-ZsubpathÚfÚmsgr¿r¯rrr r:us  €ü  zMaildir.get_messagecCsPttj |j| |¡¡dƒ}| ¡ td¡WdƒS1s!wYdS)ú2Return a bytes representation or raise a KeyError.rÈrmN) rÉrrr£rrÅrprr‚©rr-rÎrrr rC„s$ÿzMaildir.get_bytescCs$ttj |j| |¡¡dƒ}t|ƒS)rErÈ)rÉrrr£rrÅÚ _ProxyFilerÑrrr r=‰szMaildir.get_filec csB| ¡|jD]}z| |¡Wn tyYqw|VqdS©rFN)Ú_refreshr§rÅr2r,rrr rHŽs€  ÿûzMaildir.iterkeyscCó| ¡||jvS©rU)rÔr§r,rrr rV˜ó zMaildir.__contains__cCó| ¡t|jƒS©rW)rÔÚlenr§rGrrr rXr×zMaildir.__len__cCódS)ú"Write any pending changes to disk.NrrGrrr rb¢sz Maildir.flushcCrÛ)rcNrrGrrr rd¨óz Maildir.lockcCrÛ)reNrrGrrr rf¬rÝzMaildir.unlockcCrÛ©rgNrrGrrr rh°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©rrZÚ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á©rZ maildirfolderé¶) rrr£rrrr¥rhrÉÚO_CREATÚO_WRONLY)rrêrrZZmaildirfolder_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úZhostnamerÁ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)rùr©rªr¨rrrÍr¤r§râr£rãrµr²)rZrefreshr¿Ú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]rHr ÚnextÚ StopIterationr2rGrrr r 4s    ÿz Maildir.nextr–)r˜r™ršr›r²r!r)r.r3r6r:rCr=rHrVrXrbrdrfrhrçrërðrørûrr­rÔrÅr rrrr 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.FrTrwN)rr€rrrŽrÚrär‚ÚdictÚ enumerateÚzipr§rr)rÚstartsÚstopsZlast_was_emptyÚline_posr”rrr r0Xs2        é zmbox._generate_tocr–) r˜r™ršr›rDr„r!r%r0rrrr rFs  rc@s2eZdZdZd dd„Zdd„Zdd „Zd d „ZdS) rzAn MMDF mailbox.NTcCrF)zInitialize an MMDF mailbox.N)rr5r3r!rrrr r!}rGz MMDF.__init__cCó| dt¡dS)r-óNrHr,rrr r#‚ózMMDF._pre_message_hookcCs| tdt¡dS)r/rRNrHr,rrr r%†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)rJrTrRrN)rr€rrrŽr‚rärÚrKrLrMr§rr)rrNrOÚnext_posrPr”rrr r0Šs8         ÷€ ï zMMDF._generate_tocr–)r˜r™ršr›r!r#r%r0rrrr 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¦rhrÉr£rîÚO_EXCLrïrrrrrr 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)rKrÚÚmaxrrr£rr†rrrr•r®rr°r.rzr Ú_dump_sequences)rr(rKZnew_keyrÇrÎÚclosedrrr r)¶sJ    ù  €€ÿ ÿ€þ ÿzMH.addc Csltj |jt|ƒ¡}zt|dƒ}Wnty*}z |jtjkr%t d|ƒ‚‚d}~ww|  ¡t  |¡dS)r+r rN) rrr£rr†rÉr½r¾rr2rhr.)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)r4r rN)rrr£rr†rÉr½r¾rr2rrrhrïÚO_TRUNCr•rzr rXrr°)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?r rÈrN)rrÉrrr£rr†r½r¾rr2rr rÚ get_sequencesrTÚ 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Ðr rÈrNrm)rrÉrrr£rr†r½r¾rr2rrprr‚r©rr-rÎrÃrrr rCs.€  €üù ÿúz MH.get_bytesc CsXzttj |jt|ƒ¡dƒ}Wt |ƒSty+}z |jtjkr&t d|ƒ‚‚d}~ww)rErÈrN) rÉrrr£rr†r½r¾rr2rÒr^rrr r=,sû  €üz MH.get_filecCsttdd„t |j¡DƒƒƒS)rFcss |] }| ¡rt|ƒVqdSr/)Úisdigitrÿ)Ú.0rærrr Ú 9s€ÿzMH.iterkeys..)Úiterr"rrârrGrrr rH7sz MH.iterkeyscCstj tj |jt|ƒ¡¡SrÖ)rrr¥r£rr†r,rrr rV<szMH.__contains__cCstt| ¡ƒƒSrÙ)rÚrJrHrGrrr rX@óz MH.__len__cCs6|jsttj |jd¡dƒ|_t|jƒd|_dSdS)rcrUr TN)rrÉrrr£rrrrGrrr rdDs   ýzMH.lockcCs,|jrt|jƒt|jƒ|`d|_dSdSr)rrrr°rGrrr rfKs    üz MH.unlockcCrÛ)raNrrGrrr rbSrÝzMH.flushcCs|jr | ¡dSdSrÞ)rrfrGrrr rhWs ÿ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ìrdrérrr rðisÿz MH.add_foldercCs`tj |j|¡}t |¡}|dgkrt tj |d¡¡n |gkr"ntd|jƒ‚t |¡dS)rñrUzFolder not empty: %sN)rrr£rrâr.rrô)rrêrÚentriesrrr røns  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.rUÚrÚASCII©Úencodingržcss|]}t|ƒVqdSr/)rÿ)r`Úxrrr ra‡ó€z#MH.get_sequences..ú-ràcsg|]}|ˆvr|‘qSrr)r`r-©Zall_keysrr Ú ‰sÿz$MH.get_sequences..rz"Invalid sequence specification: %sN)rÉrrr£rÚsetrKrµr_r)rÿr`Úranger"rÚrkrÚrstrip) rZresultsrÎr”r¯ÚcontentsrKÚspecr(r)rrmr r[zs4  € ÿÿò þí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.rUzr+rgrhrržNFràTrlz%s %sz %sÚ )rÉrrr£rrhr¯rïrZrTrÚrƒr"ror†r°)rÚ sequencesrÎr¯rKÚprevZ 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)r[rHrärr¹rr£rr†rºr»r¼ÚunlinkrrÚrTÚindexrw) rrurvZchangesr-r¯r]Ú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)r[rTräryrw)rr(r-Zpending_sequencesZ all_sequencesr¯r]Úsequencerrr rXÉs  € €zMH._dump_sequencesr–)r˜r™ršr›r!r)r.r6r:rCr=rHrVrXrdrfrbrhrçrërðrør[rwr{rXrrrr 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.>ÚunseenÚdeletedÚansweredÚ forwardedZfiledÚresentZeditedNTcCst ||||¡i|_dS)zInitialize a Babyl mailbox.N)r r!Ú_labelsrrrr r!Þs zBabyl.__init__cCs(t ||¡}t|tƒr| ¡|j|<|S)r#)r r)rzr Ú get_labelsr‚)rr(r-rrr r)ãs  z Babyl.addcCs&t ||¡||jvr|j|=dSdSrÄ)r r.r‚r,rrr r.ês   ÿz Babyl.removecCs.t |||¡t|tƒr| ¡|j|<dSdS)r4N)r r6rzr 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 ***rmr)rÅrr€rr{r|r‚rƒrrrpr rŒÚ set_visibler‚Ú set_labels) rr-r(r)Úoriginal_headersr”Zvisible_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)rr€rrr‚rÚrärµrKrLrMr§r‚rr)rrNrOrTZ label_listsrPr”rrrr r05s:      ÿ €ï zBabyl._generate_toccCsVdt}|dt7}| ¡}dd„|Dƒ}|dd |¡t7}|d7}| |¡dS) r+sBABYL OPTIONS:s Version: 5css|]}| ¡VqdSr/)rirrrr raXrkz*Babyl._pre_mailbox_hook..sLabels:r‘r’N)r‚rƒr£rƒ)rrÎZbabylrrrr r!Ss zBabyl._pre_mailbox_hookcCrQ)r-ó NrHr,rrr r#]rSzBabyl._pre_message_hookcCs| td¡dS)r/r’NrHr,rrr r%arSzBabyl._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,,FrTrmr„rrnros rrvNrrqrrrsrtrury)%rrrzr rƒrŒrärƒrir‚rAr(r r{r|r}r~rr€rrÚ get_visiblerpr‡r†rˆr‰rŠr‹rŒrlr>r]rqr…rr)rr(r(Zspecial_labelsrrZ orig_bufferZorig_generatorr”Z vis_bufferZ vis_generatorrqZ body_startZ original_posZ first_passr)rrr r1esÖ           ü  ü  ü üÿ    ÿ   ò    õ zBabyl._install_messager–)r˜r™ršr›Ú frozensetrŒr!r)r.r6r:rCr=rƒr0r!r#r%r1rrrr 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.rpNry)rzrAr(r Ú_become_messageÚcopyZdeepcopyÚ _explain_tor‡rBr†Zmessage_from_stringr{Ú TextIOWrapperZmessage_from_filer]Zmessage_from_binary_filer!rrr'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(Z 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)rzr rr'rrr ršîs zMessage._explain_tor/)r˜r™rš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 rùr¡r r!r'rrr r!ûs zMaildirMessage.__init__cCó|jS)zReturn 'new' or 'cur'.)rŸrGrrr r±ózMaildirMessage.get_subdircCs&|dks|dkr ||_dStd|ƒ‚)zSet subdir to 'new' or 'cur'.r r¡z!subdir must be 'new' or 'cur': %sN)rŸrk)rr¿rrr rÊs  zMaildirMessage.set_subdircCs|j d¡r |jdd…SdS)ú*Return as a string the flags that are set.ú2,rNr¬)r rŽrGrrr Ú get_flags s zMaildirMessage.get_flagscCsdd t|ƒ¡|_dS)ú)Set the given flags and unset all others.r¥r¬N)r£r"r )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£ror¦©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£ror­rrr Ú remove_flags$ÿzMaildirMessage.remove_flagcCr¢)zSet "From " line, formatting and appending time_ if specified.NTú )rùrCrBrÃ)rr<Ztime_rrr r6us  z_mboxMMDFMessage.set_fromcCs| dd¡| dd¡S)r¤ÚStatusr¬úX-Status)r9rGrrr 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)ror.r£r"Úreplace_headerr2Z add_header)rr¨Z status_flagsZ 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¹Zstatuszx-statusrÄéûÿÿÿNz%a %b %d %H:%M:%S %Yr}r¾r¿r~rrÁ)rzr ror¦rÊr¯r£r@rµrÌÚcalendarZtimegmrùÚstrptimerkÚ OverflowErrorr?r©r6r r\r rÂr rr)rr(r¨Z maybe_daterrr rš sd       ÿÿ              ÿz_mboxMMDFMessage._explain_tor/) r˜r™ršr›rœr!r@r6r¦r©r¯r²ršrrrr r?cs   r?c@óeZdZdZdS)r z&Message with mbox-specific properties.N©r˜r™rš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ÏrGrrr r[ârIzMHMessage.get_sequencescCót|ƒ|_dS)z3Set the list of sequences that include the message.N)rJrÏ)rrurrr rwærIzMHMessage.set_sequencescCó8t|tƒr||jvr|j |¡dSdStdt|ƒƒ‚)z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)rzr†rÏrärr©rr|rrr r\êó  ÿzMHMessage.add_sequencecCó(z |j |¡WdStyYdSw)zARemove sequence from the list of sequences including the message.N)rÏr.rkrÓ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¼rrÁN)rzr ror[rÊr¯r?r r\r rÂr rr)rr(rur|rrr ršùsJ      ÿ     ÿ   ÿ   ÿ ÿzMHMessage._explain_tor/) r˜r™ršr›rœr!r[rwr\rÖrš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 rÙr!r'rrr r!%szBabylMessage.__init__cCrÐ)z'Return a list of labels on the message.N)r‚rGrrr rƒ+rIzBabylMessage.get_labelscCrÑ)z&Set the list of labels on the message.N)rJr‚)rrrrr r†/rIzBabylMessage.set_labelscCrÒ)z+Add label to list of labels on the message.zlabel must be a string: %sN)rzr†r‚rärr©rrrrr rÂ3rÔzBabylMessage.add_labelcCrÕ)z4Remove label from the list of labels on the message.N)r‚r.rkrÚrrr Ú remove_label;r×zBabylMessage.remove_labelcCs t|jƒS)z3Return a Message representation of visible headers.©r rÙrGrrr r–Bs zBabylMessage.get_visiblecCrÑ)z2Set the Message representation of visible headers.NrÜ)rZvisiblerrr r…FrIzBabylMessage.set_visiblecCsb|j ¡D]}||vr|j |||¡q|j|=qdD]}||vr.||jvr.|||j|<qdS)z9Update and/or sensibly generate a set of visible headers.)ZDateZFromzReply-ToZToZCCZSubjectN)rÙrKrÇ)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€rrÀrr·r~r¹rØr¸rºr¼r¾rÁN)rzr rorƒrÊr¯r?r r\r r…r–rÂr rr)rr(rrrrr ršUsP       ÿ     ÿ   ÿ   ÿ ÿzBabylMessage._explain_tor/)r˜r™ršr›rœr!rƒr†rÂrÛr–r…rÞršrrrr r s  r c@rÌ)rz&Message with MMDF-specific properties.NrÍrrrr rrÎrc@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)rrÚ_pos)rrÎÚposrrr r!†s z_ProxyFile.__init__cCó| ||jj¡S©z Read bytes.)Ú_readrrp©rÚsizerrr rpŽrcz_ProxyFile.readcCrárâ)rãrÚread1rärrr ræ’rcz_ProxyFile.read1cCrá)z Read a line.)rãrrrärrr r–rcz_ProxyFile.readlinecCs>g}|D]}| |¡|dur|t|ƒ8}|dkr|Sq|S)zRead multiple lines.Nr)rärÚ)rÚsizehintrZr”rrr Ú readlinesšs  €z_ProxyFile.readlinesccs | ¡}|s dS|Vq)zIterate over lines.TN)r)rr”rrr rQ¥s€üz_ProxyFile.__iter__cCr¢)zReturn the position.)rßrGrrr r­r£z_ProxyFile.tellrcCs4|dkr |j |j¡|j ||¡|j ¡|_dS)zChange position.ràN©rr€rßr©rÚoffsetÚwhencerrr r€±sz_ProxyFile.seekcCs@t|dƒrzt|jdƒr|j ¡W|`dSW|`dS|`wdS)zClose the file.rrhN)r]rrhrGrrr rh¸s   ýûz_ProxyFile.closecCs2|durd}|j |j¡||ƒ}|j ¡|_|S)z"Read size bytes using read_method.Nrvré)rråÚ read_methodrZrrr rãÁs  z_ProxyFile._readcCs|S)z$Context management protocol support.rrGrrr Ú __enter__ÊrÝz_ProxyFile.__enter__cGs | ¡dSr/)rh)rÚexcrrr Ú__exit__Îs z_ProxyFile.__exit__cCó |j ¡Sr/)rÚreadablerGrrr ròÑó z_ProxyFile.readablecCrñr/)rÚwritablerGrrr rôÔróz_ProxyFile.writablecCrñr/)rÚseekablerGrrr rõ×róz_ProxyFile.seekablecCrñr/)rrbrGrrr rbÚróz_ProxyFile.flushcCs&t|dƒsdSt|jdƒsdS|jjS)NrTrYF)r]rrYrGrrr rYÝs  z_ProxyFile.closedr/©r)r˜r™ršr›r!rprærrèrQrr€rhrãrîrðròrôrõrbÚpropertyrYrœrrrrrr rÒƒs*           rÒc@s<eZdZdZddd„Zdd„Zddd „Zd d „Zd d „ZdS)r=z&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ÒrrørGrrr rñrcz_PartialFile.tellrcCs<|dkr |j|_d}n |dkr|j|_d}t |||¡dS)z8Change position, possibly with respect to start or stop.rràrN)rørßrùrÒ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.rr4N)rùrßrÒrã)rråríZ remainingrrr rãÿs z_PartialFile._readcCst|dƒr |`dSdS)Nr)r]rrGrrr rhs ÿz_PartialFile.close)NNrö) r˜r™ršr›r!rr€rãrhrrrr r=ès   r=Tc 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ÚlockfZLOCK_EXZLOCK_NBr½r¾ZEAGAINrrrr¯r rhrr¹rºr»r¼rxrr.ÚLOCK_UN)rÎrZ dotlock_donerÃZpre_lockrrr rs\ÿ€û €üþþ  ÿþîrcCs<tr t |tj¡tj |jd¡rt |jd¡dSdS)z*Unlock file f using lockf and dot locking.rúN)rûrürýrrr¥r¯r.©rÎrrr r9s ÿrc 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îrVÚO_RDWRrh)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ÿrùrýrþrr)rrrr r Hsþr cCs(| ¡ttdƒrt | ¡¡dSdS)z0Ensure changes to file f are physically on disk.ÚfsyncN)rbr]rrÚfilenorþrrr rNs ÿrcCst|ƒ| ¡dS)z:Close file f, ensuring all changes are physically on disk.N)rrhrþrrr r°Ts r°c@rÌ)rz"Raised for module-specific errors.NrÍrrrr rZrÎrc@rÌ)rz:The specified mailbox does not exist and won't be created.NrÍrrrr r]rÎrc@rÌ)rz>The specified mailbox is not empty and deletion was requested.NrÍrrrr r`rÎrc@rÌ)rz)Another process caused an action to fail.NrÍrrrr rcrÎrc@rÌ)rz)A file appears to have an invalid format.NrÍrrrr rfrÎr)T)2r›rrùrÉrýr¾r™r‰rAZ email.messageZemail.generatorr{r;ÚtypesrrûÚ ImportErrorÚ__all__r‚rirrr r3rrrrr(r r r?r r r rrÒr=rrrr rr°Ú Exceptionrrrrrrrrr Úsp   ÿ j8DB4-3z%mqH_e '*