o }5h3@s>dZddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Z ddl Z ddl mZzddlZWn eyIdZYnwgdZejdZGdddZGdd d eZGd d d eZGd d d eZGdddeZGdddeZGdddeZGdddeZGdddejjZGdddeZGdddeZGdddeZ GdddeZ!Gd d!d!eZ"Gd"d#d#eZ#Gd$d%d%Z$Gd&d'd'e$Z%d?d)d*Z&d+d,Z'd-d.Z(d/d0Z)d1d2Z*d3d4Z+Gd5d6d6e,Z-Gd7d8d8e-Z.Gd9d:d:e-Z/Gd;d<dd>e-Z1dS)@zDRead/write support for Maildir, mbox, MH, Babyl, and MMDF mailboxes.N) GenericAlias)MailboxMaildirmboxMHBabylMMDFMessageMaildirMessage mboxMessage MHMessage BabylMessage MMDFMessageErrorNoSuchMailboxError NotEmptyErrorExternalClashError FormatErrorasciic@seZdZdZdCddZddZdd Zd d Zd d ZddZ dDddZ ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/ZdDd0d1Zd2d3ZdDd4d5Zd6d7Zd8d9Zd:d;Zdd?Z!d@Z"dEdAdBZ#e$e%Z&dS)Frz*A group of messages in a particular place.NTcCs tjtj||_||_dS)zInitialize a Mailbox instance.N)ospathabspath expanduser_path_factoryselfrfactorycreater/usr/lib/python3.10/mailbox.py__init__%s zMailbox.__init__cCtd)$Add message and return assigned key.&Method must be implemented by subclassNotImplementedErrorrmessagerrr add*z Mailbox.addcCr")=Remove the keyed message; raise KeyError if it doesn't exist.r$r%rkeyrrr remove.r*zMailbox.removecCs||dSN)r.r,rrr __delitem__2szMailbox.__delitem__cCs&z||WdStyYdSwz'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|| }||WdS1s wYdS)z=Return the keyed message; raise KeyError if it doesn't exist.N)r get_message contextlibclosingget_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)zReturn a string representation or raise a KeyError. Uses email.message.Message to create a 7bit clean string representation of the message.emailmessage_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.NrIr2rr-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 itemsrMz 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-r8resultrrr pops   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|dr |}n t|dr|}n|}d}|D]\}}z|||<Wqty/d}Yqw|r6tddS)z4Change the messages that correspond to certain keys.rTrUFTzNo message with key(s)N)hasattrrTrUr2)rargsourcebad_keyr-r(rrr updates       zMailbox.updatecCr")&Write any pending changes to the disk.r$r%rHrrr flushr*z Mailbox.flushcCr")Lock the mailbox.r$r%rHrrr lockr*z Mailbox.lockcCr")#Unlock the mailbox if it is locked.r$r%rHrrr unlockr*zMailbox.unlockcCr")Flush and close the mailbox.r$r%rHrrr closer*z Mailbox.closecCs$z|dWStytdw)Nrz?String input must be ASCII-only; use bytes or a Message instead)encode UnicodeError ValueErrorr'rrr _string_to_bytess   zMailbox._string_to_bytesFc Cst|tjjr?t}tj||d}||| d| }| dt }| ||jr;|t s=| t d Sd Sd St|tttjfrt|tjrYtdtd|}t|trc||}|rk| dd}| dt }| ||jr|t s| t d Sd Sd St|drt|drtd td|j}d } |}|d r|d d d}n |dr|d dd}|sn|r|drd|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 insteads From s >From readbufferDUse of text mode files is deprecated, use a binary mode file insteadNT  From s>From Invalid message type: %s) isinstancerAr(r ioBytesIO generatorBytesGeneratorflattenseekrrreplacelinesepwrite_append_newlineendswithstrbytesStringIOwarningswarnDeprecationWarninggetvaluernr^rsreadline startswith TypeErrortype) rr(target mangle_from_rsgendatalastlinelinerrr _dump_messagesf                 zMailbox._dump_messageNTr/F)'__name__ __module__ __qualname____doc__r!r)r.r0r3r6r9r7r:rErCr=rIrLrQrRrSrTrUrWrYrZr\r]rbrdrfrhrjrnrr classmethodr__class_getitem__rrrr r"sF        6rc@seZdZdZdZd6ddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-Zd.d/Zd0d1Zd2d3Zd4d5ZdS)7rzA qmail-style Maildir mailbox.:NTcCst||||tj|jdtj|jdtj|jdd|_tj|jsE|r@t|jd|j D]}t|dq6nt |ji|_ ddd|_ d|_ d|_d S) zInitialize a Maildir instance.tmpnewcur)rrrr)rrg?N)rr!rrjoinr_pathsexistsmkdirrSr_toc _toc_mtimes _last_read _skewfactor)rdirnamerrrrrr r!s    zMaildir.__init__c Csf|}z|||Wnty|t|jwt|t|t r;| }|j | }||j kr:d}nd}d}tj |j|j d}tj |j|||}t|t rlt|jtj |j|fz'z t|j|Wnttfyt|j|YW|Swt|jW|Sty}zt|j|jtjkrtd|d}~ww)r#rrz$Name clash with existing message: %sN) _create_tmpr BaseExceptionrjrr.name _sync_closer|r get_subdircolonget_inforbasenamesplitrrutimegetatimeget_datelinkAttributeErrorPermissionErrorrenameOSErrorerrnoEEXISTr)rr(tmp_filesubdirsuffixuniqdesterrr r)$sR        z Maildir.addcCs ttj|j||dSr+N)rr.rrr_lookupr,rrr r.Ns zMaildir.removec Cs*z||WdSttfyYdSwr1)r.r2FileNotFoundErrorr,rrr r3Rs zMaildir.discardc Cs||}||}||}t|tr|}n|}tj|}|j|vr0|j||jd}nd}| |tj |j |} tj |j |||} t|tr]t | tj | |ft| | dS)r4rxrN)rr)r|r rrrrrr3rrrrrr) rr-r( old_subpathtemp_key temp_subpathdominant_subpathrrtmp_pathnew_pathrrr r6Zs$        zMaildir.__setitem__cCs||}ttj|j|d}|jr||}nt|}Wdn1s(wYtj|\}}| ||j |vrJ| ||j d| tj tj|j||S)r?rbNrx)ropenrrrrrr r set_subdirrset_infoset_dategetmtime)rr-subpathfmsgrrrrr r:us    zMaildir.get_messagecCsPttj|j||d}|tdWdS1s!wYdS)2Return a bytes representation or raise a KeyError.rroN) rrrrrrrrrrrr-rrrr rCs$zMaildir.get_bytescCs$ttj|j||d}t|S)rFr)rrrrrr _ProxyFilerrrr r=szMaildir.get_filec csB||jD]}z||Wn tyYqw|VqdSrGN)_refreshrrr2r,rrr rIs  zMaildir.iterkeyscC|||jvSrV)rrr,rrr rW zMaildir.__contains__cC|t|jSrX)rlenrrHrrr rYrzMaildir.__len__cCdS)"Write any pending changes to disk.NrrHrrr rdsz Maildir.flushcCr)reNrrHrrr rfz Maildir.lockcCr)rgNrrHrrr rhrzMaildir.unlockcCrriNrrHrrr rjrz Maildir.closecCs\g}t|jD]#}t|dkr+|ddkr+tjtj|j|r+||ddq|S)Return a list of folder names.r.N)rlistdirrrrisdirrappendrr[entryrrr list_foldersszMaildir.list_folderscCs ttj|jd||jddS)z/Return a Maildir instance for the named folder.rFrr)rrrrrrrfolderrrr get_folderszMaildir.get_foldercCs\tj|jd|}t||jd}tj|d}tj|s,tt|tj tj Bd|S)z>Create a folder and return a Maildir instance representing it.rr maildirfolder) rrrrrrrrjrO_CREATO_WRONLY)rrrr[maildirfolder_pathrrr add_folders zMaildir.add_foldercCstj|jd|}ttj|dttj|dD]}t|dks,|ddkr2td|qt|D]!}|dkrY|dkrY|dkrYtjtj||rYtd||fq8tj|d d D]#\}}}|D] }t tj||qh|D] }t tj||qwqat |d S) -Delete the named folder, which must be empty.rrrrrzFolder contains message(s): %srz%Folder contains subdirectory '%s': %sF)topdownN) rrrrrrrrwalkr.rmdir)rrrrrootdirsfilesrrr remove_folders, zMaildir.remove_foldercCsXt}ttj|jdD]}tj|jd|}|tj|dkr)t|qdS)zDelete old files in "tmp".ri@N)timerrrrrrr.)rnowrrrrr cleans z Maildir.cleanrc Cst}t}d|vr|dd}d|vr|dd}dt|t|ddttj|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\057rz\072z%s.M%sP%sQ%s.%srg.Arz&Name clash prevented file creation: %s)rsocket gethostnamerintrgetpidr_countrrrstatr_create_carefullyFileExistsErrorr)rrhostnamerrrrr rs0    zMaildir._create_tmpcCst|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)rrrrrrrrrrrrrr)rrefreshrmtimerrprrrr rs(     zMaildir._refreshcCstztjtj|j|j|r|j|WSWn ty Ynw|z|j|WSty9td|dw)z=Use TOC to return subpath for given key, or raise a KeyError.No message with key: %sN)rrrrrrr2rr,rrr r&s    zMaildir._lookupcCsLt|ds ||_ z|t|jWStyYdSty%Yq w)z0Return the next message in a one-time iteration. _onetime_keysTN)r^rIrnext StopIterationr2rHrrr r4s    z Maildir.nextr)rrrrrr!r)r.r3r6r:rCr=rIrWrYrdrfrhrjrrrrr rrrrrrrrr r s8 *   $ rc@seZdZdZd$ddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd%d d!Zd"d#ZdS)&_singlefileMailboxzA single-file mailbox.NTc Cst||||zt|jd}Wn7tyG}z+|jtjkr,|r't|jd}nt|j|jtjtj fvrt|t|kr6|r1||ttn||||d}n|sR|rL||ttn||n |tkrYd}nd}qtt t |||_ t|j |_ |j|_ dS)0Generate key-to-(start, stop) table of contents.FrTryN)r!rr/rrrrrdict enumerateziprr"r&)rstartsstopslast_was_emptyline_posrrrr rDXs2         zmbox._generate_tocr) rrrrrZrr!r5rDrrrr rFs  rc@s2eZdZdZd ddZddZdd Zd d ZdS) rzAn MMDF mailbox.NTcCr])zInitialize an MMDF mailbox.N)rrKrIr!rrrr r!}r^z MMDF.__init__cC|dtdS)rANr_r@rrr r3zMMDF._pre_message_hookcCs|tdtdS)rCrjNr_r@rrr r5szMMDF._post_message_hookcCsgg}}|jdd} |}|j}|j}|dtrM|| |}|j}|j}|dtkrC||ttn |sK||nq'n|sPnqtt t |||_ t|j |_ |jdd|j|_ dS)rarTrjrN)r!rrr/rrrrrbrcrdrr"r&)rrerfnext_posrhrrrr rDs8           zMMDF._generate_tocr)rrrrr!r3r5rDrrrr rzs   rc@seZdZdZd0ddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/ZdS)1rzAn MH mailbox.NTcCstt||||tj|js5|r0t|jdtttj |jdtj tj Btj Bdnt |jd|_dS)zInitialize an MH instance.r .mh_sequencesiFN)rr!rrrrrrjrrrO_EXCLrrr%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|trZ|||W|j rbt |n |j rkt |wwW|sst||S|s|t|ww)r#rrFT)rLrmaxrrrrrrr%r(rrr+rr.r|r _dump_sequences)rr(rLnew_keyrrclosedrrr r)sJ        zMH.addc Csltj|jt|}zt|d}Wnty*}z |jtjkr%t d|d}~ww| t |dS)r+rrN) rrrrrrrrrr2rjr.)rr-rrrrrr r.s  z MH.removec Cstj|jt|}zt|d}Wnty*}z |jtjkr%t d|d}~wwz?|j r3t |z't t|tj tjB|||t|trR|||W|j rZt|n |j rct|wwWt|dSt|w)r4rrN)rrrrrrrrrr2r%r(rjrO_TRUNCrr|r rpr+r)rr-r(rrrrrr r6s4      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 |wwWdn1sewY|D] \}}||vr}||qp|S)r?rrrN)r%rrrrrrrrrr2r(r r+ get_sequencesrU add_sequence)rr-rrrrkey_listrrr r:s:     zMH.get_messagec Csz |jrttj|jt|d}n ttj|jt|d}Wnty9}z |jtj kr4t d|d}~ww|)|jrDt |z| tdW|jrTt|WdS|jrdt|ww1shwYdS)rrrrNro)r%rrrrrrrrrr2r(rrrrr+rr-rrrrr rCs.   z MH.get_bytesc CsXzttj|jt|d}Wt |Sty+}z |jtjkr&t d|d}~ww)rFrrN) rrrrrrrrrr2rrwrrr r=,s  z MH.get_filecCsttddt|jDS)rGcss |] }|rt|VqdSr/)isdigitr ).0rrrr 9szMH.iterkeys..)iterr2rrrrHrrr rI7sz MH.iterkeyscCstjtj|jt|Sr)rrrrrrr,rrr rW<szMH.__contains__cCstt|Sr)rrKrIrHrrr rY@z MH.__len__cCs6|jsttj|jdd|_t|jd|_dSdS)rermrTN)r%rrrrrr!r(rHrrr rfDs   zMH.lockcCs,|jrt|jt|j|`d|_dSdSr*)r%r+r!rrHrrr rhKs    z MH.unlockcCr)rcNrrHrrr rdSrzMH.flushcCs|jr |dSdSr)r%rhrHrrr rjWs zMH.closecCs<g}t|jD]}tjtj|j|r||q|S)r)rrrrrrrrrrr r\s  zMH.list_folderscCsttj|j||jddS)z+Return an MH instance for the named folder.Frrrrrrrrrrr rdsz MH.get_foldercCsttj|j||jdS)z:Create a folder and return an MH instance representing it.rr}rrrr risz MH.add_foldercCs`tj|j|}t|}|dgkrttj|dn |gkr"ntd|jt|dS)rrmzFolder not empty: %sN)rrrrrr.rr)rrrentriesrrr rns  zMH.remove_folderc si}ttj|jddddp}t||D]^}zM|d\}}t}|D]$}|r7| t |q)dd|dD\}} | t || d q)fd d t |D||<t||d krf||=Wqtyvtd |wWd|S1swY|S)z=Return a name-to-key-list dictionary to define each sequence.rmrASCIIencodingrcss|]}t|VqdSr/)r )ryxrrr rzz#MH.get_sequences..-rcsg|]}|vr|qSrr)ryr-all_keysrr sz$MH.get_sequences..rz"Invalid sequence specification: %sN)rrrrrsetrLrrxr)r rbranger2rrmrrstrip) rresultsrrrcontentsrLspecr;r<rrr rtzs4    zMH.get_sequencescCsttj|jdddd}zqtt|jtjtjB| D]W\}}t |dkr+q | |dd}d}t t |D])}|d |krN|sMd }| d n|r\d}| d ||fn| d ||}q<|rr| t|dq | dq Wt|dSt|w)z:Set sequences using the given name-to-key-list dictionary.rmzr+rrrrNFrTrz%s %sz %s )rrrrrrjrrrsrUrrr2rrr)r sequencesrrrLprev completingr-rrr set_sequencess2    zMH.set_sequencesc Cs8|}d}g}|D]`}|d|krh|||dfzttj|jt|tj|jt|dWn#t t fyZt tj|jt|tj|jt|dYnwt tj|jt||d7}q |d|_ t|dkrzdS|D]\}}|D]\}}||vr||||<qq~||dS)z?Re-name messages to eliminate numbering gaps. Invalidates keys.rrN)rtrIrrrrrrrrrrunlinkr"rrUindexr) rrrchangesr-rrvoldrrrr packs6      zMH.packcCst|}|}|D]\}}||vr||q ||vr$|||=q |D] }||vr2|g||<q'||dS)z;Inspect a new MHMessage and update sequences appropriately.N)rtrUrrr)rr(r-pending_sequences all_sequencesrrvsequencerrr rps   zMH._dump_sequencesr)rrrrr!r)r.r6r:rCr=rIrWrYrfrhrdrjrrrrrtrrrprrrr rs0  "   rc@seZdZdZehdZdddZddZd d Zd d Z d dZ ddZ ddZ ddZ ddZddZddZddZddZdS) rzAn Rmail-style Babyl mailbox.>filededitedresentunseendeletedanswered forwardedNTcCst||||i|_dS)zInitialize a Babyl mailbox.N)rr!_labelsrrrr r!s zBabyl.__init__cCs(t||}t|tr||j|<|S)r#)rr)r|r get_labelsr)rr(r-rrr r)s  z Babyl.addcCs&t||||jvr|j|=dSdSr)rr.rr,rrr r.s   z Babyl.removecCs.t|||t|tr||j|<dSdS)r4N)rr6r|r rrr5rrr r6s zBabyl.__setitem__c Cs||\}}|j||jt} |j}|dtks$|s%n ||tdqt} |j}|tks?|s@n ||tdq4||j }|dksWJ|j |}|td}t | |} | | ||jvr| |j|| S)r?T *** EOOH ***ror)rr!rrr}r~rrrr/rrr r set_visibler set_labels) rr-r;r<original_headersrvisible_headersnbodyrrrr r:s4         zBabyl.get_messagec Cs||\}}|j||jt} |j}|dtks$|s%n ||tdq |j}|tks;|s.rN,r)r!rrr/rrrrrbrcrdrrr"r&)rrerfrl label_listsrhrrrrr rD5s:        zBabyl._generate_toccCsVdt}|dt7}|}dd|D}|dd|t7}|d7}||dS) r?sBABYL OPTIONS:s Version: 5css|]}|VqdSr/)rkrrrr rzXrz*Babyl._pre_mailbox_hook..sLabels:rrN)rrrr)rrbabylrrrr r1Ss zBabyl._pre_mailbox_hookcCri)rA Nr_r@rrr r3]rkzBabyl._pre_message_hookcCs|tddS)rCrNr_r@rrr r5arkzBabyl._post_message_hookcCs`|j}t|trXg}g}|D]}||jvr||q||q|jd|D] }|jd|q-|jd|D]}|jd|dqB|jt n|jdt t|t j j rt }t j|dd}|||d |}|j|d t |d ks|snq~|jd t t|trt } t j| dd} | | | }|j|d t |d ks|snqn|d |}|j|d t |d ks|snq |d } | sn |j| d t qn)t|ttt jfr{t|t jrtd td|}t|tr%||}|dd} | ddkrf|j|d| d t |jd t |j|d| d t |j|| dd t n|jd t t |j|d t nt |drt |drtdtd|j!}|} d } |}|"dr|ddd }n|"dr|ddd }|j|d t |d ks|s|rd}|jd t || nnq |}|sn4|"dr|ddt }n|"dr|ddt }n|"d r|ddt }|j|qnt#dt$||j}||fS)z0Write message contents and return (start, stop).1s, s,, rs1,,FrTrorr,rprqs rrxNrrsrtrurvrwr{)%r!r/r|r rrrrrkrrAr(r r}r~rrrrrr get_visiblerrrrrrrrrrnrTr^rsrrr)rr(r;special_labelsrr orig_bufferorig_generatorr vis_buffer vis_generatorrs body_start original_pos first_passr<rrr rEes                            zBabyl._install_messager)rrrr frozensetrr!r)r.r6r:rCr=rrDr1r3r5rErrrr rs      rc@s*eZdZdZd ddZddZddZdS) r z0Message with mailbox-format-specific properties.NcCst|tjjr|t|t|tr||dSdSt|tr,|t |dSt|t r;|t |dSt|t j rK|t|dSt|drZ|t|dS|durgtjj|dStdt|)zInitialize a Message instance.rrNr{)r|rAr(r _become_messagecopydeepcopy _explain_torrBrmessage_from_stringr} TextIOWrappermessage_from_filer^message_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( type_specificrrrr rs  zMessage._become_messagecCst|trdStd)z:Copy format-specific state to message insofar as possible.Nz Cannot convert to specified type)r|r rr'rrr rs zMessage._explain_tor/)rrrrr!rrrrrr r s   r c@szeZdZdZgdZdddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZdS)r z)Message with Maildir-specific properties.)_subdir_info_dateNcCs&d|_d|_t|_t||dS)z%Initialize a MaildirMessage instance.rrN)rrrrr r!r'rrr r!s zMaildirMessage.__init__cC|jS)zReturn 'new' or 'cur'.)rrHrrr rzMaildirMessage.get_subdircCs&|dks|dkr ||_dStd|)zSet subdir to 'new' or 'cur'.rrz!subdir must be 'new' or 'cur': %sN)rrm)rrrrr rs  zMaildirMessage.set_subdircCs|jdr |jddSdS)*Return as a string the flags that are set.2,rNr)rrrHrrr get_flags s zMaildirMessage.get_flagscCsddt||_dS))Set the given flags and unset all others.rrN)rr2r)rflagsrrr set_flagsrzMaildirMessage.set_flagscC$|dt|t|BdSz.Set the given flag(s) without changing others.rNrrrrrflagrrr add_flag$zMaildirMessage.add_flagcCs0|r|dt|t|dSdS)7Unset the given string flag(s) without changing others.rN)rrrrrrrr remove_flags$zMaildirMessage.remove_flagcCr)zSet "From " line, formatting and appending time_ if specified.NT )rrYrXr)rrRtime_rrr rLus  z_mboxMMDFMessage.set_fromcCs|dd|ddS)rStatusrX-Status)r9rHrrr r}rz_mboxMMDFMessage.get_flagscCst|}d\}}dD]}||vr||7}||q dD]}||vr+||7}||q|dt|7}z|d|WntyL|d|Ynwz |d|WdStyf|d|YdSw)r)rr)rr)rrrrrrN)rr.rr2replace_headerr2 add_header)rr status_flags xstatus_flagsrrrr rs.    z_mboxMMDFMessage.set_flagscCrrrrrrr rrz_mboxMMDFMessage.add_flagcCs8d|vsd|vr|dt|t|dSdS)rrrrNrrrrr rs$z_mboxMMDFMessage.remove_flagc Cst|trgt|}d|vr|dd|vr|dd|vr&|dd|vr/|dd|vr8|d|d =|d =d |d d }z| t t |dWd SttfyfYd Swt|tr|||||d St|trt|}d|vr|dd|vr|dd|vr|d|d =|d =d St|trt|}d|vr|dd|vr|dd|vr|d|d =|d =d St|trd Stdt|)zACopy mbox- or MMDF-specific state to message insofar as possible.rrrrrrrrstatuszx-statusrNz%a %b %d %H:%M:%S %Yrrrrrr)r|r rrrrrrVrrcalendartimegmrstrptimerm OverflowErrorrUrrLr rur rr rr)rr(r maybe_daterrr rsd                     z_mboxMMDFMessage._explain_tor/) rrrrrr!rVrLrrrrrrrrr rUcs   rUc@eZdZdZdS)r z&Message with mbox-specific properties.Nrrrrrrrr r r c@sHeZdZdZdgZdddZddZdd Zd d Zd d Z ddZ 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|jddS)z4Return a list of sequences that include the message.N)r rHrrr rtr`zMHMessage.get_sequencescCt||_dS)z3Set the list of sequences that include the message.N)rKr )rrrrr rr`zMHMessage.set_sequencescC8t|tr||jvr|j|dSdStdt|)z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)r|rr rrrrrrrr 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|tr5t|}d|vr|dn |d|dd|vr(|dd|vr3|dd Sd St|tret|}d|vrJ|dn|d d|vrX|dd|vrc|d d Sd St|trx|D]}||qnd St|t rt|}d|vr| dd|vr| d d Sd St|t rd St d t |)z6Copy MH-specific state to message insofar as possible.rrrrrrrROrrrrN)r|r rrtrrrUr rur rr rr)rr(rrrrr rsJ                  zMHMessage._explain_tor/) rrrrrr!rtrrurrrrrr r s  r c@sbeZdZdZddgZdddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ dS)r z'Message with Babyl-specific properties.r_visibleNcCsg|_t|_t||dS)z#Initialize a BabylMessage instance.N)rr rr!r'rrr r!%szBabylMessage.__init__cCr )z'Return a list of labels on the message.N)rrHrrr r+r`zBabylMessage.get_labelscCr )z&Set the list of labels on the message.N)rKr)rrrrr r/r`zBabylMessage.set_labelscCr )z+Add label to list of labels on the message.zlabel must be a string: %sN)r|rrrrrrrrrr r3rzBabylMessage.add_labelcCr)z4Remove label from the list of labels on the message.N)rr.rmrrrr remove_label;rzBabylMessage.remove_labelcCs t|jS)z3Return a Message representation of visible headers.r rrHrrr rBs zBabylMessage.get_visiblecCr )z2Set the Message representation of visible headers.Nr)rvisiblerrr rFr`zBabylMessage.set_visiblecCsb|jD]}||vr|j|||q|j|=qdD]}||vr.||jvr.|||j|<qdS)z9Update and/or sensibly generate a set of visible headers.)DateFromzReply-ToToCCSubjectN)rrLr)rheaderrrr update_visibleJs zBabylMessage.update_visiblecCsxt|trBt|}d|vr|dn |d|dd|vs'd|vr,|dd|vr5|dd |vr@|d dSdSt|trrt|}d|vrW|d n|d d |vre|d d|vrp|ddSdSt|trt|}d|vr|dd|vr|ddSdSt|t r| | |D]}| |qdSt|t rdStdt|)z9Copy Babyl-specific state to message insofar as possible.rrrrrrrrrrrrrrrrN)r|r rrrrrUr rur rrrr rr)rr(rrrrr rUsP                   zBabylMessage._explain_tor/)rrrrrr!rrrrrrrrrrrr r s  r c@r)rz&Message with MMDF-specific properties.Nrrrrr rrrc@seZdZdZd&ddZd&ddZd&ddZd&d d Zd&d d Zd dZ ddZ d'ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zed$d%ZeeZdS)(rzA read-only wrapper of a file.NcCs&||_|dur||_dS||_dS)zInitialize a _ProxyFile.N)r!r/_pos)rrposrrr r!s z_ProxyFile.__init__cC|||jjSz Read bytes.)_readr!rrrsizerrr rrr|z_ProxyFile.readcCr!r")r#r!read1r$rrr r&r|z_ProxyFile.read1cCr!)z Read a line.)r#r!rr$rrr rr|z_ProxyFile.readlinecCs>g}|D]}|||dur|t|8}|dkr|Sq|S)zRead multiple lines.Nr)rr)rsizehintr[rrrr readliness  z_ProxyFile.readlinesccs |}|s dS|Vq)zIterate over lines.TN)r)rrrrr rRsz_ProxyFile.__iter__cCr)zReturn the position.)rrHrrr r/rz_ProxyFile.tellrcCs4|dkr |j|j|j|||j|_dS)zChange position.rNr!rrr/roffsetwhencerrr rsz_ProxyFile.seekcCs@t|drzt|jdr|jW|`dSW|`dS|`wdS)zClose the file.r!rjN)r^r!rjrHrrr rjs   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__rz_ProxyFile.__enter__cGs |dSr/)rj)rexcrrr __exit__s z_ProxyFile.__exit__cC |jSr/)r!readablerHrrr r2 z_ProxyFile.readablecCr1r/)r!writablerHrrr r4r3z_ProxyFile.writablecCr1r/)r!seekablerHrrr r5r3z_ProxyFile.seekablecCr1r/)r!rdrHrrr rdr3z_ProxyFile.flushcCs&t|dsdSt|jdsdS|jjS)Nr!TrrF)r^r!rrrHrrr rrs  z_ProxyFile.closedr/r)rrrrr!rrr&rr(rRr/rrjr#r.r0r2r4r5rdpropertyrrrrrrrrr rs*           rc@s<eZdZdZdddZddZddd Zd d Zd d ZdS)rSz&A read-only wrapper of part of a file.NcCst|||||_||_dS)zInitialize a _PartialFile.N)rr!_start_stop)rrr;r<rrr r!s z_PartialFile.__init__cCst||jS)z*Return the position with respect to start.)rr/r8rHrrr r/r|z_PartialFile.tellrcCs<|dkr |j|_d}n |dkr|j|_d}t|||dS)z8Change position, possibly with respect to start or stop.rrrN)r8rr9rrr*rrr rsz_PartialFile.seekcCsB|j|j}|dkr dS|dus|dks||kr|}t|||S)z;Read size bytes using read_method, honoring start and stop.rrJN)r9rrr#)rr%r- remainingrrr r#s z_PartialFile._readcCst|dr |`dSdS)Nr!)r^r!rHrrr rjs z_PartialFile.close)NNr6) rrrrr!r/rr#rjrrrr rSs   rSTc Csd}ztr1z t|tjtjBWnty0}z|jtjtjtjfvr+t d|j d}~ww|rz t |j d}| Wnty^}z|jtjtjfvrYWYd}~WdSd}~wwz4zt |j |j dd}Wnttfyt |j |j dd}Yn wt |j WWdSWWdStyt |j t d|j wWdStrt|tj|rt |j d)z(Lock file f using lockf and dot locking.Fzlockf: lock unavailable: %sN.lockTzdot lock unavailable: %s)fcntllockfLOCK_EXLOCK_NBrrEAGAINrr rrr0rjrrrrrrrr.LOCK_UN)rr- dotlock_donerpre_lockrrr r(s\   r(cCs<tr t|tjtj|jdrt|jddSdS)z*Unlock file f using lockf and dot locking.r;N)r<r=rArrrrr.rrrr r+9s r+c Cs@t|tjtjBtjBd}z t|dWt|St|w)zCCreate a file if it doesn't exist and open for reading and writing.rr)rrrrnO_RDWRrj)rfdrrr r@s rcCs$td|ttttfS)zBCreate a temp file based on path and open for reading and writing.z %s.%s.%s.%s)rr rr r rr)rrrr r0Hsr0cCs(|ttdrt|dSdS)z0Ensure changes to file f are physically on disk.fsyncN)rdr^rrGfilenorDrrr r.Ns r.cCst||dS)z:Close file f, ensuring all changes are physically on disk.N)r.rjrDrrr rTs rc@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)2rrrrr rrrrA email.messageemail.generatorr}r;typesrr< ImportError__all__rrkrrrrIrrrrr(r r rUr r r rrrSr(r+rr0r.r Exceptionrrrrrrrrr sp    j8DB4-3z%mqH_e '*