grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026î £ f.2ã@s0dZddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Z ddl Z yddl Z Wnek rÀdZ YnXddddddd d d d d dg ZejjdƒZGdd„dƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd „d ejjƒZGdd „d eƒZGdd„deƒZGdd „d eƒZGdd „d eƒZGd d „d eƒZ Gd!d„deƒZ!Gd"d#„d#ƒZ"Gd$d%„d%e"ƒZ#d&d'd(„Z$d)d*„Z%d+d,„Z&d-d.„Z'd/d0„Z(d1d2„Z)Gd3d4„d4e*ƒZ+Gd5d6„d6e+ƒZ,Gd7d8„d8e+ƒZ-Gd9d:„d:e+ƒZ.Gd;d<„d<e+ƒZ/dS)=zDRead/write support for Maildir, mbox, MH, Babyl, and MMDF mailboxes.éNÚMailboxÚMaildirÚmboxÚMHÚBabylÚMMDFÚMessageÚMaildirMessageÚ mboxMessageÚ MHMessageÚ BabylMessageÚ MMDFMessageÚasciic@s¢eZdZdZdddd„Zdd„Zdd „Zd d „Zd d „Zdd„Z ddd„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/„Zdd0d1„Zd2d3„Zdd4d5„Zd6d7„Zd8d9„Zd:d;„Zd<d=„Z d>d?„Z!d@Z"d@dAdB„Z#dS)Crz*A group of messages in a particular place.NTcCs.tjjtjj|ƒƒ|_||_dS)zInitialize a Mailbox instance.N)ÚosÚpathÚabspathÚ expanduserÚ_pathÚ_factory)ÚselfrÚfactoryÚcreate©rú,/opt/alt/python34/lib64/python3.4/mailbox.pyÚ__init__#s!zMailbox.__init__cCstdƒ‚dS)z$Add message and return assigned key.z&Method must be implemented by subclassN)ÚNotImplementedError)rÚmessagerrrÚadd(sz Mailbox.addcCstdƒ‚dS)z=Remove the keyed message; raise KeyError if it doesn't exist.z&Method must be implemented by subclassN)r)rÚkeyrrrÚremove,szMailbox.removecCs|j|ƒdS)N)r)rrrrrÚ __delitem__0szMailbox.__delitem__c Cs*y|j|ƒWntk r%YnXdS)z'If the keyed message exists, remove it.N)rÚKeyError)rrrrrÚdiscard3s zMailbox.discardcCstdƒ‚dS)z>Replace the keyed message; raise KeyError if it doesn't exist.z&Method must be implemented by subclassN)r)rrrrrrÚ __setitem__:szMailbox.__setitem__c Cs.y|j|ƒSWntk r)|SYnXdS)z9Return the keyed message, or default if it doesn't exist.N)Ú __getitem__r!)rrÚdefaultrrrÚget>s z Mailbox.getc CsH|js|j|ƒStj|j|ƒƒ�}|j|ƒSWdQXdS)z=Return the keyed message; raise KeyError if it doesn't exist.N)rÚ get_messageÚ contextlibÚclosingÚget_file)rrÚfilerrrr$Es  zMailbox.__getitem__cCstdƒ‚dS)z4Return a Message representation or raise a KeyError.z&Method must be implemented by subclassN)r)rrrrrr'MszMailbox.get_messagecCstj|j|ƒƒjƒ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_string)rrrrrÚ get_stringQszMailbox.get_stringcCstdƒ‚dS)z8Return a byte string representation or raise a KeyError.z&Method must be implemented by subclassN)r)rrrrrr.XszMailbox.get_bytescCstdƒ‚dS)z6Return a file-like representation or raise a KeyError.z&Method must be implemented by subclassN)r)rrrrrr*\szMailbox.get_filecCstdƒ‚dS)zReturn an iterator over keys.z&Method must be implemented by subclassN)r)rrrrÚiterkeys`szMailbox.iterkeyscCst|jƒƒS)zReturn a list of keys.)Úlistr1)rrrrÚkeysdsz Mailbox.keysc csFx?|jƒD]1}y||}Wntk r8w YnX|Vq WdS)z%Return an iterator over all messages.N)r1r!)rrÚvaluerrrÚ itervalueshs  zMailbox.itervaluescCs |jƒS)N)r5)rrrrÚ__iter__qszMailbox.__iter__cCst|jƒƒS)z,Return a list of messages. Memory intensive.)r2r5)rrrrÚvaluestszMailbox.valuesc csLxE|jƒD]7}y||}Wntk r8w YnX||fVq WdS)z.Return an iterator over (key, message) tuples.N)r1r!)rrr4rrrÚ iteritemsxs  zMailbox.iteritemscCst|jƒƒS)z9Return a list of (key, message) tuples. Memory intensive.)r2r8)rrrrÚitems�sz Mailbox.itemscCstdƒ‚dS)z9Return True if the keyed message exists, False otherwise.z&Method must be implemented by subclassN)r)rrrrrÚ __contains__…szMailbox.__contains__cCstdƒ‚dS)z*Return a count of messages in the mailbox.z&Method must be implemented by subclassN)r)rrrrÚ__len__‰szMailbox.__len__cCs(x!|jƒD]}|j|ƒq WdS)zDelete all messages.N)r3r")rrrrrÚclear�sz Mailbox.clearc Cs8y||}Wntk r&|SYnX|j|ƒ|S)z3Delete the keyed message and return it, or default.)r!r")rrr%ÚresultrrrÚpop’s    z Mailbox.popcCs7x0|jƒD]}||j|ƒfSWtdƒ‚dS)z6Delete an arbitrary (key, message) pair and return it.zNo messages in mailboxN)r1r>r!)rrrrrÚpopitem›szMailbox.popitemc Cs¡t|dƒr|jƒ}n$t|dƒr<|jƒ}n|}d}x=|D]5\}}y|||From ÚreadÚbufferzDUse of text mode files is deprecated, use a binary mode file insteadNs és ésFrom s>From ézInvalid message type: %séþÿÿÿéÿÿÿÿ)Ú isinstancer,rrÚioÚBytesIOÚ generatorÚBytesGeneratorÚflattenÚseekrMÚreplaceÚlinesepÚwriteÚ_append_newlineÚendswithÚstrÚbytesÚStringIOÚwarningsÚwarnÚDeprecationWarningÚgetvaluerKr@rNÚreadlineÚ startswithÚ TypeErrorÚtype) rrÚtargetZ mangle_from_rNÚgenÚdataZlastlineÚlinerrrÚ _dump_messageÐsZ              zMailbox._dump_message)$Ú__name__Ú __module__Ú __qualname__Ú__doc__rrrr r"r#r&r$r'r0r.r*r1r3r5r6r7r8r9r:r;r<r>r?rCrDrErFrGrKr^rorrrrr sB                         c@sHeZdZdZdZdddd„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)6rzA qmail-style Maildir mailbox.ú:NTcCs tj||||ƒitjj|jdƒd6tjj|jdƒd6tjj|jdƒd6|_tjj|jƒs×|rÅtj|jdƒx9|jj ƒD]}tj|dƒq¨Wq×t |jƒ‚ni|_ idd6dd6|_ d|_ d|_dS)zInitialize a Maildir instance.ÚtmpÚnewÚcuriÀrgš™™™™™¹?N)rrrrÚjoinrÚ_pathsÚexistsÚmkdirr7ÚNoSuchMailboxErrorÚ_tocÚ _toc_mtimesÚ _last_readÚ _skewfactor)rÚdirnamerrrrrrr s  zMaildir.__init__cCså|jƒ}y|j||ƒWn/tk rQ|jƒtj|jƒ‚YnXt|ƒt|t ƒr¥|j ƒ}|j |j ƒ}||j kr±d}q±n d}d}tj j|jƒj|j ƒd}tj j|j|||ƒ}t|t ƒr5tj|jtj j|jƒ|jƒfƒnyLttdƒrmtj|j|ƒtj|jƒntj|j|ƒWn]tk rà}z=tj|jƒ|jtjkrËtd|ƒ‚n‚WYdd}~XnX|S)z$Add message and return assigned key.ÚrvrÚlinkz$Name clash with existing message: %sN)Ú _create_tmproÚ BaseExceptionrGrrÚnameÚ _sync_closerTr Ú get_subdirÚcolonÚget_inforÚbasenameÚsplitrxrÚutimeÚgetatimeÚget_dater@rƒÚrenameÚOSErrorÚerrnoZEEXISTÚExternalClashError)rrZtmp_fileÚsubdirÚsuffixÚuniqÚdestÚerrrr s@      % % z Maildir.addcCs,tjtjj|j|j|ƒƒƒdS)z=Remove the keyed message; raise KeyError if it doesn't exist.N)rrrrxrÚ_lookup)rrrrrrIszMaildir.removec Cs0y|j|ƒWnttfk r+YnXdS)z'If the keyed message exists, remove it.N)rr!ÚFileNotFoundError)rrrrrr"MszMaildir.discardc Cs$|j|ƒ}|j|ƒ}|j|ƒ}t|tƒrE|}n|}tjj|ƒ}|j|krŒ|j|j|jƒd}nd}|j |ƒtjj |j |ƒ} tjj |j |||ƒ} t|tƒrtj | tjj | ƒ|jƒfƒntj| | ƒdS)z>Replace the keyed message; raise KeyError if it doesn't exist.rPr‚NrS)r™rrTr rrr�r‰rŒr"rxrr�rŽr�r�) rrrZ old_subpathZtemp_keyZ temp_subpathZdominant_subpathr”r•Ztmp_pathÚnew_pathrrrr#Us"    "zMaildir.__setitem__c Csã|j|ƒ}ttjj|j|ƒdƒ�.}|jrN|j|ƒ}n t|ƒ}WdQXtjj|ƒ\}}|j |ƒ|j |kr´|j |j|j ƒdƒn|j tjj tjj|j|ƒƒƒ|S)z4Return a Message representation or raise a KeyError.ÚrbNrPrS)r™Úopenrrrxrrr rŒÚ set_subdirr‰Úset_infoÚset_dateÚgetmtime)rrZsubpathÚfÚmsgr”r†rrrr'ps$   +zMaildir.get_messagec CsMttjj|j|j|ƒƒdƒ�}|jƒjtdƒSWdQXdS)z2Return a bytes representation or raise a KeyError.rœs N) r�rrrxrr™rMr[r\)rrr¢rrrr.s-zMaildir.get_bytescCs4ttjj|j|j|ƒƒdƒ}t|ƒS)z6Return a file-like representation or raise a KeyError.rœ)r�rrrxrr™Ú _ProxyFile)rrr¢rrrr*„s*zMaildir.get_filec csP|jƒx?|jD]4}y|j|ƒWntk rBwYnX|VqWdS)zReturn an iterator over keys.N)Ú_refreshr}r™r!)rrrrrr1‰s  zMaildir.iterkeyscCs|jƒ||jkS)z9Return True if the keyed message exists, False otherwise.)r¥r})rrrrrr:“s zMaildir.__contains__cCs|jƒt|jƒS)z*Return a count of messages in the mailbox.)r¥Úlenr})rrrrr;˜s zMaildir.__len__cCsdS)z"Write any pending changes to disk.Nr)rrrrrD�sz Maildir.flushcCsdS)zLock the mailbox.Nr)rrrrrE£sz Maildir.lockcCsdS)z#Unlock the mailbox if it is locked.Nr)rrrrrF§szMaildir.unlockcCsdS)zFlush and close the mailbox.Nr)rrrrrG«sz Maildir.closecCs‡g}xztj|jƒD]f}t|ƒdkr|ddkrtjjtjj|j|ƒƒr|j|dd…ƒqqW|S)zReturn a list of folder names.rPrÚ.N)rÚlistdirrr¦rÚisdirrxÚappend)rr=ÚentryrrrÚ list_folders¯s "$zMaildir.list_folderscCs/ttjj|jd|ƒd|jddƒS)z/Return a Maildir instance for the named folder.r§rrF)rrrrxrr)rÚfolderrrrÚ get_folder¸s zMaildir.get_foldercCs…tjj|jd|ƒ}t|d|jƒ}tjj|dƒ}tjj|ƒs�tjtj|tj tj Bdƒƒn|S)z>Create a folder and return a Maildir instance representing it.r§rZ maildirfolderi¶) rrrxrrrrzrGr�ÚO_CREATÚO_WRONLY)rr­rr=Zmaildirfolder_pathrrrÚ add_folder¾s zMaildir.add_foldercCs¢tjj|jd|ƒ}xwtjtjj|dƒƒtjtjj|dƒƒD];}t|ƒdks|ddkrWtd|ƒ‚qWqWWxutj|ƒD]d}|dkr¦|dkr¦|dkr¦tjjtjj||ƒƒr¦td||fƒ‚q¦q¦Wx€tj|d d ƒD]i\}}}x*|D]"}tj tjj||ƒƒq:Wx*|D]"}tj tjj||ƒƒqgWq$Wtj |ƒd S) z-Delete the named folder, which must be empty.r§rvrwrPrzFolder contains message(s): %sruz%Folder contains subdirectory '%s': %sÚtopdownFN) rrrxrr¨r¦Ú NotEmptyErrorr©ÚwalkrÚrmdir)rr­rr«ÚrootÚdirsÚfilesrrrÚ remove_folderÈs #"$!%   $zMaildir.remove_foldercCsƒtjƒ}xptjtjj|jdƒƒD]M}tjj|jd|ƒ}|tjj|ƒdkr.tj|ƒq.q.WdS)zDelete old files in "tmp".rui@úN)Útimerr¨rrxrrŽr)rÚnowr«rrrrÚcleanÛs  (z Maildir.cleanrPcCstjƒ}tjƒ}d|kr9|jddƒ}nd|krZ|jddƒ}ndt|ƒt|ddƒtjƒtj|f}tj j |j d|ƒ}ytj |ƒWnDt k rtjd7_yt|ƒSWntk rýYnXYnXtd |ƒ‚d S) z=Create a file in the tmp subdirectory and open and return it.ú/z\057rtz\072z%s.M%sP%sQ%s.%srPg€„.Aruz&Name clash prevented file creation: %sN)rºÚsocketÚ gethostnamer[ÚintrÚgetpidrÚ_countrrxrÚstatršÚ_create_carefullyÚFileExistsErrorr“)rr»Zhostnamer–rrrrr„ås&    &   zMaildir._create_tmpcCs?tjƒ|jd|jkr‰d}xS|jD]H}tjj|j|ƒ}||j|krkd}n||j|Replace the keyed message; raise KeyError if it doesn't exist.TN)r™rÕr}rÑ)rrrrrrr#fs z_singlefileMailbox.__setitem__ccs |jƒ|jjƒDdHdS)zReturn an iterator over keys.N)r™r}r3)rrrrr1ls z_singlefileMailbox.iterkeyscCs|jƒ||jkS)z9Return True if the keyed message exists, False otherwise.)r™r})rrrrrr:qs z_singlefileMailbox.__contains__cCs|jƒt|jƒS)z*Return a count of messages in the mailbox.)r™r¦r})rrrrr;vs z_singlefileMailbox.__len__cCs&|js"t|jƒd|_ndS)zLock the mailbox.TN)rÓÚ _lock_filerÏ)rrrrrE{s  z_singlefileMailbox.lockcCs&|jr"t|jƒd|_ndS)z#Unlock the mailbox if it is locked.FN)rÓÚ _unlock_filerÏ)rrrrrF�s  z_singlefileMailbox.unlockc Csš|js/|jr+t|jƒd|_ndS|jdk sDt‚|jjddƒ|jjƒ}||jkr‘t d|j|fƒ‚nt |j ƒ}yëi}|j |ƒxÂt |jjƒƒD]«}|j|\}}|jj|ƒ|j|ƒ|jƒ}xC|jjtd||jjƒƒƒ}|sCPn|j|ƒqW||jƒf||<|j|ƒqÌW|jƒ|_Wn%|jƒtj|jƒ‚YnXt|ƒ|jjƒtj|j ƒj} tj|j| ƒytj|j|j ƒWn8tk rFtj|j ƒtj|j|j ƒYnXt|j dƒ|_||_d|_d|_|jr–t |jddƒndS) z"Write any pending changes to disk.FNrrOz4Size of mailbox file changed (expected %i, found %i)izrb+Údotlock)!rÑrÒÚ _sync_flushrÏr}ÚAssertionErrorrZÚtellrÔr“Ú_create_temporaryrÚ_pre_mailbox_hookÚsortedr3Ú_pre_message_hookrMÚminr]Ú_post_message_hookrGrrr†r‡rÃÚst_modeÚchmodr�rÅr�rÓrÖ) rZcur_lenZnew_fileZnew_tocrÚstartÚstopZ new_startrNÚmoderrrrD‡s`               z_singlefileMailbox.flushcCsdS)z,Called before writing the mailbox to file f.Nr)rr¢rrrrÝÇsz$_singlefileMailbox._pre_mailbox_hookcCsdS)z-Called before writing each message to file f.Nr)rr¢rrrrßËsz$_singlefileMailbox._pre_message_hookcCsdS)z,Called after writing each message to file f.Nr)rr¢rrrráÏsz%_singlefileMailbox._post_message_hookcCsAz|jƒWdz|jr*|jƒnWd|jjƒXXdS)zFlush and close the mailbox.N)rDrÓrFrÏrG)rrrrrGÓs  z_singlefileMailbox.closec Csc|jdkr|jƒn|dk r_y|j|SWq_tk r[td|ƒ‚Yq_XndS)z'Return (start, stop) or raise KeyError.NzNo message with key: %s)r}Ú _generate_tocr!)rrrrrr™Þs   z_singlefileMailbox._lookupc CsÒ|jjddƒ|jjƒ}t|jƒdkrT|j rT|j|jƒny3|j|jƒ|j|ƒ}|j |jƒWn%t k r®|jj |ƒ‚YnX|jj ƒ|jjƒ|_ |S)z;Append message to mailbox and return (start, stop) offsets.rrO)rÏrZrÛr¦r}rÑrÝrßÚ_install_messagerár…ÚtruncaterDrÔ)rrZbeforeZoffsetsrrrrÕès  z"_singlefileMailbox._append_message)rprqrrrsrrrr#r1r:r;rErFrDrÝrßrárGr™rÕrrrrrË<s"         @     rËc@saeZdZdZdZdd„Zddd„Zddd „Zdd d „Zd d „Z dS)Ú _mboxMMDFzAn mbox or MMDF mailbox.TcCsž|j|ƒ\}}|jj|ƒ|jjƒjtdƒ}|jj||jjƒƒ}|j|jtdƒƒ}|j |dd…j dƒƒ|S)z4Return a Message representation or raise a KeyError.ós rQNr) r™rÏrZrgr[r\rMrÛÚ_message_factoryÚset_fromÚdecode)rrräråÚ from_lineÚstringr£rrrr's z_mboxMMDF.get_messageFcCs"tj|j|ƒƒjd|ƒS)z3Return a string representation or raise a KeyError.Úunixfrom)r,r-r.r/)rrÚfrom_rrrr0sz_mboxMMDF.get_stringcCsj|j|ƒ\}}|jj|ƒ|s;|jjƒn|jj||jjƒƒ}|jtdƒS)z3Return a string representation or raise a KeyError.s )r™rÏrZrgrMrÛr[r\)rrròrärårðrrrr.s z_mboxMMDF.get_bytescCsW|j|ƒ\}}|jj|ƒ|s;|jjƒnt|j|jjƒ|ƒS)z6Return a file-like representation or raise a KeyError.)r™rÏrZrgÚ _PartialFilerÛ)rrròrärårrrr*s z_mboxMMDF.get_filecCsŒd}t|tƒr'|j|ƒ}nt|tƒr–|jdƒr–|jdƒ}|dkr‡|d|…}||dd…}q |}d}nst|tƒrÇ|jƒjdƒ}d|}nBt|t j j ƒr |j ƒ}|dk r |jdƒ}q n|dkr7dt jt jƒƒjƒ}n|jjƒ}|jj|tƒ|j||j|jƒ|jjƒ}||fS) z1Format a message and blindly write to self._file.NsFrom s rPrërsFrom MAILER-DAEMON rS)rTr`rKrarhÚfindÚ_mboxMMDFMessageÚget_fromrHr,rrÚ get_unixfromrºÚasctimeÚgmtimerÏrÛr]r\roÚ _mangle_from_)rrrïÚnewlineZauthorrärårrrrè$s0      "z_mboxMMDF._install_messageN) rprqrrrsrúr'r0r.r*rèrrrrrêÿs   rêc@sLeZdZdZdZdZdddd„Zdd„Zdd „ZdS) rzA classic mbox mailbox.TNcCs#t|_tj||||ƒdS)zInitialize an mbox mailbox.N)r rìrêr)rrrrrrrrJs z mbox.__init__cCs|jtƒdS)z,Called after writing each message to file f.N)r]r\)rr¢rrrráOszmbox._post_message_hookcCsMgg}}d}|jjdƒxá|jjƒ}|jjƒ}|jdƒr±t|ƒt|ƒkr›|r‹|j|ttƒƒq›|j|ƒn|j|ƒd}q&|sè|r×|j|ttƒƒn |j|ƒPq&|tkrýd}q&d}q&Wtt t ||ƒƒƒ|_ t|j ƒ|_ |jjƒ|_ dS)z0Generate key-to-(start, stop) table of contents.FrsFrom TN)rÏrZrÛrgrhr¦rªr\ÚdictÚ enumerateÚzipr}rÐrÔ)rÚstartsÚstopsZlast_was_emptyÚline_posrnrrrrçSs0       zmbox._generate_toc) rprqrrrsrúr^rrárçrrrrrAs  c@sLeZdZdZdddd„Zdd„Zdd „Zd d „ZdS) rzAn MMDF mailbox.NTcCs#t|_tj||||ƒdS)zInitialize an MMDF mailbox.N)r rìrêr)rrrrrrrrxs z MMDF.__init__cCs|jdtƒdS)z-Called before writing each message to file f.sN)r]r\)rr¢rrrrß}szMMDF._pre_message_hookcCs|jtdtƒdS)z,Called after writing each message to file f.sN)r]r\)rr¢rrrrá�szMMDF._post_message_hookcCsAgg}}|jjdƒd}xÂ|}|jjƒ}|jjƒ}|jdtƒrÚ|j|ƒxw|}|jjƒ}|jjƒ}|dtkr¼|j|ttƒƒPqm|sm|j|ƒPqmqmWq&|s&Pq&q&Wtt t ||ƒƒƒ|_ t|j ƒ|_ |jjddƒ|jjƒ|_ dS)z0Generate key-to-(start, stop) table of contents.rsrON)rÏrZrgrÛrhr\rªr¦rürýrþr}rÐrÔ)rrÿrÚnext_posrrnrrrrç…s2    zMMDF._generate_toc)rprqrrrsrrßrárçrrrrrus   c@s$eZdZdZdddd„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)0rzAn MH mailbox.NTcCs¥tj||||ƒtjj|jƒs˜|r†tj|jdƒtjtjtjj |jdƒtj tj Btj Bdƒƒq˜t |jƒ‚nd|_dS)zInitialize an MH instance.iÀz .mh_sequencesi€FN)rrrrrzrr{rGr�rxr¯ÚO_EXCLr°r|rÓ)rrrrrrrr¥s!!z MH.__init__cCs;|jƒ}t|ƒdkr'd}nt|ƒd}tjj|jt|ƒƒ}t|ƒ}d}z¹|j r€t |ƒnz…y|j ||ƒWnHt k rá|j r½t |ƒnt|ƒd}tj|ƒ‚YnXt|tƒr|j||ƒnWd|j rt |ƒnXWd|s6t|ƒnX|S)z$Add message and return assigned key.rrPFTN)r3r¦Úmaxrrrxrr`rÄrÓrÖror…r×r‡rrTr Ú_dump_sequences)rrr3Znew_keyr›r¢Úclosedrrrr±s6           zMH.addcCsœtjj|jt|ƒƒ}yt|dƒ}WnMtk r€}z-|jtjkrkt d|ƒ‚n‚WYdd}~XnX|j ƒtj |ƒdS)z=Remove the keyed message; raise KeyError if it doesn't exist.zrb+zNo message with key: %sN) rrrxrr`r�r‘r’rÌr!rGr)rrrr¢r˜rrrrÓs z MH.removecCs tjj|jt|ƒƒ}yt|dƒ}WnMtk r€}z-|jtjkrkt d|ƒ‚n‚WYdd}~XnXz�|j ršt |ƒnzYtj tj|tj tjBƒƒ|j||ƒt|tƒrò|j||ƒnWd|j r t|ƒnXWdt|ƒXdS)z>Replace the keyed message; raise KeyError if it doesn't exist.zrb+zNo message with key: %sN)rrrxrr`r�r‘r’rÌr!rÓrÖrGr°ÚO_TRUNCrorTr rr×r‡)rrrrr¢r˜rrrr#ás$  # zMH.__setitem__c Cs>y^|jr6ttjj|jt|ƒƒdƒ}n'ttjj|jt|ƒƒdƒ}WnMtk r­}z-|jtj kr˜t d|ƒ‚n‚WYdd}~XnX|�E|jrËt |ƒnzt |ƒ}Wd|jrôt |ƒnXWdQXx<|jƒjƒD](\}}||kr|j|ƒqqW|S)z4Return a Message representation or raise a KeyError.zrb+rœzNo message with key: %sN)rÓr�rrrxrr`r‘r’rÌr!rÖr r×Ú get_sequencesr9Ú add_sequence)rrr¢r˜r£r†Úkey_listrrrr'ùs& *+    zMH.get_messagec Cs y^|jr6ttjj|jt|ƒƒdƒ}n'ttjj|jt|ƒƒdƒ}WnMtk r­}z-|jtj kr˜t d|ƒ‚n‚WYdd}~XnX|�O|jrËt |ƒnz|j ƒj tdƒSWd|jrþt|ƒnXWdQXdS)z2Return a bytes representation or raise a KeyError.zrb+rœzNo message with key: %sNs )rÓr�rrrxrr`r‘r’rÌr!rÖrMr[r\r×)rrr¢r˜rrrr.s *+   z MH.get_bytescCs…y+ttjj|jt|ƒƒdƒ}WnMtk rz}z-|jtjkret d|ƒ‚n‚WYdd}~XnXt |ƒS)z6Return a file-like representation or raise a KeyError.rœzNo message with key: %sN) r�rrrxrr`r‘r’rÌr!r¤)rrr¢r˜rrrr*'s+z MH.get_filecCs)ttdd„tj|jƒDƒƒƒS)zReturn an iterator over keys.css'|]}|jƒrt|ƒVqdS)N)ÚisdigitrÀ)Ú.0r«rrrú 4szMH.iterkeys..)ÚiterrÞrr¨r)rrrrr12sz MH.iterkeyscCs(tjjtjj|jt|ƒƒƒS)z9Return True if the keyed message exists, False otherwise.)rrrzrxrr`)rrrrrr:7szMH.__contains__cCstt|jƒƒƒS)z*Return a count of messages in the mailbox.)r¦r2r1)rrrrr;;sz MH.__len__cCsJ|jsFttjj|jdƒdƒ|_t|jƒd|_ndS)zLock the mailbox.z .mh_sequenceszrb+TN)rÓr�rrrxrrÏrÖ)rrrrrE?s $ zMH.lockcCs9|jr5t|jƒt|jƒ|`d|_ndS)z#Unlock the mailbox if it is locked.FN)rÓr×rÏr‡)rrrrrFFs    z MH.unlockcCsdS)z&Write any pending changes to the disk.Nr)rrrrrDNszMH.flushcCs|jr|jƒndS)zFlush and close the mailbox.N)rÓrF)rrrrrGRs zMH.closecCs[g}xNtj|jƒD]:}tjjtjj|j|ƒƒr|j|ƒqqW|S)zReturn a list of folder names.)rr¨rrr©rxrª)rr=r«rrrr¬Ws $zMH.list_folderscCs+ttjj|j|ƒd|jddƒS)z+Return an MH instance for the named folder.rrF)rrrrxrr)rr­rrrr®_sz MH.get_foldercCs%ttjj|j|ƒd|jƒS)z:Create a folder and return an MH instance representing it.r)rrrrxrr)rr­rrrr±dsz MH.add_foldercCsˆtjj|j|ƒ}tj|ƒ}|dgkrUtjtjj|dƒƒn"|gkrdntd|jƒ‚tj|ƒdS)z-Delete the named folder, which must be empty.z .mh_sequenceszFolder not empty: %sN)rrrxrr¨rr³rµ)rr­rZentriesrrrr¹is zMH.remove_folderc sbi}ttjj|jdƒdddƒ�/}t|jƒƒ‰x|D] }yÚ|jdƒ\}}tƒ}xr|jƒD]d}|jƒr¥|j t |ƒƒq}dd„|jdƒDƒ\}} |j t || d ƒƒq}W‡fd d †t |ƒDƒ||.ú-rPcs"g|]}|ˆkr|‘qSrr)r r)Úall_keysrrú „s z$MH.get_sequences..rz"Invalid sequence specification: %sN)r�rrrxrÚsetr3rŒr rrÀrCÚrangerÞr¦rJÚ FormatErrorÚrstrip) rZresultsr¢rnr†Úcontentsr3Úspecrärår)rrrus&*   "# zMH.get_sequencesc Cskttjj|jdƒdddƒ}z2tjtj|jtjtjBƒƒx|j ƒD]÷\}}t |ƒdkr�q]n|j |dƒd}d}x†t t |ƒƒD]r}|d |kræ|sd }|j d ƒqn7|r d}|j d ||fƒn|j d |ƒ|}q±W|rG|j t|ƒdƒq]|j dƒq]WWdt|ƒXdS)z:Set sequences using the given name-to-key-list dictionary.z .mh_sequenceszr+rrrrtNFrPTrz%s %sz %sÚ )r�rrrxrrGr†r°rr9r¦r]rÞrr`r‡)rÚ sequencesr¢r†r3ÚprevZ completingrrrrÚ set_sequences�s.'& zMH.set_sequencesc Cs¬|jƒ}d}g}x|jƒD]ù}|d|kr|j||dfƒttdƒrÍtjtjj|jt |ƒƒtjj|jt |dƒƒƒtj tjj|jt |ƒƒƒqtj tjj|jt |ƒƒtjj|jt |dƒƒƒn|d7}q%W|d|_ t |ƒdkrEdSxS|jƒD]E\}}x6|D].\}}||kre|||j|ƒReplace the keyed message; raise KeyError if it doesn't exist.N)rËr#rTr r-r,)rrrrrrr#êszBabyl.__setitem__c Csv|j|ƒ\}}|jj|ƒ|jjƒtjƒ}xG|jjƒ}|dtksg| rkPn|j|jtdƒƒqAWtjƒ}xC|jjƒ}|tks¹| r½Pn|j|jtdƒƒq—W||jj ƒ}|dksÿt ‚|jj |ƒ}|jtdƒ}t |j ƒ|ƒ} | j|j ƒƒ||jkrr| j|j|ƒn| S)z4Return a Message representation or raise a KeyError.s *** EOOH ***s r)r™rÏrZrgrUrVr\r]r[rÛrÚrMr rfÚ set_visibler,Ú set_labels) rrräråÚoriginal_headersrnZvisible_headersÚnZbodyr£rrrr'ðs0   zBabyl.get_messagec Cs|j|ƒ\}}|jj|ƒ|jjƒtjƒ}xG|jjƒ}|dtksg| rkPn|j|jtdƒƒqAWx*|jjƒ}|tks­| r‹Pq‹q‹W|j ƒ}||jj ƒ}|dksæt ‚|jj |ƒ}|jtdƒ}||S)z3Return a string representation or raise a KeyError.s *** EOOH ***s r) r™rÏrZrgrUrVr\r]r[rfrÛrÚrM) rrrärår0rnZheadersr1rmrrrr. s&   zBabyl.get_bytescCs"tj|j|ƒjdtƒƒS)z6Return a file-like representation or raise a KeyError.s )rUrVr.r[r\)rrrrrr*"szBabyl.get_filecCsT|jƒtƒ}x$|jjƒD]}|j|ƒq#W|j|jƒt|ƒS)z4Return a list of user-defined labels in the mailbox.)r™rr,r7rCÚdifference_updateÚ_special_labelsr2)rÚlabelsZ label_listrrrr-&s   zBabyl.get_labelscCsÂgg}}|jjdƒd}g}x(|}|jjƒ}|jjƒ}|dtkrÞt|ƒt|ƒkr’|j|ttƒƒn|j|ƒdd„|jjƒdd…jdƒDƒ}|j|ƒq,|dksú|dtkr/t|ƒt|ƒkrP|j|ttƒƒqPq,|s,|j|ttƒƒPq,q,Wtt t ||ƒƒƒ|_ tt |ƒƒ|_ t|j ƒ|_ |jjdd ƒ|jjƒ|_dS) z0Generate key-to-(start, stop) table of contents.rs cSs(g|]}|jƒr|jƒ‘qSr)Ústrip)r Úlabelrrrr=s z'Babyl._generate_toc..rPNó,srO)rÏrZrgrÛr\r¦rªrŒrürýrþr}r,rÐrÔ)rrÿrrZ label_listsrrnr4rrrrç/s4   &zBabyl._generate_toccCsmdt}|dt7}|jƒ}dd„|Dƒ}|ddj|ƒt7}|d7}|j|ƒdS) z,Called before writing the mailbox to file f.sBABYL OPTIONS:s Version: 5css|]}|jƒVqdS)N)rH)r r6rrrr Rsz*Babyl._pre_mailbox_hook..sLabels:r7sN)r\r-rxr])rr¢Zbabylr4rrrrÝMs   zBabyl._pre_mailbox_hookcCs|jdtƒdS)z-Called before writing each message to file f.s N)r]r\)rr¢rrrrßWszBabyl._pre_message_hookcCs|jtdƒdS)z,Called after writing each message to file f.sN)r]r\)rr¢rrrrá[szBabyl._post_message_hookcCs|jjƒ}t|tƒrúg}g}x@|jƒD]2}||jkr\|j|ƒq7|j|ƒq7W|jjdƒx(|D] }|jjd|jƒƒq„W|jjdƒx,|D]$}|jjd|jƒdƒq¿W|jjt ƒn|jjdt ƒt|t j j ƒrÜt jƒ}t jj|ddƒ}|j|ƒ|jdƒxC|jƒ}|jj|jd t ƒƒ|d ksŸ| rdPqdqdW|jjd t ƒt|tƒrJt jƒ} t jj| ddƒ} | j|jƒƒx™| jƒ}|jj|jd t ƒƒ|d ks?| rPqqWnS|jdƒxC|jƒ}|jj|jd t ƒƒ|d ks•| rZPqZqZWxX|jd ƒ} | s¹Pn|jj| jd t ƒƒq Wnt|ttt jfƒr/t|t jƒr+tjd td ƒ|jƒ}nt|tƒrL|j|ƒ}n|jdƒd} | ddkrø|jj|d| …jd t ƒƒ|jjd t ƒ|jj|d| …jd t ƒƒ|jj|| d…jd t ƒƒqø|jjd t t ƒ|jj|jd t ƒƒnÉt |dƒrât |dƒrltjdtd ƒ|j!}n|jƒ} d}x¿|jƒ}|j"dƒr³|dd…d }n&|j"dƒrÙ|dd…d }n|jj|jd t ƒƒ|d ks| r�|r8d}|jjd t ƒ|j| ƒq<Pq�q�Wxµ|jƒ}|sYPn|j"dƒr|dd…t }nL|j"dƒr¥|dd…t }n&|j"d ƒrË|dd…t }n|jj|ƒqCWnt#dt$|ƒƒ‚|jjƒ}||fS)z0Write message contents and return (start, stop).ó1s, s,,ó r7s1,,Frs s *** EOOH ***iz8Use of StringIO input is deprecated, use BytesIO insteadrLs rOrPNrgrNzDUse of text mode files is deprecated, use a binary mode file insteadTs s zInvalid message type: %srSrRrSrRrSrS)%rÏrÛrTr r-r3rªr]rHr\r,rrrUrVrWrXrYrZrgr[Ú get_visiblerMrar`rbrcrdrerfrKrôr@rNr_rirj)rrräZspecial_labelsr4r6Z orig_bufferZorig_generatorrnZ vis_bufferZ vis_generatorrNZ body_startZ original_posZ first_passrårrrrè_sÀ  "         #  &&)      zBabyl._install_message)r%r&r'r(r)r*r+)rprqrrrsÚ frozensetr3rrrr#r'r.r*r-rçrÝrßrárèrrrrrÒs           c@s=eZdZdZddd„Zdd„Zdd„ZdS) rz0Message with mailbox-format-specific properties.NcCs,t|tjjƒrM|jtj|ƒƒt|tƒr(|j|ƒq(nÛt|tƒru|jtj |ƒƒn³t|t ƒr�|jtj |ƒƒn‹t|t j ƒrÈ|jtj|ƒƒn`t|dƒrð|jtj|ƒƒn8|dkrtjjj|ƒntdt|ƒƒ‚dS)zInitialize a Message instance.rMNzInvalid message type: %s)rTr,rrÚ_become_messageÚcopyÚdeepcopyÚ _explain_torar-r`Zmessage_from_stringrUÚ TextIOWrapperZmessage_from_filer@Zmessage_from_binary_filerrirj)rrrrrrÎs zMessage.__init__cCsMt|dgƒ}x4|jD])}||kr|j||j|ntdt|ƒƒ‚dS)z;Copy Maildir-specific state to message insofar as possible.ÚSÚRrwÚOÚTÚDÚFÚAz MAILER-DAEMONr%ÚrepliedÚflaggedr&r(ÚPr)z$Cannot convert to specified type: %sN)rTr rIrGržrˆr r�rõrrKrírºrùr r r Ú add_labelrrirj)rrrHrrrr?1sN    "       zMaildirMessage._explain_to)rprqrrrsrArrˆržrGrIrKrLr�r rŠrŸr?rrrrr ðs           c@s…eZdZdZdgZddd„Zdd„Zddd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dS)rõz/Message with mbox- or MMDF-specific properties.Ú_fromNcCs}|jddƒt|tjjƒri|jƒ}|dk ri|jdƒri|j|dd…ƒqintj||ƒdS)z'Initialize an mboxMMDFMessage instance.z MAILER-DAEMONTNzFrom rQ)rírTr,rrr÷rhr)rrrñrrrrbs  z_mboxMMDFMessage.__init__cCs|jS)z Return contents of "From " line.)rZ)rrrrröksz_mboxMMDFMessage.get_fromcCsN|dk rA|dkr'tjƒ}n|dtj|ƒ7}n||_dS)z>Set "From " line, formatting and appending time_ if specified.NTú )rºrùrørZ)rròZtime_rrrríos   z_mboxMMDFMessage.set_fromcCs |jddƒ|jddƒS)z*Return as a string the flags that are set.ÚStatusr‚zX-Status)r&)rrrrrGwsz_mboxMMDFMessage.get_flagscCst|ƒ}d \}}x4d D],}||kr||7}|j|ƒqqWx4d D],}||krV||7}|j|ƒqVqVW|djt|ƒƒ7}y|jd|ƒWn"tk r×|jd|ƒYnXy|jd|ƒWn"tk r|jd|ƒYnXd S) z)Set the given flags and unset all others.r‚rPrQrSrTrUr\zX-StatusN)r‚r‚)rPrQ)rSrTrU)rrrxrÞÚreplace_headerr!Z add_header)rrHZ status_flagsZ xstatus_flagsrJrrrrI{s&          z_mboxMMDFMessage.set_flagscCs0|jdjt|jƒƒt|ƒBƒƒdS)z.Set the given flag(s) without changing others.r‚N)rIrxrrG)rrJrrrrK‘sz_mboxMMDFMessage.add_flagcCsKd|ksd|krG|jdjt|jƒƒt|ƒƒƒndS)z7Unset the given string flag(s) without changing others.r\zX-Statusr‚N)rIrxrrG)rrJrrrrL•sz_mboxMMDFMessage.remove_flagc Cs”t|tƒr$t|jƒƒ}d|kr=|jdƒnd|krY|jdƒnd|kru|jdƒnd|kr‘|jdƒnd|kr­|jdƒn|d =|d =d j|jƒjƒdd …ƒ}y&|j t j t j |dƒƒƒWq�ttfk r Yq�Xnlt|tƒr\|j|jƒƒ|j|jƒƒn4t|tƒrât|jƒƒ}d|kr™|jdƒnd|krµ|jdƒnd|krÑ|jdƒn|d =|d =n®t|tƒrht|jƒƒ}d|kr|jdƒnd|kr;|jdƒnd|krW|jdƒn|d =|d =n(t|tƒrzntdt|ƒƒ‚d S)zACopy mbox- or MMDF-specific state to message insofar as possible.rQrwrTrUrPrOrSrRZstatuszx-statusr[rQNz%a %b %d %H:%M:%S %Yr%rVrWr&r(z$Cannot convert to specified type: %séûÿÿÿ)rTr rrGržrKrxrörŒr ÚcalendarZtimegmrºZstrptimerJÚ OverflowErrorrõrIrír r r rYrrirj)rrrHZ maybe_daterrrr?šs^     %        z_mboxMMDFMessage._explain_to) rprqrrrsrArrörírGrIrKrLr?rrrrrõ]s       rõc@seZdZdZdS)r z&Message with mbox-specific properties.N)rprqrrrsrrrrr Îs c@sjeZdZdZdgZddd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dS)r z$Message with MH-specific properties.Ú _sequencesNcCsg|_tj||ƒdS)z!Initialize an MHMessage instance.N)rarr)rrrrrr×s zMHMessage.__init__cCs|jdd…S)z4Return a list of sequences that include the message.N)ra)rrrrrÜszMHMessage.get_sequencescCst|ƒ|_dS)z3Set the list of sequences that include the message.N)r2ra)rrrrrràszMHMessage.set_sequencescCsNt|tƒr4||jkrJ|jj|ƒqJntdt|ƒƒ‚dS)z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)rTr`rarªrirj)rr$rrrr äszMHMessage.add_sequencec Cs-y|jj|ƒWntk r(YnXdS)zARemove sequence from the list of sequences including the message.N)rarrJ)rr$rrrÚremove_sequenceìs zMHMessage.remove_sequencecCsÕt|tƒr’t|jƒƒ}d|kr=|jdƒn|jdƒ|jdƒd|krs|jdƒnd|krÑ|jdƒqÑn?t|tƒrt|jƒƒ}d|krÏ|jdƒn |jd ƒd|krø|jdƒnd|krÑ|jd ƒqÑnºt|tƒrMx¨|jƒD]}|j|ƒq3Wn„t|t ƒr©t|jƒƒ}d|krŠ|j dƒnd|krÑ|j d ƒqÑn(t|t ƒr»nt d t |ƒƒ‚d S)z6Copy MH-specific state to message insofar as possible.r%rwrOrWrTrVrPÚROrQrUr(z$Cannot convert to specified type: %sN)rTr rrržrKrõr r r rYrrirj)rrrr$rrrr?ós@           zMHMessage._explain_to) rprqrrrsrArrrr rbr?rrrrr Òs      c@s‘eZdZdZddgZddd„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,Ú_visibleNcCs)g|_tƒ|_tj||ƒdS)z$Initialize an BabylMessage instance.N)r,rrdr)rrrrrrs  zBabylMessage.__init__cCs|jdd…S)z'Return a list of labels on the message.N)r,)rrrrr-%szBabylMessage.get_labelscCst|ƒ|_dS)z&Set the list of labels on the message.N)r2r,)rr4rrrr/)szBabylMessage.set_labelscCsNt|tƒr4||jkrJ|jj|ƒqJntdt|ƒƒ‚dS)z+Add label to list of labels on the message.zlabel must be a string: %sN)rTr`r,rªrirj)rr6rrrrY-szBabylMessage.add_labelc Cs-y|jj|ƒWntk r(YnXdS)z4Remove label from the list of labels on the message.N)r,rrJ)rr6rrrÚ remove_label5s zBabylMessage.remove_labelcCs t|jƒS)z3Return a Message representation of visible headers.)rrd)rrrrr:<szBabylMessage.get_visiblecCst|ƒ|_dS)z2Set the Message representation of visible headers.N)rrd)rZvisiblerrrr.@szBabylMessage.set_visiblecCsŽxG|jjƒD]6}||kr<|jj|||ƒq|j|=qWx=dD]5}||krQ||jkrQ|||j|t|dƒr:t|jdƒr1|jjƒn|`ndS)zClose the file.rÏrGN)r@rÏrG)rrrrrG²sz_ProxyFile.closecCsJ|dkrd}n|jj|jƒ||ƒ}|jjƒ|_|S)z"Read size bytes using read_method.NrPrS)rÏrZrnrÛ)rrqÚ read_methodr=rrrrp¹s    z_ProxyFile._readcCs|S)z$Context management protocol support.r)rrrrÚ __enter__Âsz_ProxyFile.__enter__cGs|jƒdS)N)rG)rÚexcrrrÚ__exit__Æsz_ProxyFile.__exit__cCs |jjƒS)N)rÏÚreadable)rrrrr{Ész_ProxyFile.readablecCs |jjƒS)N)rÏÚwritable)rrrrr|Ìsz_ProxyFile.writablecCs |jjƒS)N)rÏÚseekable)rrrrr}Ïsz_ProxyFile.seekablecCs |jjƒS)N)rÏrD)rrrrrDÒsz_ProxyFile.flushcCs3t|dƒsdSt|jdƒs)dS|jjS)NrÏTrF)r@rÏr)rrrrrÕs z_ProxyFile.closed)rprqrrrsrrMrrrgrtr6rÛrZrGrprxrzr{r|r}rDÚpropertyrrrrrr¤}s$          r¤c@s[eZdZdZdddd„Zdd„Zddd „Zd d „Zd d „ZdS)róz&A read-only wrapper of part of a file.NcCs)tj|||ƒ||_||_dS)zInitialize a _PartialFile.N)r¤rÚ_startÚ_stop)rr¢rärårrrrás z_PartialFile.__init__cCstj|ƒ|jS)z*Return the position with respect to start.)r¤rÛr)rrrrrÛçsz_PartialFile.tellrcCsY|dkr!|j|_d}n!|dkrB|j|_d}ntj|||ƒdS)z8Change position, possibly with respect to start or stop.rrPrON)rrnr€r¤rZ)rrurvrrrrZës      z_PartialFile.seekcCs`|j|j}|dkr dS|dksD|dksD||krM|}ntj|||ƒS)z;Read size bytes using read_method, honoring start and stop.rrëN)r€rnr¤rp)rrqrwZ remainingrrrrpõs  $ z_PartialFile._readcCst|dƒr|`ndS)NrÏ)r@rÏ)rrrrrGþsz_PartialFile.close) rprqrrrsrrÛrZrprGrrrrróÞs   róTc-Csðd}yŸtr’ytj|tjtjBƒWq’tk rŽ}z?|jtjtjtjfkryt d|j ƒ‚n‚WYdd}~Xq’Xn|r¤y!t |j dƒ}|j ƒWnGtk r}z'|jtjtjfkrídS‚WYdd}~XnXyft tdƒrHtj|j |j dƒd}tj|j ƒn tj|j |j dƒd}Wq¤tk r tj|j ƒt d|j ƒ‚Yq¤XnWnDtrÇtj|tjƒn|rätj|j dƒn‚YnXdS)z(Lock file f using lockf and dot locking.Fzlockf: lock unavailable: %sNz.lockrƒTzdot lock unavailable: %s)ÚfcntlÚlockfZLOCK_EXZLOCK_NBr‘r’ZEAGAINrÍrÎr“r†rÜrGr@rrƒr r�rÅrÚLOCK_UN)r¢rØZ dotlock_doner˜Zpre_lockrrrrÖsF!  rÖcCsPtrtj|tjƒntjj|jdƒrLtj|jdƒndS)z*Unlock file f using lockf and dot locking.z.lockN)r�r‚rƒrrrzr†r)r¢rrrr×.sr×c CsLtj|tjtjBtjBdƒ}zt|dƒSWdtj|ƒXdS)zCCreate a file if it doesn't exist and open for reading and writing.i¶zrb+N)rr�r¯rÚO_RDWRrG)rÚfdrrrrÄ5s&rÄcCs2td|ttjƒƒtjƒtjƒfƒS)zBCreate a temp file based on path and open for reading and writing.z %s.%s.%s.%s)rÄrÀrºr¾r¿rrÁ)rrrrrÜ=s rÜcCs3|jƒttdƒr/tj|jƒƒndS)z0Ensure changes to file f are physically on disk.ÚfsyncN)rDr@rr†Úfileno)r¢rrrrÙCs rÙcCst|ƒ|jƒdS)z:Close file f, ensuring all changes are physically on disk.N)rÙrG)r¢rrrr‡Is r‡c@seZdZdZdS)ÚErrorz"Raised for module-specific errors.N)rprqrrrsrrrrrˆOs rˆc@seZdZdZdS)r|z:The specified mailbox does not exist and won't be created.N)rprqrrrsrrrrr|Rs r|c@seZdZdZdS)r³z>The specified mailbox is not empty and deletion was requested.N)rprqrrrsrrrrr³Us r³c@seZdZdZdS)r“z)Another process caused an action to fail.N)rprqrrrsrrrrr“Xs r“c@seZdZdZdS)rz)A file appears to have an invalid format.N)rprqrrrsrrrrr[s r)0rsrrºr_r¾r’r=rcr,Z email.messageZemail.generatorrUr(r�Ú ImportErrorÚ__all__r\rHrrrËrêrrrrrrr rõr r r r r¤rórÖr×rÄrÜrÙr‡Ú Exceptionrˆr|r³r“rrrrrÚsd                çÿ6ÃB4-ÿ1ù%mqH_a')