\d3vdZddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Z ddl Z ddl mZ ddlZn #e$rdZYnwxYwgdZejdZGddZGdd eZGd d eZGd d eZGddeZGddeZGddeZGddeZGddejjZGddeZGddeZGddeZ GddeZ!Gd d!eZ"Gd"d#eZ#Gd$d%Z$Gd&d'e$Z%d9d)Z&d*Z'd+Z(d,Z)d-Z*d.Z+Gd/d0e,Z-Gd1d2e-Z.Gd3d4e-Z/Gd5d6e-Z0Gd7d8e-Z1dS):zDRead/write support for Maildir, mbox, MH, Babyl, and MMDF mailboxes.N) GenericAlias)MailboxMaildirmboxMHBabylMMDFMessageMaildirMessage mboxMessage MHMessage BabylMessage MMDFMessageErrorNoSuchMailboxError NotEmptyErrorExternalClashError FormatErrorasciiceZdZdZd$dZdZdZdZdZd Z d%d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZd%dZdZd%dZdZdZdZd Z d!Z!d"Z"d&d#Z#e$e%Z&dS)'rz*A group of messages in a particular place.NTctjtj||_||_dS)zInitialize a Mailbox instance.N)ospathabspath expanduser_path_factoryselfrfactorycreates ..\python\lib\mailbox.py__init__zMailbox.__init__%s2W__RW%7%7%=%=>>  c td)$Add message and return assigned key.&Method must be implemented by subclassNotImplementedErrorrmessages r"addz Mailbox.add*!"JKKKr$c td)=Remove the keyed message; raise KeyError if it doesn't exist.r'r(rkeys r"removezMailbox.remove.r-r$c0||dSN)r2r0s r" __delitem__zMailbox.__delitem__2s Cr$cT ||dS#t$rYdSwxYwz'If the keyed message exists, remove it.N)r2KeyErrorr0s r"discardzMailbox.discard5sA  KK         DD s  ''c td)>Replace the keyed message; raise KeyError if it doesn't exist.r'r(rr1r+s r" __setitem__zMailbox.__setitem__<r-r$cR ||S#t$r|cYSwxYw)z9Return the keyed message, or default if it doesn't exist.) __getitem__r8)rr1defaults r"getz Mailbox.get@s? ##C(( (   NNN s  &&c|js||Stj||5}||cdddS#1swxYwYdS)z=Return the keyed message; raise KeyError if it doesn't exist.N)r get_message contextlibclosingget_file)rr1files r"r?zMailbox.__getitem__Gs} +##C(( (#DMM#$6$677 +4}}T** + + + + + + + + + + + + + + + + + +sA&&A*-A*c td)4Return a Message representation or raise a KeyError.r'r(r0s r"rCzMailbox.get_messageOr-r$cttj||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_stringr0s r" get_stringzMailbox.get_stringSs- 's(;(;<<FFHHHr$c td)z8Return a byte string representation or raise a KeyError.r'r(r0s r"rNzMailbox.get_bytesZr-r$c td)6Return a file-like representation or raise a KeyError.r'r(r0s r"rFzMailbox.get_file^r-r$c td)Return an iterator over keys.r'r(rs r"iterkeyszMailbox.iterkeysbr-r$cDt|S)zReturn a list of keys.)listrWrVs r"keysz Mailbox.keysfsDMMOO$$$r$c#tK|D] } ||}n#t$rYwxYw|V!dS)z%Return an iterator over all messages.NrWr8rr1values r" itervalueszMailbox.itervaluesjsb==??  C S     KKKK    # 00c*|Sr4)r_rVs r"__iter__zMailbox.__iter__ss   r$cDt|S)z,Return a list of messages. Memory intensive.)rYr_rVs r"valueszMailbox.valuesvsDOO%%&&&r$c#xK|D]"} ||}n#t$rYwxYw||fV#dS)z.Return an iterator over (key, message) tuples.Nr\r]s r" iteritemszMailbox.iteritemszsj==??  C S     ,       r`cDt|S)z9Return a list of (key, message) tuples. Memory intensive.)rYrfrVs r"itemsz Mailbox.itemssDNN$$%%%r$c td)9Return True if the keyed message exists, False otherwise.r'r(r0s r" __contains__zMailbox.__contains__r-r$c td)*Return a count of messages in the mailbox.r'r(rVs r"__len__zMailbox.__len__r-r$c^|D]}||dS)zDelete all messages.N)rZr9r0s r"clearz Mailbox.clears899;;  C LL      r$ch ||}n#t$r|cYSwxYw|||S)z3Delete the keyed message and return it, or default.)r8r9)rr1r@results r"popz Mailbox.popsM #YFF   NNN  S s  c~|D]}|||fcStd)z6Delete an arbitrary (key, message) pair and return it.zNo messages in mailbox)rWrsr8r0s r"popitemzMailbox.popitemsC==?? 5 5C#' ' ' '344 4r$ct|dr|}n't|dr|}n|}d}|D]\}} |||< #t$rd}YwxYw|rtddS)z4Change the messages that correspond to certain keys.rfrhFTzNo message with key(s)N)hasattrrfrhr8)rargsourcebad_keyr1r+s r"updatezMailbox.updates 3 $ $ ]]__FF S' " " YY[[FFF"  LC #S       5344 4 5 5sA A,+A,c td)&Write any pending changes to the disk.r'r(rVs r"flushz Mailbox.flushr-r$c td)Lock the mailbox.r'r(rVs r"lockz Mailbox.lockr-r$c td)#Unlock the mailbox if it is locked.r'r(rVs r"unlockzMailbox.unlockr-r$c td)Flush and close the mailbox.r'r(rVs r"closez Mailbox.closer-r$ch |dS#t$rtdwxYw)Nrz?String input must be ASCII-only; use bytes or a Message instead)encode UnicodeError ValueErrorr*s r"_string_to_byteszMailbox._string_to_bytessK 2>>'** * 2 2 2122 2 2s1Fct|tjjrt j}tj||d}||| d| }| dt}| ||jr6|ts| td Sd Sd St|t t"tjfrt|tjr/t'jdt*d|}t|t r||}|r| dd}| dt}| ||jr6|ts| td Sd Sd St1|dr-t1|dr"t'jd t*d|j}d } |}|d r|d d dz}n"|dr |d ddz}|snW|r"|dr d|dd z}| dt}| ||}|jr8|r8|ts | td Sd Sd Sd St9dt;|z)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) isinstancerLr+r ioBytesIO generatorBytesGeneratorflattenseekrreplacelinesepwrite_append_newlineendswithstrbytesStringIOwarningswarnDeprecationWarninggetvaluerrwrreadline startswith TypeErrortype) rr+target mangle_from_rgendatalastlinelines r" _dump_messagezMailbox._dump_messages gu}4 5 51 HZ\\F/00qIIC KK KKNNN;;==D<<w//D LL   # &DMM',B,B & W%%%%% & & & &#ubk!: ; ;& H'2;// - *+=qBBB!**,,'3'' 9//88 C!//*kBBooeW55G LL ! ! !# &G,<,| }|j | z}||j krd}nd}d}tj |j|j d}tj |j|||z}t|trPt j|jtj |j|f t j|j|t j|jn1#t,t.f$rt j|j|YnwxYwnS#t2$rF}t j|j|jt4jkrt9d|zd}~wwxYw|S)r&rrz$Name clash with existing message: %sN) _create_tmpr BaseExceptionrrr2name _sync_closerr get_subdircolonget_inforbasenamesplitrrutimegetatimeget_datelinkAttributeErrorPermissionErrorrenameOSErrorerrnoEEXISTr)rr+tmp_filesubdirsuffixuniqdestes r"r,z Maildir.add$sS##%%    w 1 1 1 1    NN    Ihm $ $ $   H g~ . . ''))FZ'"2"2"4"44F##FFw ..44TZ@@Cw||DJv >> g~ . . L HX]g&&x}55w7G7G7I7IJ L L L  ) t,,, (-((((#O4 / / / (-..... /    Ihm $ $ $w%,&&()O+/*0111   s@-9A&!G;H+HHHH IAIIctjtj|j||dSr/N)rr2rrr_lookupr0s r"r2zMaildir.removeNs6 "',,tz4<<+<+<==>>>>>r$cb ||dS#ttf$rYdSwxYwr7)r2r8FileNotFoundErrorr0s r"r9zMaildir.discardRsG  KK     +,    DD s ..c||}||}||}t|tr|}n|}tj|}|j|vr)|j||jdz}nd}| |tj |j |} tj |j |||z} t|trFt j | tj | |ft j| | dS)r;rrN)rr,rr rrrrrr9rrrrrr) rr1r+ old_subpathtemp_key temp_subpathdominant_subpathrrtmp_pathnew_paths r"r=zMaildir.__setitem__ZsSll3'' 88G$$||H-- g~ . . ++   + !122 :) ) )Z"2"8"8"D"DR"HHFFF S7<< L997<< FC&LAA g~ . . G HXg&&x00'2B2B2D2DE G G G (H%%%%%r$c||}ttj|j|d5}|jr||}nt|}dddn #1swxYwYtj|\}}| ||j |vr3| ||j d| tj tj|j||S)rIrbNr)ropenrrrrrr r set_subdirrset_infoset_dategetmtime)rr1subpathfmsgrrs r"rCzMaildir.get_messageusG,,s## "',,tz733T : : (a} (mmA&&$Q''  ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( w}}W--  v :   LLDJ//3 4 4 4 RW%%bgll4:w&G&GHHIII s -BB Bcttj|j||d5}|tdcdddS#1swxYwYdS)2Return a bytes representation or raise a KeyError.rrN) rrrrrrrrrrr1rs r"rNzMaildir.get_bytess "',,tz4<<+<+<==t D D 46688##GU33 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s-BBBcttj|j||d}t |S)rSr)rrrrrr _ProxyFilers r"rFzMaildir.get_files; dj$,,s*;*;<g}tj|jD]}t|dkrk|ddkr_tjtj|j|r||dd|S)Return a list of folder names.r.N)rlistdirrrrisdirrappendrrrentrys r" list_folderszMaildir.list_folderssZ ++ ) )E5zzA~~%(c//w}}RW\\$*e<<==#2 eABBi((( r$c|ttj|jd|z|jdS)z/Return a Maildir instance for the named folder.rFr r!)rrrrrrrfolders r" get_folderzMaildir.get_folders9rw||DJf ==#}#%%% %r$c~tj|jd|z}t ||j}tj|d}tj|s?tjtj|tj tj zd|S)z>Create a folder and return a Maildir instance representing it.rr maildirfolder) rrrrrrrrrO_CREATO_WRONLY)rr$rrrmaildirfolder_paths r" add_folderzMaildir.add_foldersw||DJf 55t}555W\\$@@w~~011  HRW/bk1I    r$ctj|jd|z}tjtj|dtjtj|dzD]3}t |dks |ddkrt d|z4tj|D]f}|dkr^|dkrX|dkrRtjtj||rt d|d |gtj|d D]t\}}}|D]4}tj tj||5|D]4}tj tj||5utj |d S) -Delete the named folder, which must be empty.rrrrrzFolder contains message(s): %srzFolder contains subdirectory 'z': F)topdownN) rrrrrrrrwalkr2rmdir)rr$rrrootdirsfiless r" remove_folderzMaildir.remove_foldersw||DJf 55Z T5 9 9::Z T5 9 9::; O OE5zzA~~qS#$Dv$MNNN"1Z%% 5 5E~~%5..Ue^^w}}RW\\$66776D#m%+VVUU%4555!#u!=!=!= 4 4 D$ 5 5 "',,tU334444 4 4dE223333 4 r$c`tj}tjtj|jdD]b}tj|jd|}|tj|z dkrtj|cdS)zDelete old files in "tmp".ri@N)timerrrrrrr2)rnowrrs r"cleanz Maildir.cleansikkZ TZ ? ?@@  E7<< E599DRW%%d+++f44 $  r$rc vtj}tj}d|vr|dd}d|vr|dd}t |dt |dzdzdt jd tjd | }t j |j d |} t j |nG#t$r:txjdz c_ t|cYS#t$rYnwxYwYnwxYwt!d |z) z=Create a file in the tmp subdirectory and open and return it./z\057rz\072z.Mrg.APQrrz&Name clash prevented file creation: %s)r8socket gethostnamerintrgetpidr_countrrrstatr_create_carefullyFileExistsErrorr)rr9hostnamerrs r"rzMaildir._create_tmpsQikk%'' (??''W55H (??''W55H$'HHHHc#'C-.@.@.@.@")++++$+NNNHH>w||DJt44  GDMMMM     NNa NN (....."      !!I!%"&'' 's6 C""D&DD& D D&D  D&%D&ctj|jz d|jzkrWd}|jD]I}tj|j|}||j|krd}||j|<J|sdSi|_|jD]}|j|}t j |D]}tj ||}tj |rB| |j d}tj |||j|<tj|_dS)z!Update table of contents mapping.FTNr)r8rrrrrrrrrrrrr)rrefreshrmtimerrprs r"r zMaildir._refreshsE 9;; (1t/?+? ? ?G* 1 1((V)<==4+F333"G+0 ((  & > >F;v&DD)) > >GLLu--7==##{{4:..q1"$',,vu"="= $  > )++r$c` tjtj|j|j|r |j|Sn#t $rYnwxYw| |j|S#t $rt d|zdwxYw)z=Use TOC to return subpath for given key, or raise a KeyError.No message with key: %sN)rrrrrrr8r r0s r"rzMaildir._lookup&s w~~bgll4:ty~FFGG &y~% &    D   F9S> ! F F F4s:;; E FsAA A*)A* BB-ct|ds||_ |t|jS#t$rYdSt $rY4wxYw)z0Return the next message in a one-time iteration. _onetime_keysTN)rwrWrPnext StopIterationr8rVs r"rQz Maildir.next4s}t_-- 1!%D   D!34455    tt    sA A AAr)rrrrrr#r,r2r9r=rCrNrFrWrkrnr~rrrr r%r-r6r:rCrr rrQrr$r"rr s(( E((((T???&&&6   444         %%% &   F'''0"&"&"&H F F F     r$rcveZdZdZddZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZddZdZdS)_singlefileMailboxzA single-file mailbox.NTct|||| t|jd}n#t$r}|jt jkr,|rt|jd}nJt|j|jt jt j fvrt|jd}nYd}~nd}~wwxYw||_ d|_ d|_ d|_ d|_d|_d|_dS)z!Initialize a single-file mailbox.rb+zwb+rNrF)rr#rrrrENOENTrEACCESEROFS_filer _next_key_pending _pending_sync_locked _file_length)rrr r!rrs r"r#z_singlefileMailbox.__init__DstWf555 TZ''AA   w%,&&9TZ//AA,TZ888U\5;777T**    "  s5 CA7B;;Cc||||j|j<|xjdz c_d|_|jdz S)r&rT)r_append_messagerr[r]r*s r"r,z_singlefileMailbox.add[sR $($8$8$A$A $.! !"~!!r$cN|||j|=d|_dS)r/TN)rrr\r0s r"r2z_singlefileMailbox.removees( S IcN r$cx|||||j|<d|_dS)r;TN)rrarr\r<s r"r=z_singlefileMailbox.__setitem__ks8 S--g66 # r$c#pK||jEd{VdSr )rrrZrVs r"rWz_singlefileMailbox.iterkeysqs= 9>>###########r$c<|||jvSr )rrr0s r"rkz_singlefileMailbox.__contains__vs dir$cR|t|jSr)rrrrVs r"rnz_singlefileMailbox.__len__{s 49~~r$cN|jst|jd|_dSdS)rTN)r^ _lock_filerZrVs r"rz_singlefileMailbox.locks1| tz " " "DLLL  r$cN|jrt|jd|_dSdSrFN)r^ _unlock_filerZrVs r"rz_singlefileMailbox.unlocks1 < !  $ $ $ DLLL ! !r$c J|js$|jrt|jd|_dS|jJ|jdd|j}||jkrtd|j|fzt|j } i}| |t|j D]}|j|\}}|j||||} |jt!d||jz }|sn||[||f||<||||_n3#|t)j|jxYwt/||jt)j|j j} t)j|j|  t)j|j|j nH#t8$r;t)j|j t)j|j|j YnwxYwt;|j d|_||_d|_d|_|jrt?|jd dSdS) rFNrrIz4Size of mailbox file changed (expected %i, found %i)TrV)dotlock) r\r] _sync_flushrZrrtellr_r_create_temporaryr_pre_mailbox_hooksortedrZ_pre_message_hookrminr_post_message_hookrrr2rrrDst_modechmodrrFrr^rh) rcur_lennew_filenew_tocr1startstop new_startrmodes r"r~z_singlefileMailbox.flushs} ! +DJ'''%*" F y$$$ 1*//## d' ' '$&?&*&7%A&BCC C%TZ00 G  " "8 , , ,dinn..// 2 2"in t &&&&&x000$MMOO +!Z__S15 8I8I1I.K.KLLF!NN6*** + !*8==??; ''1111 ( D    NN    Ihm $ $ $ H wtz""* %%% 1 IhmTZ 0 0 0 0 1 1 1 Idj ! ! ! IhmTZ 0 0 0 0 0 1$*e,,   " < 2 tz5 1 1 1 1 1 1 2 2s "D6G0H -J AKKcdS),Called before writing the mailbox to file f.Nrrrs r"rrz$_singlefileMailbox._pre_mailbox_hookrr$cdS)-Called before writing each message to file f.Nrrs r"rtz$_singlefileMailbox._pre_message_hookrr$cdS,Called after writing each message to file f.Nrrs r"rvz%_singlefileMailbox._post_message_hookrr$c | |jr||jdS#|jwxYw# |jr||jw#|jwxYwxYwr)r~r^rrZrrVs r"rz_singlefileMailbox.closes # JJLLL #<"KKMMM   """""   """"  #<"KKMMM   """"   """"s.A+A A(+C-B"C"B==Cc|j||/ |j|S#t$rtd|zdwxYwdS)z'Return (start, stop) or raise KeyError.NrN)r _generate_tocr8r0s r"rz_singlefileMailbox._lookupso 9     ? Jy~% J J J83>??TI J ?s ,A c6|jdd|j}t|jdkr!|js||j ||j||}| |jn)#t$r|j |wxYw|j |j|_ |S)z;Append message to mailbox and return (start, stop) offsets.rrI)rZrrprrr\rrrt_install_messagervrtruncater~r_)rr+beforeoffsetss r"raz"_singlefileMailbox._append_messages 1"" ty>>Q  t}   " "4: . . .   " "4: . . .++G44G  # #DJ / / / /    J   ' ' '    JOO--s /A B99&Crr4)rrrrr#r,r2r=rWrkrnrrr~rrrtrvrrrarr$r"rTrTAs  !!!!."""  $$$        !!! >2>2>2@ # # #JJJJr$rTc:eZdZdZdZdZd dZd dZd dZdZ d S) _mboxMMDFzAn mbox or MMDF mailbox.Tc||\}}|j||jt d}|j||jz }||t d}| |dd d|S)rIr$rrNr) rrZrrrrrrp_message_factoryset_fromdecode)rr1r|r} from_linestringrs r"rCz_mboxMMDF.get_message sll3'' t J''))11'3??  (9(9!9::##FNN7E$B$BCC Yqrr]))'22333 r$Fcztj||||S)3Return a string representation or raise a KeyError.)unixfromrK)rr1from_s r"rPz_mboxMMDF.get_strings8' NN3 & &(((1 5 (A(A Br$c:||\}}|j||s|j|j||jz }|tdS)rr)rrZrrrrprr)rr1rr|r}rs r"rNz_mboxMMDF.get_bytessll3'' t  " J   ! ! ! (9(9!9::~~gu---r$c||\}}|j||s|jt |j|j|S)rS)rrZrr _PartialFilerp)rr1rr|r}s r"rFz_mboxMMDF.get_file!sgll3'' t  " J   ! ! !DJ (9(94@@@r$cd}t|tr||}t|trM|dr8|d}|dkr|d|}||dzd}n|}d}nt|t r-|d}d|z}nJt|tj j r+| }||d}|:dtjtjz}|j}|j|t&z|||j|j|j}||fS) z1Format a message and blindly write to self._file.Nrrrrr$rsFrom MAILER-DAEMON )rrrrrfind_mboxMMDFMessageget_fromrrLr+r get_unixfromr8asctimegmtimerZrprrr _mangle_from_)rr+rnewlineauthorr|r}s r"rz_mboxMMDF._install_message)s gs # # 5++G44G gu % % 6'*<*>GG$ii!mG7<< CLL99 h ' ' | 1  $ &&w2222$|($QNNN!FIh'''gy11;((':::<$ OOO<$ OOOO$ A A s7E*B0/D<0AC77.D<%E*<EE**E>cPtj|jt |} t |d}|tj|dS#t$r-}|j tj krtd|zd}~wwxYw)r/rVrNN) rrrrrrrr2rrrWr8)rr1rrrs r"r2z MH.removesw||DJC11 T5!!A GGIII IdOOOOO   w%,&&83>???  sA.. B%8(B  B%ctj|jt |} t |d}n:#t $r-}|jtjkrtd|zd}~wwxYw |j rt| tj tj|tj tjz|||t!|t"r||||j rt'|n#|j rt'|wwxYwt)|dS#t)|wxYw)r;rVrNN)rrrrrrrrrWr8r^rhrr+O_TRUNCrrr rrkr)rr1r+rrrs r"r=zMH.__setitem__sUw||DJC11 T5!!AA   w%,&&83>???   | 1  $r{RZ'?@@AAA""7A...gy117((#666<$ OOO<$ OOOO$ NNNNNKNNNNs<A A<(A77A<EA?D-E-EEE+c |jrAttj|jt |d}n@ttj|jt |d}n:#t$r-}|jtj krtd|zd}~wwxYw|5|jrt| t|}|jrt|n#|jrt|wwxYwdddn #1swxYwY|D]\}}||vr|||S)rIrVrrNN)r^rrrrrrrrrWr8rhr rk get_sequencesrh add_sequence)rr1rrrrkey_lists r"rCzMH.get_messages | Cdj#c((;;UCCdj#c((;;TBB   w%,&&83>???    $ $| 1  $ll<$ OOO<$ OOOO$  $ $ $ $ $ $ $ $ $ $ $ $ $ $ $#002288:: ' 'ND(h  &&& sBBB C(B==CD-D.D-DD--D14D1c |jrAttj|jt |d}n@ttj|jt |d}n:#t$r-}|jtj krtd|zd}~wwxYw|5|jrt| | td|jrt|cdddS#|jrt|wwxYw#1swxYwYdS)rrVrrNNr)r^rrrrrrrrrWr8rhrrrrkrr1rrs r"rNz MH.get_bytess | Cdj#c((;;UCCdj#c((;;TBB   w%,&&83>???    $ $| 1  $vvxx''77<$ OOO $ $ $ $ $ $ $ $ <$ OOOO$  $ $ $ $ $ $ $ $ $ $sBBB C(B==CE ,D. E .EE  EEc ttj|jt |d}n:#t $r-}|jtjkrtd|zd}~wwxYwt|S)rSrrNN) rrrrrrrrrWr8rrs r"rFz MH.get_file,s RW\\$*c#hh77>>AA   w%,&&83>???   !}}sAA A: (A55A:c|ttdtj|jDS)rUc3\K|]'}|t|V(dSr4)isdigitrA).0rs r" zMH.iterkeys..9sH::%).:3u::::::::r$)iterrsrrrrVs r"rWz MH.iterkeys7sGF::2:dj3I3I:::::;; ;r$ctjtj|jt |Sr )rrrrrrr0s r"rkzMH.__contains__<s.w~~bgll4:s3xx@@AAAr$c^tt|Sr)rrYrWrVs r"rnz MH.__len__@s 4 (()))r$c|jsUttj|jdd|_t|jd|_dSdS)rrrVTN)r^rrrrrrZrhrVs r"rzMH.lockDsT| bgll4:GGOODJ tz " " "DLLL  r$cz|jr3t|jt|j|`d|_dSdSrj)r^rkrZrrVs r"rz MH.unlockKsF < !  $ $ $  # # #  DLLL  ! !r$cdS)r}NrrVs r"r~zMH.flushSrr$c@|jr|dSdSr)r^rrVs r"rzMH.closeWs' <  KKMMMMM  r$cg}tj|jD]Y}tjtj|j|r||Z|S)r)rrrrrrrrs r"r zMH.list_folders\sbZ ++ % %Ew}}RW\\$*e<<== % e$$$ r$cvttj|j||jdS)z+Return an MH instance for the named folder.Fr"rrrrrrr#s r"r%z MH.get_folderds4"',,tz622-777 7r$ctttj|j||jS)z:Create a folder and return an MH instance representing it.r'rr#s r"r-z MH.add_folderis2"',,tz622-))) )r$cPtj|j|}tj|}|dgkr3tjtj|dn|gkrnt d|jztj|dS)r/rzFolder not empty: %sN)rrrrrr2rr2)rr$rentriess r"r6zMH.remove_foldernsw||DJ//*T"" ' ' ' Ibgll499 : : : : ]]  6 CDD D r$c H i}ttj|jddd5}t | |D]+} |d\}}t }|D]}|r#| t|9d|dD\}} | t|| dz fd t|D||<t||d kr||=#t$r%t!d |zwxYw d d d n #1swxYwY|S) z=Return a name-to-key-list dictionary to define each sequence.rrASCIIencodingrc34K|]}t|VdSr4)rA)rxs r"rz#MH.get_sequences..s(*K*Ka3q66*K*K*K*K*K*Kr$-rcg|]}|v| Srr)rr1all_keyss r" z$MH.get_sequences..s)%=%=%=S,/8OO&),;OOr$rz"Invalid sequence specification: %sN)rrrrrsetrZrrr,rAr{rangersrrrrstrip) rresultsrrrcontentsrZspecr|r}rs @r"rzMH.get_sequenceszs "',,tz?;;S7 S S S 5WX499;;''H 5 55%)ZZ__ND(55D ( 0 0@@<<>>@ HHSYY////*K*K4::c??*K*K*KKE4 KKeTAX(>(>????%=%=%=%=F4LL%=%=%=GDM74=))Q..#DM!555%&J&*kkmm'45555 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5&s*'F!C6EF/FFFFcDttj|jddd} tjtj|jtjtjz| D]\}}t|dkr| |dzd}d}tt|D]^}|d z |kr|sd }| d n7|rd}| |d |n| d |z|}_|r&| t|dz| d t|dS#t|wxYw)z:Set sequences using the given name-to-key-list dictionary.rzr+rrrrNFrTr z %s )rrrrrrrr+rrhrrrsrrr)r sequencesrrrZprev completingr1s r" set_sequenceszMH.set_sequencess dj/::D7 S S S  HRWQVR[2:%=>> ? ? ?'oo// " " dt99>>s ###" !#d)),,  CQw$)))-JGGCLLL#-%* 444 56666 ,,,DD"GGCII,----GGDMMMM) ", NNNNNKNNNNs EFFc 8|}d}g}|D]y}|dz |krg|||dzf tjtj|jt|tj|jt|dztj tj|jt|n#ttf$r{tj tj|jt|tj|jt|dzYnwxYw|dz }{|dz|_ t|dkrdS|D])\}}|D]!\}}||vr||||<"*||dS)z?Re-name messages to eliminate numbering gaps. Invalidates keys.rrN)rrWrrrrrrrunlinkrrrr[rrhindexr) rrrchangesr1rroldrs r"packzMH.packs&&(( ==??  CQw$TAX///BGBGLLSXX>>GLLS]]CCEEE Ibgll4:s3xx@@AAAA '8GGGIbgll4:s3xx@@ gll4:s4!8}}EEGGGGGG AIDD w<<1   F'oo// 8 8ND(# 8 8S(??47HX^^C001 8 9%%%%%sA8DB FFc:|}|}|D]9\}}||vr||||vr|||=:|D] }||vr|g||< ||dS)z;Inspect a new MHMessage and update sequences appropriately.N)rrhrrr)rr+r1pending_sequences all_sequencesrrsequences r"rzMH._dump_sequencess#1133**,, +1133 2 2ND(((($$$$X^^C001) 0 0H},,+.% h' =)))))r$r)rrrrr#r,r2r=rCrNrFrWrkrnrrr~rr r%r-r6rrrrrr$r"rrsm       D   02$$$*   ;;; BBB***   !!! 777 )))   0:&&&4 * * * * *r$rc|eZdZdZehdZddZdZdZdZ d Z d Z d Z d Z d ZdZdZdZdZdS)rzAn Rmail-style Babyl mailbox.>filededitedresentunseendeletedanswered forwardedNTcNt||||i|_dS)zInitialize a Babyl mailbox.N)rTr#_labelsrs r"r#zBabyl.__init__s'##D$@@@ r$ct||}t|tr||j|<|S)r&)rTr,rr get_labelsr)rr+r1s r"r,z Babyl.addsF $$T733 g| , , 5 ' 2 2 4 4DL  r$cbt||||jvr |j|=dSdSr)rTr2rr0s r"r2z Babyl.removes=!!$,,, $,   S!!!  r$ct|||t|tr||j|<dSdS)r;N)rTr=rrrrr<s r"r=zBabyl.__setitem__sT&&tS'::: g| , , 5 ' 2 2 4 4DL    5 5r$c||\}}|j||jt j} |j}|dt zks|sn/||t dYt j} |j}|t ks|sn/||t dV||j z }|dksJ|j |}|t d}t| |z} | | ||jvr | |j|| S)rIT *** EOOH ***rr)rrZrrrrrrrrprrr set_visibler set_labels) rr1r|r}original_headersrvisible_headersnbodyrs r"rCzBabyl.get_messagesll3'' t  :<< A:&&((D0000  " "4<<#?#? @ @ @  A *,, @:&&((Dwd  ! !$,,w">"> ? ? ?  @ 4:??$$ $Avvvvzq!!||GU+++4466=>> 0022333 $,   NN4<, - - - r$c||\}}|j||jt j} |j}|dt zks|sn/||t dY |j}|t ks|sn(| }||j z }|dksJ|j |}|t d}||zS)rTrrr) rrZrrrrrrrrrpr) rr1r|r}rrheadersrrs r"rNzBabyl.get_bytess7ll3'' t  :<< A:&&((D0000  " "4<<#?#? @ @ @  A  :&&((Dwd #++-- 4:??$$ $Avvvvzq!!||GU++~r$ctj||dtS)rSr)rrrNrrr0s r"rFzBabyl.get_file(s.z$..--55eWEEFFFr$c|t}|jD]}||||jt|S)z4Return a list of user-defined labels in the mailbox.)rrrrdr{difference_update_special_labelsrY)rlabels label_lists r"rzBabyl.get_labels,sm ,--// & &J MM* % % % %  !5666F||r$cgg}}|jdd}g} |}|j}|j}|dtzkrt |t |kr*||t tz ||d|jdddD}||n|dks|dtzkrKt |t |kr*||t tz n-|s+||t tz nttt|||_ tt||_ t |j |_ |jdd |j|_dS) rrTs c^g|]*}||+Sr)striprlabels r"rz'Babyl._generate_toc..Cs<:::E+0;;==:%++--:::r$rN,rI)rZrrrprrrrrrrrrr[r_)rrrr label_listsrrr!s r"rzBabyl._generate_toc5sB   H:&&((Dz((H{W,,,u::F ++LLCLL!8999 h'''::+/:+>+>+@+@+D+J+J4+P+P:::""6****DGg,=$=$=u::F ++LLCLL!8999  XG 4555# $3vu#5#56677 Ik2233 TY 1 JOO--r$cdtz}|dtzz }|}d|D}|dd|ztzz }|dz }||dS)rsBABYL OPTIONS:s Version: 5c3>K|]}|VdSr4)rr&s r"rz*Babyl._pre_mailbox_hook..Xs*55U%,,..555555r$sLabels:r(r)N)rrrr)rrbabylr!s r"rrzBabyl._pre_mailbox_hookSsz!G+ ((""55f555 dii///'99  r$c@|dtzdS)r Nrrs r"rtzBabyl._pre_message_hook]s '!"""""r$c@|tdzdS)rr)Nrrs r"rvzBabyl._post_message_hookas '!"""""r$c|j}t|trg}g}|D]6}||jvr||!||7|jd|D]1}|jd|z2|jd|D]4}|jd|zdz5|jtn"|jdtzt|tj j rKtj}tj|dd}|||d |}|j|d t|d ks|snQ|jd tzt|trtj} tj| dd} | | | }|j|d t|d ks|snQng|d |}|j|d t|d ks|snQ |d } | sn4|j| d tLnt|t.t0tjfrt|tjr/t5jd t8d|}t|t0r||}|ddz} | dz dkr|j|d| d t|jd tz|j|d| d t|j|| dd tnU|jd tztz|j|d tntA|drtA|dr"t5jdt8d|j!}|} d } |}|"dr|ddd z}n"|"dr |ddd z}|j|d t|d ks|s=|r:d}|jd tz|| nn |}|sn|"dr|ddtz}nO|"dr|ddtz}n'|"d r|ddtz}|j|ntGdtI|z|j}||fS)z0Write message contents and return (start, stop).1s, s,, r(s1,,FrTrrrmrrs rIrNrrrrrrr)%rZrprrrr rrrrrLr+r rrrrrrrr get_visiblerrrrrrrrrrrwrrrr)rr+r|special_labelsr!r' orig_bufferorig_generatorr vis_buffer vis_generatorr body_start original_pos first_passr}s r"rzBabyl._install_messageesK !! g| , , /NF ++-- ) )D000"))%0000MM%(((( J  T " " "' 9 9   !78888 J  U # # # ? ?    !6!=>>>> J  W % % % % J  Vg- . . . gu}4 5 5S H*,,K"_;;KPQRRN  " "7 + + +   Q    "++--   eW!=!=>>>5===   J  _w6 7 7 7'<00 Z\\ % > >z5RS T T %%g&9&9&;&;<<<%..00DJ$$T\\%%A%ABBBu}}D}   ###&//11DJ$$T\\%%A%ABBBu}}D}   A$))$//   w!?!?@@@  A %bk!: ; ;3 H'2;// - *+=qBBB!**,,'3'' 9//88 g..2JA~##   *!5!=!=eW!M!MNNN   7!:;;;   *!5!=!=eW!M!MNNN   !5!=!=eW!M!MNNNN   7!:W!DEEE   !@!@AAAA Wj ) )# Hw)) ) 56H!MMM!."<<>>LJ ''))==))-9u,DD]]5))-9u,D   eW!=!=>>>5===!%*  ((7)BCCC \2222  '''))==))/9w.DD]]5))/9w.DD]]5))/9w.D   &&& '6gFGG Gz  t}r$r)rrrr frozensetr r#r,r2r=rCrNrFrrrrrtrvrrr$r"rrs''i!B!B!BCCO """ 555 8,GGG...<######iiiiir$rc&eZdZdZddZdZdZdS)r z0Message with mailbox-format-specific properties.Ncht|tjjrU|t j|t|tr||dSdSt|tr)|tj |dSt|tr)|tj |dSt|tj r)|tj|dSt|dr)|tj|dS|&tjj|dSt%dt'|z)zInitialize a Message instance.rNr)rrLr+r _become_messagecopydeepcopy _explain_torrMrmessage_from_stringr TextIOWrappermessage_from_filerwmessage_from_binary_filer#rrr*s r"r#zMessage.__init__s gu}4 5 5 H  w!7!7 8 8 8'7++ *##D))))) * *  ' ' H  !9'!B!B C C C C C  % % H  !:7!C!C D D D D D !1 2 2 H  !8!A!A B B B B B Wf % % H  !?!H!H I I I I I _ M ! * *4 0 0 0 0 06gFGG Gr$cnt|dg}|jD]}||vr|j||j|<dS)z0Assume the non-format-specific state of message._type_specific_attributesN)getattr__dict__)rr+ type_specificrs r"r@zMessage._become_messagesP)DbII $ = =D=((&-&6t&< d# = =r$cNt|trdStd)z:Copy format-specific state to message insofar as possible.Nz Cannot convert to specified type)rr rr*s r"rCzMessage._explain_tos) gw ' ' @ F>?? ?r$r4)rrrrr#r@rCrr$r"r r sU::HHHH&===@@@@@r$r cdeZdZdZgdZddZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdS)r z)Message with Maildir-specific properties.)_subdir_info_dateNcd|_d|_tj|_t||dS)z%Initialize a MaildirMessage instance.rrN)rOrPr8rQr r#r*s r"r#zMaildirMessage.__init__s9  Y[[ w'''''r$c|jS)zReturn 'new' or 'cur'.)rOrVs r"rzMaildirMessage.get_subdirs |r$cP|dks|dkr ||_dStd|z)zSet subdir to 'new' or 'cur'.rrz!subdir must be 'new' or 'cur': %sN)rOr)rrs r"rzMaildirMessage.set_subdirs2 U??foo!DLLL@6IJJ Jr$cX|jdr|jddSdS)*Return as a string the flags that are set.2,rINr)rPrrVs r" get_flagszMaildirMessage.get_flags s/ :  & & :abb> !2r$cZddt|z|_dS))Set the given flags and unset all others.rWrN)rrsrP)rflagss r" set_flagszMaildirMessage.set_flagss$BGGF5MM222 r$c|dt|t|zdSz.Set the given flag(s) without changing others.rNr\rrrXrflags r"add_flagzMaildirMessage.add_flagC rwws4>>#3#344s4yy@AABBBBBr$c|rY|dt|t|z dSdS)7Unset the given string flag(s) without changing others.rN)rXr\rrr`s r" remove_flagzMaildirMessage.remove_flagsb >>   G NN2773t~~'7'7#8#83t99#DEE F F F F F G Gr$c|jS)zSet "From " line, formatting and appending time_ if specified.NTr)r8rrr})rrtime_s r"rz_mboxMMDFMessage.set_fromus@  }}  S4<... .E r$c\|dd|ddzS)rVStatusrX-Status)rArVs r"rXz_mboxMMDFMessage.get_flags}s)xx"%%R(@(@@@r$ct|}d\}}dD] }||vr||z }||!dD] }||vr||z }||!|dt|z } |d|n&#t $r|d|YnwxYw |d|dS#t $r|d|YdSwxYw)rZ)rr)rqrr)rtrurvrrrN)rr2rrsreplace_headerr8 add_header)rr[ status_flags xstatus_flagsras r"r\z_mboxMMDFMessage.set_flagssIE &,# m # #Du}}$  T"""# # #Du}}%  T"""///  4   , 7 7 7 7 4 4 4 OOHl 3 3 3 3 3 4 7    M : : : : : 7 7 7 OOJ 6 6 6 6 6 6 7s$B B;:B;?C C;:C;c|dt|t|zdSr^r_r`s r"rbz_mboxMMDFMessage.add_flagrcr$cd|vsd|vrY|dt|t|z dSdS)rerrrNr_r`s r"rfz_mboxMMDFMessage.remove_flags` t  zT11 NN2773t~~'7'7#8#83t99#DEE F F F F F 21r$ct|tr:t|}d|vr|dd|vr|dd|vr|dd|vr|dd|vr|d|d =|d =d |d d } | tj tj |dd S#ttf$rYd SwxYwt|t rP||||d St|t&rtt|}d|vr|dd|vr|dd|vr|d|d =|d =d St|t*rtt|}d|vr|dd|vr|dd|vr|d|d =|d =d St|t.rd St1dt3|z)zACopy mbox- or MMDF-specific state to message insofar as possible.rrrrurvrqrprtrsstatuszx-statusrNz%a %b %d %H:%M:%S %Yr rxryr r rz)rr rrXrrbrrrrcalendartimegmr8strptimer OverflowErrorrr\rr rrr{r rr)rr+r[ maybe_dates r"rCz_mboxMMDFMessage._explain_tos/ g~ . ./ +(())Ee||""5)))e||  %%%e||  %%%e||  %%%e||  %%%! #$--//"7"7"9"9"##">??J   z6L2N2N"O"OPPPPP .     !1 2 2 +   dnn.. / / /   T]]__ - - - - -  + + +(())E%$$X...e||$$Y///e||$$Y///! ###  . . +(())E%!!(+++e||!!),,,e||!!*---! ###  ) ) + DB MM*++ +s=:D99E Er4) rrrrrIr#rrrXr\rbrfrCrr$r"rrcs99!( ((((AAA777,CCCGGG 1+1+1+1+1+r$rceZdZdZdS)r z&Message with mbox-specific properties.Nrrrrrr$r"r r 0000r$r c>eZdZdZdgZd dZdZdZdZdZ d Z dS) r z$Message with MH-specific properties. _sequencesNcJg|_t||dS)z!Initialize an MHMessage instance.N)rr r#r*s r"r#zMHMessage.__init__s%w'''''r$c |jddS)z4Return a list of sequences that include the message.N)rrVs r"rzMHMessage.get_sequencessqqq!!r$c.t||_dS)z3Set the list of sequences that include the message.N)rYr)rrs r"rzMHMessage.set_sequencessy//r$ct|tr'||jvr|j|dSdSt dt |z)z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)rrrrrrrrs r"rzMHMessage.add_sequencesb h $ $ Nt..&&x00000/.;d8nnLMM Mr$c^ |j|dS#t$rYdSwxYw)zARemove sequence from the list of sequences including the message.N)rr2rrs r"remove_sequencezMHMessage.remove_sequencesE  O " "8 , , , , ,    DD   ,,cbt|trt|}d|vr|dn*|d|dd|vr|dd|vr|dd Sd St|t rt|}d|vr|dn|d d|vr|dd|vr|d d Sd St|tr.|D]}||d St|trWt|}d|vr| dd|vr| d d Sd St|trd Std t|z)z6Copy MH-specific state to message insofar as possible.r rrpryrurxrqROrrrvr rzN)rr rrrrbrr rrr{r rr)rr+rrs r"rCzMHMessage._explain_tosp g~ . ." +D..0011I9$$""5))))""5)))  %%%I%%  %%%I%%  %%%%%&% !1 2 2 +D..0011Iy((  &&&&  %%%I%%  %%%I%%  %%%%%&%  + + + ..00 / /$$X.... / /  . . +D..0011I9$$!!(+++I%%!!*-----&%  ) ) + DB MM*++ +r$r4) rrrrrIr#rrrrrCrr$r"r r s..!-(((( """***NNN$+$+$+$+$+r$r cReZdZdZddgZddZdZdZdZd Z d Z d Z d Z d Z dS)rz'Message with Babyl-specific properties.r_visibleNcpg|_t|_t||dS)z#Initialize a BabylMessage instance.N)rr rr#r*s r"r#zBabylMessage.__init__%s0   w'''''r$c |jddS)z'Return a list of labels on the message.N)rrVs r"rzBabylMessage.get_labels+s|AAAr$c.t||_dS)z&Set the list of labels on the message.N)rYr)rr!s r"rzBabylMessage.set_labels/sF|| r$ct|tr'||jvr|j|dSdSt dt |z)z+Add label to list of labels on the message.zlabel must be a string: %sN)rrrrrrrr's r"r{zBabylMessage.add_label3sb eS ! ! HDL(( ##E*****)(84;;FGG Gr$c^ |j|dS#t$rYdSwxYw)z4Remove label from the list of labels on the message.N)rr2rrs r" remove_labelzBabylMessage.remove_label;sE  L   & & & & &    DD rc*t|jS)z3Return a Message representation of visible headers.r rrVs r"r4zBabylMessage.get_visibleBst}%%%r$c.t||_dS)z2Set the Message representation of visible headers.Nr)rvisibles r"rzBabylMessage.set_visibleFs(( r$c|jD]0}||vr"|j|||(|j|=1dD]}||vr||jvr|||j|< dS)z9Update and/or sensibly generate a set of visible headers.)DateFromzReply-ToToCCSubjectN)rrZr)rheaders r"update_visiblezBabylMessage.update_visibleJsm((** * *F~~ ,,VT&\BBBBM&))I 5 5F~~& "="=(,V  f% 5 5r$ct|trt|}d|vr|dn*|d|dd|vsd|vr|dd|vr|dd |vr|d dSdSt|t rt|}d|vr|d n|d d |vr|d d|vr|ddSdSt|trWt|}d|vr|dd|vr|ddSdSt|trU| | |D]}| |dSt|trdStdt|z)z9Copy Babyl-specific state to message insofar as possible.r rrpr rr=r rqr rsrrrrtrvrxrzN)rr rrrrbrr rrrr4r{r rr)rr+r!r's r"rCzBabylMessage._explain_toUs g~ . .% +**++F6!!""5))))""5)))  %%%f$$F(:(:  %%%V##  %%%F""  %%%%%#" !1 2 2 +**++Fv%%  &&&&  %%%F""  %%%V##  %%%%%$#  + + +**++F6!!$$X...V##$$Y/////$#  . . +    0 0 2 2 3 3 3** ) )!!%(((( ) )  ) ) + DB MM*++ +r$r4)rrrrrIr#rrr{rr4rrrCrr$r"rr s11!*J 7(((( $$$HHH&&&))) 5 5 5'+'+'+'+'+r$rceZdZdZdS)rz&Message with MMDF-specific properties.Nrrr$r"rrrr$rceZdZdZddZddZddZddZddZdZ d Z dd Z d Z d Z dZdZdZdZdZdZedZeeZdS)rzA read-only wrapper of a file.Nc\||_|||_dS||_dS)zInitialize a _ProxyFile.N)rZrp_pos)rrposs r"r#z_ProxyFile.__init__s, ;DIIIDIIIr$cB|||jjSz Read bytes.)_readrZrrsizes r"rz_ProxyFile.readszz$ 000r$cB|||jjSr)rrZread1rs r"rz_ProxyFile.read1szz$ 0111r$cB|||jjS)z Read a line.)rrZrrs r"rz_ProxyFile.readlineszz$ 3444r$cvg}|D]3}||||t|z}|dkrn4|S)zRead multiple lines.Nr)rr)rsizehintrrrs r" readlinesz_ProxyFile.readlinessR  D MM$   #CII%q==E r$c#BK |}|sdS|V)zIterate over lines.TN)r)rrs r"rbz_ProxyFile.__iter__s3 ==??D JJJ  r$c|jS)zReturn the position.)rrVs r"rpz_ProxyFile.tells yr$rc|dkr|j|j|j|||j|_dS)zChange position.rNrZrrrproffsetwhences r"rz_ProxyFile.seeksN Q;; JOODI & & & '''JOO%% r$ct|dr: t|jdr|j|`dS#|`wxYwdS)zClose the file.rZrN)rwrZrrVs r"rz_ProxyFile.closesa 4 ! !  4:w//'J$$&&&JJJDJ   s .AAc|d}|j|j||}|j|_|S)z"Read size bytes using read_method.Nrr)rr read_methodrrs r"rz_ProxyFile._readsI <D  """T""JOO%%  r$c|S)z$Context management protocol support.rrVs r" __enter__z_ProxyFile.__enter__s r$c.|dSr4)r)rexcs r"__exit__z_ProxyFile.__exit__s r$c4|jSr4)rZreadablerVs r"rz_ProxyFile.readablez""$$$r$c4|jSr4)rZwritablerVs r"rz_ProxyFile.writablerr$c4|jSr4)rZseekablerVs r"rz_ProxyFile.seekablerr$c4|jSr4)rZr~rVs r"r~z_ProxyFile.flushsz!!!r$clt|dsdSt|jdsdS|jjS)NrZTrF)rwrZrrVs r"rz_ProxyFile.closeds=tW%% 4tz8,, 5z  r$r4r)rrrrr#rrrrrbrprrrrrrrrr~propertyrrrrrr$r"rrsQ((111122225555    &&&&%%%%%%%%%"""!!X!$ L11r$rc4eZdZdZd dZdZd dZdZdZdS) rz&A read-only wrapper of part of a file.NcZt|||||_||_dS)zInitialize a _PartialFile.N)rr#_start_stop)rrr|r}s r"r#z_PartialFile.__init__s,D!U+++  r$cFt||jz S)z*Return the position with respect to start.)rrprrVs r"rpz_PartialFile.tellst$$t{22r$rc|dkr|j|_d}n|dkr|j|_d}t|||dS)z8Change position, possibly with respect to start or stop.rrrIN)rrrrrrs r"rz_PartialFile.seeksN Q;; DIFF q[[ DIFff-----r$c|j|jz }|dkrdS| |dks||kr|}t|||S)z;Read size bytes using read_method, honoring start and stop.rr$)rrrr)rrr remainings r"rz_PartialFile._readsRJ* >>3 <4!88ti'7'7DdK888r$c.t|dr|`dSdS)NrZ)rwrZrVs r"rz_PartialFile.closes) 4 ! !    r$)NNr) rrrrr#rprrrrr$r"rrso00 333....999r$rTcd} tr tj|tjtjznT#t$rG}|jt jt jt jfvrtd|j zd}~wwxYw|r" t|j dz}| n8#t$r+}|jt jt jfvrYd}~dSd}~wwxYw tj|j |j dzd}tj|j n;#t t"f$r'tj|j |j dzd}YnwxYwdSdS#t&$r1tj|j td|j zwxYwdS#trtj|tj|rtj|j dzxYw)z(Lock file f using lockf and dot locking.Fzlockf: lock unavailable: %sN.lockTzdot lock unavailable: %s)fcntllockfLOCK_EXLOCK_NBrrEAGAINrXrYrrrqrrrrrrrrFr2LOCK_UN)rrn dotlock_donerpre_locks r"rhrhsDL%    Au}u}<====   7u|U\5;GGG,-J-.V.4555    1 ,QVg-=>>       7u|U[999FFFFF   1-GHM16G+;<<<#'L Ihm,,,, '8(((IhmQVg-=>>>#'LLL(-,!L# 1 1 1 (-(((()C)**0111 1% 1 1,  * K5= ) ) )  ( Iafw& ' ' ' sF4,9F4 B ABB  F4+B=<F4= C2C-&F4,C--C22F47$D5E455E-*E4,E--E44;F//F44AG;ctrtj|tjtj|jdzrtj|jdzdSdS)z*Unlock file f using lockf and dot locking.rN)rrrrrrrr2rs r"rkrk9sb & Au}%%% w~~afw&''$ !&7"#####$$r$ctj|tjtjztjzd} t|dtj|S#tj|wxYw)zCCreate a file if it doesn't exist and open for reading and writing.r)rV)rrr*rO_RDWRr)rfds r"rErE@sX rzBI- 95 A ABD%     s A A6c t|dttjdtjdt jS)zBCreate a temp file based on path and open for reading and writing.r)rErAr8r?r@rrB)rs r"rqrqHsR dddC 4D4D4D4D.4.@.B.B.B.B.0ikkk; < <The specified mailbox is not empty and deletion was requested.Nrrr$r"rr`sHHHHr$rceZdZdZdS)rz)Another process caused an action to fail.Nrrr$r"rrc3333r$rceZdZdZdS)rz)A file appears to have an invalid format.Nrrr$r"rrfrr$r)T)2rrr8rr?rrArrL email.messageemail.generatorrrDtypesrr ImportError__all__rrrrrTrrr rrr+r r rr r rrrrrhrkrErqror Exceptionrrrrrrr$r"r suJJ    LLLL EEE A A A *  G $ $f2f2f2f2f2f2f2f2Rsssssgsssl F?????"???D1.1.1.1.1.91.1.1.h*.*.*.*.*.9*.*.*.Zn*n*n*n*n*n*n*n*b vvvvv vvvr"@"@"@"@"@em#"@"@"@Jj+j+j+j+j+Wj+j+j+Zn+n+n+n+n+wn+n+n+b11111"111E+E+E+E+E+E+E+E+P\+\+\+\+\+7\+\+\+~11111"111b2b2b2b2b2b2b2b2J$$$$$:$$$N((((T$$$<<<   -----I---EEEEEEEEIIIIIEIII4444444444444%44444s?A A