a ÕDOgÊ3ã@s>dZddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Z ddl Z ddl mZz ddlZWney’dZYn0gd¢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/„ZdEd0d1„Zd2d3„ZdFd4d5„Zd6d7„Zd8d9„Zd:d;„Zdd?„Z!d@Z"dGdAdB„Z#e$e%ƒZ&dS)Hrz*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/python39/lib64/python3.9/mailbox.pyÚ__init__%szMailbox.__init__cCs tdƒ‚dS)ú$Add message and return assigned key.ú&Method must be implemented by subclassN©ÚNotImplementedError©rÚmessagerrr Úadd*sz Mailbox.addcCs tdƒ‚dS)ú=Remove the keyed message; raise KeyError if it doesn't exist.r#Nr$©rÚkeyrrr Úremove.szMailbox.removecCs| |¡dS©N)r,r*rrr Ú __delitem__2szMailbox.__delitem__cCs&z| |¡Wnty Yn0dS©z'If the keyed message exists, remove it.N)r,ÚKeyErrorr*rrr Údiscard5s zMailbox.discardcCs tdƒ‚dS)ú>Replace the keyed message; raise KeyError if it doesn't exist.r#Nr$©rr+r'rrr Ú __setitem__<szMailbox.__setitem__cCs(z | |¡WSty"|YS0dS)z9Return the keyed message, or default if it doesn't exist.N)Ú __getitem__r0)rr+Údefaultrrr Úget@s  z Mailbox.getcCsN|js| |¡St | |¡¡}| |¡WdƒS1s@0YdS)z=Return the keyed message; raise KeyError if it doesn't exist.N)rÚ get_messageÚ contextlibÚclosingÚget_file)rr+Úfilerrr r5Gs zMailbox.__getitem__cCs tdƒ‚dS)ú4Return a Message representation or raise a KeyError.r#Nr$r*rrr r8OszMailbox.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_stringcCs tdƒ‚dS)z8Return a byte string representation or raise a KeyError.r#Nr$r*rrr rAZszMailbox.get_bytescCs tdƒ‚dS)ú6Return a file-like representation or raise a KeyError.r#Nr$r*rrr r;^szMailbox.get_filecCs tdƒ‚dS)úReturn an iterator over keys.r#Nr$©rrrr ÚiterkeysbszMailbox.iterkeyscCs t| ¡ƒS)zReturn a list of keys.)ÚlistrFrErrr Úkeysfsz Mailbox.keysc cs<| ¡D].}z ||}Wnty.YqYn0|VqdS)z%Return an iterator over all messages.N©rFr0©rr+Úvaluerrr Ú itervaluesjs     zMailbox.itervaluescCs| ¡Sr-)rLrErrr Ú__iter__sszMailbox.__iter__cCs t| ¡ƒS)z,Return a list of messages. Memory intensive.)rGrLrErrr ÚvaluesvszMailbox.valuesc cs@| ¡D]2}z ||}Wnty.YqYn0||fVqdS)z.Return an iterator over (key, message) tuples.NrIrJrrr Ú iteritemszs     zMailbox.iteritemscCs t| ¡ƒS)z9Return a list of (key, message) tuples. Memory intensive.)rGrOrErrr Úitemsƒsz Mailbox.itemscCs tdƒ‚dS)ú9Return True if the keyed message exists, False otherwise.r#Nr$r*rrr Ú __contains__‡szMailbox.__contains__cCs tdƒ‚dS)ú*Return a count of messages in the mailbox.r#Nr$rErrr Ú__len__‹szMailbox.__len__cCs| ¡D]}| |¡qdS)zDelete all messages.N)rHr1r*rrr Úclears z Mailbox.clearcCs2z ||}Wnty"|YS0| |¡|S)z3Delete the keyed message and return it, or default.)r0r1)rr+r6Úresultrrr Úpop”s     z Mailbox.popcCs*| ¡D]}|| |¡fStdƒ‚dS)z6Delete an arbitrary (key, message) pair and return it.zNo messages in mailboxN)rFrWr0r*rrr Úpopitems zMailbox.popitemc Csrt|dƒr| ¡}nt|dƒr(| ¡}n|}d}|D],\}}z |||<Wq4ty^d}Yq40q4|rntdƒ‚dS)z4Change the messages that correspond to certain keys.rOrPFTzNo message with key(s)N)ÚhasattrrOrPr0)rÚargÚsourceZbad_keyr+r'rrr Úupdate¤s        zMailbox.updatecCs tdƒ‚dS)ú&Write any pending changes to the disk.r#Nr$rErrr Úflushµsz Mailbox.flushcCs tdƒ‚dS)úLock the mailbox.r#Nr$rErrr Úlock¹sz Mailbox.lockcCs tdƒ‚dS)ú#Unlock the mailbox if it is locked.r#Nr$rErrr Úunlock½szMailbox.unlockcCs tdƒ‚dS)úFlush and close the mailbox.r#Nr$rErrr ÚcloseÁsz Mailbox.closecCs,z | d¡WSty&tdƒ‚Yn0dS)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ƒrvt ¡}tj ||d¡}| |¡|  d¡|  ¡}|  dt ¡}|  |¡|jrr| t ¡sr|  t ¡n‚t|tttjfƒrt|tjƒr¬t dtd¡| ¡}t|tƒrÀ| |¡}|rÐ|  dd¡}|  dt ¡}|  |¡|jrø| t ¡sø|  t ¡nòt|dƒrèt|dƒr2t d td¡|j}d }| ¡}| d ¡r\|d d …d}n| d ¡rx|d d…d}|s‚qÂ|r¤| d¡r¤d|dd …}|  dt ¡}|  |¡|}q6|jrø|rø| t ¡sø|  t ¡ntdt|ƒƒ‚d S)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 insteadNó éþÿÿÿó éÿÿÿÿóFrom s>From éúInvalid message type: %s)Ú isinstancer?r'r ÚioÚBytesIOÚ generatorÚBytesGeneratorÚflattenÚseekrlÚreplaceÚlinesepÚwriteÚ_append_newlineÚendswithÚstrÚbytesÚStringIOÚwarningsÚwarnÚDeprecationWarningÚgetvaluerhrYrmÚreadlineÚ startswithÚ TypeErrorÚtype) rr'ÚtargetZ mangle_from_rmÚgenÚdataZlastlineÚlinerrr Ú _dump_messageÒs\     ÿ        ÿ     zMailbox._dump_message)NT)N)N)N)F)'Ú__name__Ú __module__Ú __qualname__Ú__doc__r!r(r,r.r1r4r7r5r8rBrAr;rFrHrLrMrNrOrPrRrTrUrWrXr\r^r`rbrdrhr€r‘Ú classmethodrÚ__class_getitem__rrrr r"sD        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¡sŠ|r€t |jd¡|j  ¡D]}t |d¡qln t |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ÚmkdirrNrÚ_tocÚ _toc_mtimesÚ _last_readÚ _skewfactor)rÚdirnamerrrrrr r!sý  zMaildir.__init__c Cs|| ¡}z| ||¡Wn(ty@| ¡t |j¡‚Yn0t|ƒt|t ƒrz|  ¡}|j |  ¡}||j kr‚d}nd}d}tj  |j¡ |j ¡d}tj  |j|||¡}t|t ƒrÜt |jtj  |j¡| ¡f¡zJzt |j|¡Wn&ttfyt |j|¡Yn0t |j¡WnPtyv}z6t |j¡|jtjkr`td|ƒ‚n‚WYd}~n d}~00|S)r"Úršrz$Name clash with existing message: %sN)Ú _create_tmpr‘Ú BaseExceptionrdrr,ÚnameÚ _sync_closervr Ú get_subdirÚcolonÚget_inforÚbasenameÚsplitrrÚutimeÚgetatimeÚget_dateÚlinkÚAttributeErrorÚPermissionErrorÚrenameÚOSErrorÚerrnoZEEXISTr)rr'Ztmp_fileÚsubdirÚsuffixÚuniqÚdestÚerrr r($sF     ÿ ÿz Maildir.addcCs t tj |j| |¡¡¡dS©r)N)rr,rrrÚ_lookupr*rrr r,NszMaildir.removec Cs*z| |¡Wnttfy$Yn0dSr/)r,r0ÚFileNotFoundErrorr*rrr r1RszMaildir.discardc CsÊ| |¡}| |¡}| |¡}t|tƒr.|}n|}tj |¡}|j|vr`|j| |j¡d}nd}|  |¡tj  |j |¡} tj  |j |||¡} t|tƒrºt  | tj  | ¡| ¡f¡t | | ¡dS)r2rrr¦N)r¿r(rvr rrr¥r¬r¯r1rrr°r±r²r¶) rr+r'Z old_subpathZtemp_keyZ temp_subpathZdominant_subpathr¹rºZtmp_pathÚnew_pathrrr r4Zs$        ÿzMaildir.__setitem__cCs¶| |¡}ttj |j|¡dƒ*}|jr4| |¡}nt|ƒ}Wdƒn1sP0Ytj |¡\}}|  |¡|j |vr”|  | |j ¡d¡|  tj  tj |j|¡¡¡|S)r=ÚrbNrr)r¿Úopenrrrrrr r¯Ú set_subdirr¬Úset_infoÚset_dateÚgetmtime)rr+ZsubpathÚfÚmsgr¹r©rrr r8us  &  zMaildir.get_messagecCsPttj |j| |¡¡dƒ }| ¡ td¡WdƒS1sB0YdS)ú2Return a bytes representation or raise a KeyError.rÂriN) rÃrrrrr¿rlr}r~©rr+rÈrrr rA„szMaildir.get_bytescCs$ttj |j| |¡¡dƒ}t|ƒS)rCrÂ)rÃrrrrr¿Ú _ProxyFilerËrrr r;‰szMaildir.get_filec csD| ¡|jD]0}z| |¡Wnty6YqYn0|VqdS©rDN)Ú_refreshr¡r¿r0r*rrr rFŽs   zMaildir.iterkeyscCs| ¡||jvS©rQ)rÎr¡r*rrr rR˜szMaildir.__contains__cCs| ¡t|jƒS©rS)rÎÚlenr¡rErrr rTszMaildir.__len__cCsdS)ú"Write any pending changes to disk.NrrErrr r^¢sz Maildir.flushcCsdS)r_NrrErrr r`¨sz Maildir.lockcCsdS)raNrrErrr rb¬szMaildir.unlockcCsdS©rcNrrErrr rd°sz Maildir.closecCs\g}t |j¡D]F}t|ƒdkr|ddkrtj tj |j|¡¡r| |dd…¡q|S)úReturn a list of folder names.érÚ.N)rÚlistdirrrÑrÚisdirrÚappend©rrVÚentryrrr Ú list_folders´sÿzMaildir.list_folderscCs ttj |jd|¡|jddS)z/Return a Maildir instance for the named folder.rÖF©rr)rrrrrr©rÚfolderrrr Ú get_folder½sþzMaildir.get_foldercCs\tj |jd|¡}t||jd}tj |d¡}tj |¡sXt t |tj tj Bd¡¡|S)z>Create a folder and return a Maildir instance representing it.rÖ©rZ maildirfolderé¶) rrrrrrrŸrdrÃÚO_CREATÚO_WRONLY)rrßrrVZmaildirfolder_pathrrr Ú add_folderÃs ÿzMaildir.add_foldercCstj |jd|¡}t tj |d¡¡t tj |d¡¡D](}t|ƒdksX|ddkr)rr+Úfrom_rrr rBs  ÿÿz_mboxMMDF.get_stringcCsJ| |¡\}}|j |¡|s(|j ¡|j ||j ¡¡}| td¡S)r.ri)r¿rr|r‰rlrr}r~)rr+r0rrr-rrr rAs   z_mboxMMDF.get_bytescCs<| |¡\}}|j |¡|s(|j ¡t|j|j ¡|ƒS)rC)r¿rr|r‰Ú _PartialFiler)rr+r0rrrrr r;!s   z_mboxMMDF.get_filecCs d}t|tƒr| |¡}t|tƒrf| d¡rf| d¡}|dkr\|d|…}||dd…}q°|}d}nJt|tƒrˆ| ¡ d¡}d|}n(t|t j j ƒr°|  ¡}|dur°| d¡}|durÎdt  t  ¡¡ ¡}|j ¡}|j |t¡| ||j|j¡|j ¡}||fS) z1Format a message and blindly write to self._file.NrsrirrrÕr(rsFrom MAILER-DAEMON )rvr‚rhrƒrŠÚfindÚ_mboxMMDFMessageÚget_fromrer?r'r Ú get_unixfromrîÚasctimeÚgmtimerrrr~r‘Ú _mangle_from_)rr'r,ÚnewlineZauthorrrrrr r%)s0         z_mboxMMDF._install_messageN)F)F)F) r’r“r”r•r8r8rBrAr;r%rrrr r's  r'c@s2eZdZdZdZdZd dd„Zdd„Zdd „ZdS) rzA classic mbox mailbox.TNcCst|_t ||||¡dS)zInitialize an mbox mailbox.N)r r)r'r!rrrr r!Osz mbox.__init__cCs| t¡dSr"©rr~r rrr rTszmbox._post_message_hookcCsègg}}d}|j d¡|j ¡}|j ¡}| d¡rzt|ƒt|ƒkrj|r`| |ttƒ¡n | |¡| |¡d}q|s¤|r–| |ttƒ¡q¸| |¡q¸q|tkr²d}qd}qtt t ||ƒƒƒ|_ t|j ƒ|_ |j ¡|_ dS)ú0Generate key-to-(start, stop) table of contents.FrrsTN)rr|rr‰rŠrÑrÙr~ÚdictÚ enumerateÚzipr¡rr )rÚstartsÚstopsZlast_was_emptyÚline_posrrrr r$Xs.         zmbox._generate_toc)NT) r’r“r”r•r8r€r!rr$rrrr rFs  rc@s2eZdZdZd dd„Zdd„Zdd „Zd d „ZdS) rzAn MMDF mailbox.NTcCst|_t ||||¡dS)zInitialize an MMDF mailbox.N)rr)r'r!rrrr r!}sz MMDF.__init__cCs| dt¡dS)r!óNr:r rrr r‚szMMDF._pre_message_hookcCs| tdt¡dS)r#rBNr:r rrr r†szMMDF._post_message_hookcCsÞgg}}|j d¡d}|}|j ¡}|j ¡}| dt¡r˜| |¡|}|j ¡}|j ¡}|dtkr„| |ttƒ¡qžqJ|sJ| |¡qžqJq|sq qtt t ||ƒƒƒ|_ t|j ƒ|_ |j dd¡|j ¡|_ dS)r;rrBrúN)rr|r‰rrŠr~rÙrÑr<r=r>r¡rr )rr?r@Únext_posrArrrr r$Šs.          zMMDF._generate_toc)NT)r’r“r”r•r!rrr$rrrr 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¡sj|r`t |jd¡t t tj  |jd¡tj tj Btj Bd¡¡n t |jƒ‚d|_dS)zInitialize an MH instance.rœú .mh_sequencesi€FN)rr!rrrŸrr rdrÃrrãÚO_EXCLrärr rrrr r!ªsÿ z MH.__init__cCsü| ¡}t|ƒdkrd}n t|ƒd}tj |jt|ƒ¡}t|ƒ}d}z¢|j rVt |ƒzrz|  ||¡Wn8t y |j r„t |ƒt|ƒd}t |¡‚Yn0t|tƒr¸| ||¡W|j rÚt |ƒn|j rØt |ƒ0W|søt|ƒn|söt|ƒ0|S)r"rrÕFT)rHrÑÚmaxrrrrr‚rør r r‘r¨rrªr,rvr Ú_dump_sequences)rr'rHZnew_keyrÁrÈÚclosedrrr r(¶s>      ÿ  ÿ zMH.addc Csztj |jt|ƒ¡}zt|dƒ}Wn@tyb}z(|jtjkrLt d|ƒ‚n‚WYd}~nd}~00|  ¡t  |¡dS)r)rrýN) rrrrr‚rÃr·r¸rr0rdr,)rr+rrÈr½rrr r,Øs z MH.removec Csîtj |jt|ƒ¡}zt|dƒ}Wn@tyb}z(|jtjkrLt d|ƒ‚n‚WYd}~n d}~00zz|j rtt |ƒzNt  t |tj tjB¡¡| ||¡t|tƒr²| ||¡W|j rÔt|ƒn|j rÒt|ƒ0Wt|ƒn t|ƒ0dS)r2rrýN)rrrrr‚rÃr·r¸rr0r r rdräÚO_TRUNCr‘rvr rGrrª)rr+r'rrÈr½rrr r4æs(    ÿ zMH.__setitem__c Cs z@|jr$ttj |jt|ƒ¡dƒ}nttj |jt|ƒ¡dƒ}Wn@ty€}z(|jtj krjt d|ƒ‚n‚WYd}~n d}~00|J|jr–t |ƒzt |ƒ}W|jrÂt |ƒn|jrÀt |ƒ0Wdƒn1sÖ0Y| ¡ ¡D]\}}||vrì| |¡qì|S)r=rrÂrýN)r rÃrrrrr‚r·r¸rr0r r rÚ get_sequencesrPÚ add_sequence)rr+rÈr½rÉr©Úkey_listrrr r8þs*   ÿ( zMH.get_messagec Csúz@|jr$ttj |jt|ƒ¡dƒ}nttj |jt|ƒ¡dƒ}Wn@ty€}z(|jtj krjt d|ƒ‚n‚WYd}~n d}~00|`|jr–t |ƒz0|  ¡  td¡W|jr¶t|ƒWdƒSn|jrÖt|ƒ0Wdƒn1sì0YdS)rÊrrÂrýNri)r rÃrrrrr‚r·r¸rr0r rlr}r~r©rr+rÈr½rrr rAs( ýÿz MH.get_bytesc Cshzttj |jt|ƒ¡dƒ}Wn@ty^}z(|jtjkrHt d|ƒ‚n‚WYd}~n d}~00t |ƒS)rCrÂrýN) rÃrrrrr‚r·r¸rr0rÌrMrrr r;,s z MH.get_filecCsttdd„t |j¡DƒƒƒS)rDcss|]}| ¡rt|ƒVqdSr-)Úisdigitrô)Ú.0rÛrrr Ú 9sÿzMH.iterkeys..)Úiterrrr×rrErrr rF7sz MH.iterkeyscCstj tj |jt|ƒ¡¡SrÏ)rrrŸrrr‚r*rrr rR<szMH.__contains__cCstt| ¡ƒƒSrÐ)rÑrGrFrErrr rT@sz MH.__len__cCs2|js.ttj |jd¡dƒ|_t|jƒd|_dS)r_rDrTN)r rÃrrrrrr rErrr r`Ds zMH.lockcCs(|jr$t|jƒt|jƒ|`d|_dSr)r rrrªrErrr rbKs   z MH.unlockcCsdS)r]NrrErrr r^SszMH.flushcCs|jr| ¡dSrÓ)r rbrErrr rdWszMH.closecCs<g}t |j¡D]&}tj tj |j|¡¡r| |¡q|S)rÔ)rr×rrrØrrÙrÚrrr rÜ\s  zMH.list_folderscCsttj |j|¡|jddS)z+Return an MH instance for the named folder.FrÝ©rrrrrrrÞrrr ràdsÿz MH.get_foldercCsttj |j|¡|jdS)z:Create a folder and return an MH instance representing it.rárRrÞrrr råisÿz MH.add_foldercCs`tj |j|¡}t |¡}|dgkr:t tj |d¡¡n|gkrDntd|jƒ‚t |¡dS)rærDzFolder not empty: %sN)rrrrr×r,rré)rrßrÚentriesrrr ríns  zMH.remove_folderc si}ttj |jd¡dddä}t| ¡ƒ‰|D]Â}zš| d¡\}}tƒ}| ¡D]H}| ¡rn|  t |ƒ¡qRdd„| d¡Dƒ\}} |  t || d ƒ¡qR‡fd d „t |ƒDƒ||<t||ƒd krÌ||=Wq0tyðtd | ¡ƒ‚Yq00q0Wdƒn1s 0Y|S)z=Return a name-to-key-list dictionary to define each sequence.rDÚrÚASCII©Úencodingr˜css|]}t|ƒVqdSr-)rô)rOÚxrrr rP‡r(z#MH.get_sequences..ú-rÕcsg|]}|ˆvr|‘qSrr)rOr+©Zall_keysrr Ú ‰sÿz$MH.get_sequences..rz"Invalid sequence specification: %sN)rÃrrrrÚsetrHr¯rNr(rôr\ÚrangerrÑrgrÚrstrip) rZresultsrÈrr©ÚcontentsrHÚspecrrrrZr rJzs(    ÿ.zMH.get_sequencescCs ttj |jd¡ddd}zàt t |jtjtjB¡¡|  ¡D]®\}}t |ƒdkrVq@|  |d¡d}d}t t |ƒƒD]R}|d |krœ|sÆd }|  d ¡n*|r¸d}|  d ||f¡n|  d |¡|}qx|rä|  t|ƒd¡q@|  d¡q@Wt|ƒn t|ƒ0dS)z:Set sequences using the given name-to-key-list dictionary.rDzr+rUrVrr˜NFrÕTrYz%s %sz %sÚ )rÃrrrrrdr©rärIrPrÑrrr\r‚rª)rÚ sequencesrÈr©rHÚprevZ completingr+rrr Ú set_sequences’s.   zMH.set_sequencesc Cs<| ¡}d}g}| ¡D]À}|d|krÐ| ||df¡z4t tj |jt|ƒ¡tj |jt|dƒ¡¡WnFt t fy´t  tj |jt|ƒ¡tj |jt|dƒ¡¡Yn0t  tj |jt|ƒ¡¡|d7}q|d|_ t|ƒdkrôdS| ¡D]0\}}|D]"\}}||vr||| |¡<qqü| |¡dS)z?Re-name messages to eliminate numbering gaps. Invalidates keys.rrÕN)rJrFrÙrr³rrrr‚r´rµr¶ÚunlinkrrÑrPÚindexrd) rrbrcZchangesr+r©rLÚoldršrrr Úpack¯s0  ÿÿ      zMH.packcCst| ¡}| ¡}| ¡D]0\}}||vr4| |¡q||vr|| |¡=q|D]}||vrN|g||<qN| |¡dS)z;Inspect a new MHMessage and update sequences appropriately.N)rJrPrÙrfrd)rr'r+Zpending_sequencesZ all_sequencesr©rLÚsequencerrr rGÉs  zMH._dump_sequences)NT)r’r“r”r•r!r(r,r4r8rAr;rFrRrTr`rbr^rdrÜràrårírJrdrhrGrrrr r§s. "  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.>ZeditedÚansweredÚ forwardedÚdeletedÚresentÚunseenZfiledNTcCst ||||¡i|_dS)zInitialize a Babyl mailbox.N)rr!Ú_labelsrrrr r!ÞszBabyl.__init__cCs(t ||¡}t|tƒr$| ¡|j|<|S)r")rr(rvr Ú get_labelsro)rr'r+rrr r(ãs  z Babyl.addcCs"t ||¡||jvr|j|=dSr¾)rr,ror*rrr r,ês  z Babyl.removecCs*t |||¡t|tƒr&| ¡|j|<dS)r2N)rr4rvr rpror3rrr r4ðs zBabyl.__setitem__c Csò| |¡\}}|j |¡|j ¡t ¡}|j ¡}|dtks\|sHq\| | td¡¡q,t ¡}|j ¡}|tks|s|q| | td¡¡qd||j  ¡}|j  |¡}| td¡}t |  ¡|ƒ} |   |  ¡¡||jvrî|  |j|¡| S)r=ó *** EOOH ***ri)r¿rr|r‰rwrxr~rr}rrlr rˆÚ set_visibleroÚ set_labels) rr+rrÚoriginal_headersrZvisible_headersÚnÚbodyrÉrrr r8ös*        zBabyl.get_messagec Cs¬| |¡\}}|j |¡|j ¡t ¡}|j ¡}|dtks\|sHq\| | td¡¡q,|j ¡}|tksv|s\qvq\|  ¡}||j  ¡}|j  |¡}| td¡}||S)r.rqri) r¿rr|r‰rwrxr~rr}rˆrrl) rr+rrrtrZheadersrurrrr rAs        zBabyl.get_bytescCst | |¡ dt¡¡S)rCri)rwrxrAr}r~r*rrr r;(szBabyl.get_filecCs<| ¡tƒ}|j ¡D]}| |¡q| |j¡t|ƒS)z4Return a list of user-defined labels in the mailbox.)r¿r\rorNr\Údifference_updateÚ_special_labelsrG)rÚlabelsZ label_listrrr rp,s   zBabyl.get_labelscCs:gg}}|j d¡d}g}|}|j ¡}|j ¡}|dtkrœt|ƒt|ƒkrd| |ttƒ¡| |¡dd„|j ¡dd… d¡Dƒ}| |¡q|dks°|dtkrÔt|ƒt|ƒkrì| |ttƒ¡q|s| |ttƒ¡qîqtt t ||ƒƒƒ|_ tt |ƒƒ|_ t|j ƒ|_ |j dd ¡|j ¡|_dS) r;rs cSsg|]}| ¡r| ¡‘qSr)Ústrip©rOÚlabelrrr r[Csþz'Babyl._generate_toc..rÕNó,órú)rr|r‰rr~rÑrÙr¯r<r=r>r¡rorr )rr?r@rCZ label_listsrArryrrr r$5s4      ÿ  zBabyl._generate_toccCsVdt}|dt7}| ¡}dd„|Dƒ}|dd |¡t7}|d7}| |¡dS) rsBABYL OPTIONS:s Version: 5css|]}| ¡VqdSr-)rer{rrr rPXr(z*Babyl._pre_mailbox_hook..sLabels:r}r~N)r~rprr)rrÈZbabylryrrr rSs zBabyl._pre_mailbox_hookcCs| dt¡dS)r!ó Nr:r rrr r]szBabyl._pre_message_hookcCs| td¡dS)r#r~Nr:r rrr raszBabyl._post_message_hookcCsx|j ¡}t|tƒr°g}g}| ¡D]$}||jvr>| |¡q$| |¡q$|j d¡|D]}|j d| ¡¡qZ|j d¡|D]}|j d| ¡d¡q„|j t ¡n|j dt ¡t|t j j ƒrt  ¡}t j |dd¡}| |¡| d¡| ¡}|j | d t ¡¡|d ks,|süq,qü|j d t ¡t|tƒr¤t  ¡} t j | dd¡} |  | ¡¡|  ¡}|j | d t ¡¡|d ks¢|snqâqnn>| d¡| ¡}|j | d t ¡¡|d ksâ|s®qâq®| d ¡} | söqf|j |  d t ¡¡qânTt|ttt jfƒrt|t jƒrJt d td ¡| ¡}t|tƒr`| |¡}| d¡d} | ddkrâ|j |d| … d t ¡¡|j d t ¡|j |d| … d t ¡¡|j || d… d t ¡¡n(|j d t t ¡|j | d t ¡¡nXt |dƒrVt |dƒr:t dtd ¡|j!}| ¡} d}| ¡}| "d¡rl|dd…d }n| "d¡rˆ|dd…d }|j | d t ¡¡|d ks¬|sF|rÚd}|j d t ¡| | ¡nqÚqF| ¡}|sìqf| "d¡r |dd…t }n:| "d¡r(|dd…t }n| "d ¡rD|dd…t }|j |¡qÚnt#dt$|ƒƒ‚|j ¡}||fS)z0Write message contents and return (start, stop).ó1s, s,,ó r}s1,,Frrirqrrjrks rúrrNr‰rmrnTrorprqru)%rrrvr rprxrÙrrer~r?r'r rwrxryrzr{r|r‰r}Ú get_visiblerlrƒr‚r„r…r†r‡rˆrhr2rYrmrr‹rŒ)rr'rZspecial_labelsryr|Z orig_bufferZorig_generatorrZ vis_bufferZ vis_generatorrmZ body_startZ original_posZ first_passrrrr r%es¸              ÿ    ÿ       zBabyl._install_message)NT)r’r“r”r•Ú frozensetrxr!r(r,r4r8rAr;rpr$rrrr%rrrr rØs    rc@s*eZdZdZd dd„Zdd„Zdd„ZdS) r z0Message with mailbox-format-specific properties.NcCsÒt|tjjƒr4| t |¡¡t|tƒrÎ| |¡nšt|tƒrP| t  |¡¡n~t|t ƒrl| t  |¡¡nbt|t j ƒrŠ| t |¡¡nDt|dƒr¦| t |¡¡n(|dur¾tjj |¡ntdt|ƒƒ‚dS)zInitialize a Message instance.rlNru)rvr?r'r Ú_become_messageÚcopyZdeepcopyÚ _explain_torƒr@r‚Zmessage_from_stringrwÚ TextIOWrapperZmessage_from_filerYZmessage_from_binary_filer!r‹rŒr&rrr r!Ôs      zMessage.__init__cCs4t|dgƒ}|jD]}||vr|j||j|<qdS)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ƒ‚dS)z:Copy format-specific state to message insofar as possible.Nz Cannot convert to specified type)rvr r‹r&rrr r†îs zMessage._explain_to)N)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îrr r!r&rrr r!ûs zMaildirMessage.__init__cCs|jS)zReturn 'new' or 'cur'.)r‹rErrr r«szMaildirMessage.get_subdircCs(|dks|dkr||_n td|ƒ‚dS)zSet subdir to 'new' or 'cur'.ršr›z!subdir must be 'new' or 'cur': %sN)r‹rg)rr¹rrr rÄszMaildirMessage.set_subdircCs"|j d¡r|jdd…SdSdS)ú*Return as a string the flags that are set.ú2,rúNr¦)rŒrŠrErrr Ú get_flags s zMaildirMessage.get_flagscCsdd t|ƒ¡|_dS)ú)Set the given flags and unset all others.rr¦N)rrrŒ)rÚflagsrrr Ú set_flagsszMaildirMessage.set_flagscCs$| d t| ¡ƒt|ƒB¡¡dS©z.Set the given flag(s) without changing others.r¦N©r“rr\r©rÚflagrrr Úadd_flagszMaildirMessage.add_flagcCs,| ¡r(| d t| ¡ƒt|ƒ¡¡dS)ú7Unset the given string flag(s) without changing others.r¦N)rr“rr\r–rrr Ú remove_flagszMaildirMessage.remove_flagcCs|jS)zSet "From " line, formatting and appending time_ if specified.NTú )rîr7r6r«)rr0Ztime_rrr r*us z_mboxMMDFMessage.set_fromcCs| dd¡| dd¡S)rŽÚStatusr¦úX-Status)r7rErrr r}sz_mboxMMDFMessage.get_flagscCsÎt|ƒ}d\}}dD]}||vr||7}| |¡qdD]}||vr8||7}| |¡q8|d t|ƒ¡7}z| d|¡Wnty˜| d|¡Yn0z| d|¡WntyÈ| d|¡Yn0dS)r‘)r¦r¦)rŸr )r¢r£r¤r¦r­r®N)r\r,rrÚreplace_headerr0Z add_header)rr’Z status_flagsZ xstatus_flagsr—rrr r“s&    z_mboxMMDFMessage.set_flagscCs$| d t| ¡ƒt|ƒB¡¡dSr”r•r–rrr r˜—sz_mboxMMDFMessage.add_flagcCs4d|vsd|vr0| d t| ¡ƒt|ƒ¡¡dS)r™r­r®r¦Nr•r–rrr rš›sz_mboxMMDFMessage.remove_flagc CsÜt|tƒrÎt| ¡ƒ}d|vr(| d¡d|vr:| d¡d|vrL| d¡d|vr^| d¡d|vrp| d¡|d =|d =d  | ¡ ¡d d …¡}z|  t   t   |d¡¡¡WnttfyÈYn0n t|tƒrö| | ¡¡| | ¡¡nât|tƒrXt| ¡ƒ}d|vr"| d¡d|vr6| d¡d|vrJ| d¡|d =|d =n€t|tƒrºt| ¡ƒ}d|vr„| d¡d|vr˜| d¡d|vr¬| d¡|d =|d =nt|tƒrÈntdt|ƒƒ‚d S)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 %Yrnr¦r§rlrjr©)rvr r\rrÄr˜rr4r¯rÆÚcalendarZtimegmrîÚstrptimergÚ OverflowErrorr3r“r*r rKr rªr r‹rŒ)rr'r’Z maybe_daterrr r† sb       ÿ                    ÿz_mboxMMDFMessage._explain_to)N)N) r’r“r”r•rˆr!r4r*rr“r˜ršr†rrrr r3cs  r3c@seZdZdZdS)r z&Message with mbox-specific properties.N©r’r“r”r•rrrr r Ôsr 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__cCs|jdd…S)z4Return a list of sequences that include the message.N)rµrErrr rJâszMHMessage.get_sequencescCst|ƒ|_dS)z3Set the list of sequences that include the message.N)rGrµ)rrbrrr rdæszMHMessage.set_sequencescCs6t|tƒr"||jvr2|j |¡ntdt|ƒƒ‚dS)z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)rvr‚rµrÙr‹rŒ©rrirrr rKês  zMHMessage.add_sequencecCs(z|j |¡Wnty"Yn0dS)zARemove sequence from the list of sequences including the message.N)rµr,rgr¶rrr Úremove_sequenceòs zMHMessage.remove_sequencecCsFt|tƒrdt| ¡ƒ}d|vr*| d¡n| d¡| d¡d|vrP| d¡d|vrb| d¡nÞt|tƒr¾t| ¡ƒ}d|vrŽ| d¡n | d ¡d|vrª| d¡d|vr¼| d ¡n„t|tƒrâ| ¡D]}| |¡qÐn`t|t ƒr$t| ¡ƒ}d|vr|  d¡d|vrB|  d ¡nt|t ƒr2nt d t |ƒƒ‚d S)z6Copy MH-specific state to message insofar as possible.rnr›ržr§r£r¦rŸÚROr r¤rjr©N)rvr r\rJrÄr˜r3r rKr rªr r‹rŒ)rr'rbrirrr r†ùsB                      ÿzMHMessage._explain_to)N) r’r“r”r•rˆr!rJrdrKr·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.roÚ_visibleNcCsg|_tƒ|_t ||¡dS)z#Initialize a BabylMessage instance.N)ror r¹r!r&rrr r!%szBabylMessage.__init__cCs|jdd…S)z'Return a list of labels on the message.N)rorErrr rp+szBabylMessage.get_labelscCst|ƒ|_dS)z&Set the list of labels on the message.N)rGro)rryrrr rs/szBabylMessage.set_labelscCs6t|tƒr"||jvr2|j |¡ntdt|ƒƒ‚dS)z+Add label to list of labels on the message.zlabel must be a string: %sN)rvr‚rorÙr‹rŒ©rr|rrr rª3s  zBabylMessage.add_labelcCs(z|j |¡Wnty"Yn0dS)z4Remove label from the list of labels on the message.N)ror,rgrºrrr Ú remove_label;s zBabylMessage.remove_labelcCs t|jƒS)z3Return a Message representation of visible headers.©r r¹rErrr r‚BszBabylMessage.get_visiblecCst|ƒ|_dS)z2Set the Message representation of visible headers.Nr¼)rZvisiblerrr rrFszBabylMessage.set_visiblecCsb|j ¡D](}||vr*|j |||¡q |j|=q dD]$}||vr8||jvr8|||j|<q8dS)z9Update and/or sensibly generate a set of visible headers.)ZDateZFromzReply-ToZToZCCZSubjectN)r¹rHr¯)rÚheaderrrr Úupdate_visibleJs zBabylMessage.update_visiblecCsrt|tƒr~t| ¡ƒ}d|vr*| d¡n| d¡| d¡d|vsNd|vrX| d¡d|vrj| d¡d |vr|| d ¡nðt|tƒrØt| ¡ƒ}d|vr¨| d ¡n | d ¡d |vrÄ| d ¡d|vrÖ| d¡n–t|tƒrt| ¡ƒ}d|vr| d¡d|vrn| d¡nTt|t ƒrP|  |  ¡¡| ¡D]}|  |¡qThe specified mailbox is not empty and deletion was requested.Nr´rrrr r`src@seZdZdZdS)rz)Another process caused an action to fail.Nr´rrrr rcsrc@seZdZdZdS)rz)A file appears to have an invalid format.Nr´rrrr rfsr)T)2r•rrîr±ròr¸r…r…r?Z email.messageZemail.generatorrwr9Útypesrr×Ú ImportErrorÚ__all__r~rerrrr'rrrrr'r r r3r r r rrÌr1r rrørrrªÚ Exceptionrrrrrrrrr Úsl     j8DB4-3z%mqH_e' *