PK#NN!rre2m/__init__.py""" Email to maildir sync Sync your emails to maildir (currently only imap supported) """ __version__ = '1.0.2' PK"FLiF e2m/e2m.pngPNG  IHDRN;;DIDATx!j@Q K c`AD 1 ^>~F5Y-jU־u]vekZ_W}[ gi#jDEԨ9䰢VQ9UĊ"VUCU,=VDՊbCUĊ1""c>0zH;<y3333q4#vtp0xwX*ֱ-|D;E!Jدs}/xp .GlְE/_#D/:ІV\ExNq>&0cȢOTydb)<0nk ,ћ6[Y~HjTF 䰇 7~(5;fffffVK!(.+cS6E9$C"X<^1nqDA:\A'pO[7Z1D.ffffffgX=Ђn 7c-J&яvY33333;h ,`7$GxFpM!EG1Yl!:a%䰃1at#.duG~ŸX@T,5 /v23333b=!PK^8U_Q4HC:2aуfbW0I,C:me1qyTFt`ϰ=;2`A+JQ$19d I:1"In4ގk\ ݘsH$jΘ;Xɒ V,h$IRM%Jy_cH$F`| kǽE$I[V+Ǖx\ɲPq7ޏq4I$m^8,zb$IRojxR% @?\|oU$ijT|Tu)>=E$IknG]ɢ0ǡhI$8w} s*IۍǙ_0Lrpp$IA*Ɠ\$IfѭdY b>cH$ Q*@:cw$I?fbe \g\EH$ Hx3{ Ɵb{$I7S'cH$Yşq%3qk’$0V*YŸ{U$X# ߩ 85aITSoT8*IFLx ҍ8ۊ$Iq:SWbH鍘BUS1[ɂe9Im$Kѩd^!NDH1 XKHjc6K7G$IfV8VX/$isEJ>2Iuo^h>"I6f 0-1Q$IRcEj׉;qHԈqSUX F$IڰFT9r,$imY%8aIN%E7ll+$i5xXPA,.U5y6M7đ"I^X#^oy%\"I~ѱd`jtITFLTɠa׎Ǥ[%IX|{Uk$ k_@՞ƙhIF b#k$ z#1O+tb&&$IXJ/jq+IJ.vsq ’Ah܌n%CX-$a8V` -Ǵ%IV#މJ*;\$IZq.*@ouV]$ŅXd%IZaڣ8I$&k+1'Z%I5/d@uX,$mA8dxgq1I6񨒁ԩ_x$iXdučY$Iac\LLIzP+y%C?bO$isX6@7"IԊ]ɠ8\$IZG;jt*nxUuUчc#FD*֪^ET.FX"֪^ԪZj/V/zQzb/VՈ\DZ"jŪ+#b1R&3s-rpe5.JB,r`a&I7Td[KMwPѶ͘n'@QkKihȁ8MVItYzd9θJR]p/w&Id3*c&ITøEQ/5IR'ĕX/rڝ8$Iƥ(rxN|ǚ$lj`ܖbIJ5Z ĵi209(N$~|Q`3ĠIq+vU6w u?N6IZ`I\|VdGzl*ގ"@?|sMӱ\d?t=43g%^i.z1w7/VwaDB) )"]H…fQK(a(BJ d#B\b-aJAPC(aa%^OL<˝a^wϙs_f&$h2|^H> ohIp@;ƒ$H#r!K Lr'oBrUVIz1\/dY>p 0Iz^.dQ^'I^ YRW'*o  Bex)IR+'rؑ$0SRo-WVwP]IR+ 5 YFIP4>-dyF[ ' Q!zؑ$ J!K{-|]A(Jl,e~$TX(dYfGIj<\.dIf^N% IR Y$IEt |Qr빬RWRR|%IڋB5:,(ɭ+Iڔ~>)d@L6ãB#WY7>.d `۷oN:U={fzzڶm[ p4Ih Y4Xu̙ݻՓ'OhD]Z9~ks?_274f_ڥ{Oߺu:vX5::Z}!w/$ a!7~ZbjjjI){\ jٻƉ|luOnv}}f93yfu"hEoq# ^!7~Zb˖-7nTNd/sSgd}8Qy#Hf_Yc3Ǐj޽+9E(0$mxorçW]zP/ՅMX>#Sf׹ґ;4ns~]NST{)⾎\9)D߫"߫$̵g0n=[k|}ŋ"h a<-699Y]pZZZʜ8b_zW9p5JwfWEܷ Î$iúVȍksZ@/J5_%3?oXkjOnv}mmpDٽP>}z苸O5«I҆t0<*+yˁ'NTwZdr5\u|~o׿5kvk=sg_=Zmݺ2ZC/$ᯅ+G{h[/>Re&:gv=ԝo߮:Ts1&!3Irs׾{ 9׆A/e'[n\ *'&Y61|h.x=#cJ-y |j'HtB/2>y`=FX]c;û[}[UfΜI:t CIAPFTdXI@f̘A~(fM~ЫKb `u3]VؓK= |ca`APFϰ˓ w*7r~Nj3^k K8%{ n1`O:4ߟ>:x~,i`Ɏ)tulfH45k@=#YI=~ժUtYgafba'ĜviTQQ!SϬ* [BؾlEI `gT  [<$樣?8ș53s;;βzMMM ͚5{y)A4ɖ@6ƒiӦ KqC,U-hj2k4Ļ4i |Wa'STTDv<.y"(KL:*.ϸ6\XXg 11 R\̮#7#Fc-e͛7Ӱa0X &AֳyyA3`С ]tmݺU3)c9ىQ.( {X O>οN't 6t RgO:/a&L@˖-8M/_.?^>g02=)Vz-.[|/KZr%]x^|& + 2yqAI488zeeeTYY)-U#vD|&;+ =w.X}7Kkw/b/>AN" 'gxٓN rS~lٲKx^fΜI~"Cz?K^"'ͮi{}AxwxӧS˖-~П'CTC'8f `bu6jk&v,_";*oq^I&t7Ү]=` "gaÂj߾}8wM{Q$E%my[HμرFŹ5kFSLf Xf0 G0ߓ @%?/ ڵkVСCyfW{]S:k;;'z 45j^_ZZJO>[A0`G:C{<P}͙3w&R'd78';ûc֯_O5;vsBzd  VO:) fX"0}.=/Eի{|mۚ,U0R^>'b {wEEu}w K65P3<4J֊+< NSO=}]:@QwMXŋyyrj0`GZA ta' $NqeqIڷoOO=0<3<,|賀J37GyZnajo(k4BˁzAh89$N}qizYsIK`=w~R-g=z4ٛ6HuAZI jIUeoƍMӦM;G< L숢<*(;û331e*F;'Wzw8KW'9+;@PPI 4`H!\`tG;&k׮p7w"w1Pմmxwxw+eܹԩS'K/k׆ޟ08 +IrX=V9@ 86oLW^yZ '@?<eY1~[xwxw|O|ǩM6N^Y̋uXOT"[03,39`PA vI~;sL<ݫNa%}6E]3;{ݻwsr?~|}Ր+[P.yJ [<Da6 4A1Cz+8pk=<;^m"]_s~xwx8ݪU+xqG='PIG@t)7g?ީ<2d/Gn[ݤo =iηbx4o޼'6aFYAI'@!aٛ<ʉ^y:S'(//>YΖXR0>0g۷/q4]n_=ښ(kDSA9çtBT3 kҥt;xgp'x&rRYxwx_lgMwq9ʕ+Ȍmfeem4oA9>tBlgXm7HYx&ϳN|]r@9UWf";xwx[V(g?O:Ҁ55["Ĝk*ޛgyaRg9,WO:qBk({ӦMt饗:I8襗^Ri8{yٶ';gwnR֭<_}U?Wa+X e lm}i3*+4C){Q=zI~ؗ^vG`; e*4JFeza%x6`tg883,KtLu=yk*[g}״PC:H|0$,SO:~@_4^^n]veE@9CFlR{ƹ6;{ꝷ;̝;φ c3eufXAy,,uZO:K뭲46l߾N7v]>qbi顝w}d_wxwϼWWWӄ 'kڴ)9v%H*Z%V>7%*4Lsg'K&Hwj4j(w^Ak{|0<';{❳y'=SԡCSXX%'BZ-@ؖYxDGtkv҅5E]; .40Ő@PO:<#4PV?~mԜS߾}4f*wx콲;?ъ+C;hwi04Pa( ( ) xdw8-[S^^N~[LPy X-3wJyҩDY!*H,/7!ӱcGzW֕QL?ݡw矧;tW^y%mڴI]]LRj7 XA8h@Pua' UX>7s,_7wM8gQBYG֑FaU3s1NA͚5T[[ԻMF ȿJ2xҡXmȰ4qcyx}ў={X(!;w1cy|LxëɌl${XAڨD=V(3ӓ@vATͬg9s)S~3 ƃ(oElTږwx9UW]{Jsڶm9ڻ EkPmR|bO:IgXY3n 8=qyS헟O_~9]V;8^|]=>?|:MvꩧҢEx+BIs$R&]t& XAqh*f`#L+gL۱'hKmg;t=xwxWK{|rY{HK8Ur- XAZ3@PJӓ@Krh{6:꺁\ /tޖTQQe)G:qj;ûཾlMIIW\Aׯ'.b[;}  m9n߾nFjҤ{Gqq1M<ݙhق4C` \@Pݰ@&')]#m^졇VZ9%:t(65eA&Ѕwxy\jРAL=N>+j9(#< 3bC'$3H]rm%Ή/^̉(//O6wӄY=gZ}齢s`e[f%7l`0i'$V9P$}R%Zb@RzeeeNѼ<.}eo8.˃i;w\GN|3D/<<$êdX3Ix b+媪*=j5r:t~Kc@'/=!վY裏Rv 8GꫯxT&xs3si .evlwAm#{x߱c 6*6m?ʽiwe%)K= m,6݂ x2tITW^&Ͱh[i5554m4jٲӶ/((nmf7ǛiI^=/Sl̙3yu7.ouXA6!? UdI fɕA9C('H:䓝.Nd/\nwv &{*~!7qϻuFK,{WIYH$d W“@"(N̫2 Z9<묳ٳ'\)ٻε.]IK˗/- \Z#Ÿڻv)Eû90gn޼ӾɛFǽnkIem@m( c kPzn3g_OiɜX/z-mwx:n8.-sYQFqp/۽^1'6 /O: .1Y򒶄5aeuR?τx#| m*ޕFKU+ < ! "A!Q1 @  90  ( DD<<>|wx.UW{nZ{=w:oSEhN^{*Zj1cdQ@L,taϳ ʄ7[ظ~r7ߘ_~4igy}Eᨴk76NV5k֘^z9[sꩧl,1'YTtwa`GTszHH2 ZdQgHA^1H.8ϴ^xf<<\yDP3҈ک]mtΛ͜93ƎE>!?3dH2Ax,tJ~6`O&M^fNkfSN[nm>ȴ wmNԮ>uTӢE 着;,tP|-2˥lH˗޽{#lԨޠ$9*X~ZS;%2uq +Dq=.c=xL gG ɨ3RT7(2.g52ի.ܵkMQQϳvfܸq(IJl+ ݩjnjÇ5j8]KewTva%•! ʄ (V)lJ xm Z"c{}*U8b? .ggTvvjOyݻ]we*U|Oeqqvv駟ݻ;r?Yp!huoח>'@' $]KxyCvEVVuɒ%sg|ь) 활MԞ᫘{zl x+V@CA]Ia%ΉAx֓An*{MYvȌ/؛ƍ7|co"6Ç':[ 06m*Pj%gmfRAE@  BЬ{gUoߎ7(Mty׭[L0٫h˯v>kN:$*ٳ ox'V2I\ <, twU n.[*_Ws?y#7!iN{ 6TXg3<ٷov^۝юNnFK=9rAEIz+3d:dˀ |9䓝~o&w^{r{S{n;v0H&_~}3vX SȦKd59Axy, t K9 of"lkk G$iРgfc6nh];NUyI@{Ar U>msEw_co `ŋ#KS{?sg;:ϱhw!SxorP-_V2mȁA9҆L*}L܃ CMLSuJ,G,ZȜs930T[ݩݽv_4k̹|sw5/)%1`%¡Agɂ ɨV!To(ΡiK(q뢋饗^N}^z%dvyCwvvڏ=jƌcj֬ԧ˗/o}o=q6WC +D Y& ⼐%,:`ʹb.|Wz\CLE뫯2QTTGȴ[S{<1T^ݩ/yӝwމôzM'xE.kV2i|X\㊐7*T0<9p@Tvt2dxq>\:DfJٌV2ɜπ5n yԓA.3vFvsj 0/[uf۶mawjӎ7o6s6n혱Zv5ȍZm%dҸ1dQ@9xHi h*Ud`U3<?ҵjH|n5jpW^yٴiV{"Nk_zK+ș5k:dQ!I!D.b 8.Ɂ:Gծ h7;vt#m۶5K.E3l'Ԯӎqe˖{Sܷ.'ӒcRe V2iDP)䫞,tfɯy ٮ@Y֧(K,1]vŜIg>mڴ1gFD۝3:΃ղe˚.|嗴V}8N1c9dyF@9BzHI*@y^G/[ RvB-鵣p߾}qw>_FЪўXS{zVǍ|l F= 0iwAH3QIc r!yH296lr4[ŷ*vgS}y #*N:jժѣGc4F{bN~Oʕ+;Et~ݻiwv0 ;K0t^D0jOI. ]#7=ڍB{ l7͢?^;:TTɥ }Eo iwj]of磗Vj{1diwk:d<ǀL"o "Ghr' $]eX" A0 Wi]>e?#5]UDbGڵMr5\Q%;vZӧO 64'OFJgt, &Nyē@.KKMo$K RyqϩٶAl5jj]][Ld8> Ǟ,tao ꏪLM˺, vi߾sj׮i/8vp޼yUV ݰi K&Ú8ڐIJ ?d3ֶ̦QoaY;榮Y}dCя~#3e E;9SwؚM6owڳD_r $Z@9@OIS,o4쵍T=ǚ,Fnoذ\q}N:g iko̤IL5_M{4ڥ[vfX$qvZA=Y$Gٸd3!\ɚF8zSڷo뮻woRHc5ݓckxX|%ݭvY d ]zx(G_ m{ n lD&3Z\ Iw\%j^&mI6s xw%-J}>gӮ];/|X6o,Y$vIϰISAČ!7{H N*vq.ԏ볰nr7mzsǓO>L>͘ew[oeU|tboߞ({]Qdy5V2Dqm,t3fH>*eҽVU0.@Щnv[lέN"}?]jaw|ȑ#E?F'ٔc1&j{h +tN"fr' $p̙€z¨m.d#(2U嬵?8h4 [\yꩧ̡Cj/))1?5;?IW]u՗% yow_+zd]S9dr@1ゐj7Rm}jժV>ҵkWg@gѦF.}A1ct[3-[t֩S7ȖW欳β-/mΕwvɢbF'>ƦKd99 qq},taB,lvƪM mٝ&!h29J8ڽ{w+hܸ㏿toE@>ӟ {>~6i ˒`2i,;0`%IWgX5]|U0Θ29Ntl8ZK=͸qPJҎ.{/2gyWvg0wGg=VUðaìw gҼF]ȀL:3 ' $]x}R ljߏvFdGI;L4-DS[Ax̘1VZf׮]w>.(uAͤIPvvJw_{5\+j} L&k XIA4]GȰ׮/-֎~;&k=z[iG &4ho1 |7jϬZ[hjdf͚<1$Ҿb sg[i9PWk'QVdU%lD& Xc$ xyCv9+[p_Q;#Yok֬i,Yvd̙_|g-Zd:um۶ŽpHϝ;TRPk hRfXB"V"vĀL:K.Y[Uda`i k5f}:ZժU?@3R/6?OD`a:_)))q%4[haLݽ_ yX8ggr7z3w2a%ʭA|$ UA]T~FR?nBYpZݺu>?رév$M '`FQK9x ::)2sp6m2:tϺ`\ӻߙ *_,Jճ_a%F1`J.VEIgi j7t} Ic#Y٧۷Ο??{5w2aJ~Qig`?Ԗ'xy'`Krӧ̍E_@Wkǿ3vY)d%2idJĎ(tC~4vh{az/Krl{3ŦW^Ng"KٴiS3{l4_6Xjժ_|ы/g2f̰I"VX0`%Icm#6CMF{z:0FX{gy&έ:.oZ?Cco|uլY&[ F(x:.9wgm޼cΫE'w}]KV2i\D' $: nX esJҦ6:*o7l`:vhyr)ij ęCd wpOK ʨ'Ol6l<#a9w앿Wj'|^{h'AKɤrY@1 dyl h*Ud`3ˀ(6ggeLaϞ=7f͊Wu>Ƿr CA{>}v3`d>ڠFfҤI(߿o(_h4敿lw)h4P_0V2i\w`J.Ɂ:'=5|MX}8K/8.Y7qvڴih伃E]dVZ%hgsٲeK.K[nm̙>1zh`m݆3^{dZrl{~VlaJ& ,ddsX @?vnRwi6aPd~ߠL[/۶m&J/_]3/^z*/xt.>osfwqbƘsXɤr^@1w},t Pl^KmFVhCPa=֣[ni}ݺudO?tdu|A 9/t3ڵtR/W[1L.da@1㢐{ҽo t;1^snfQܔ /tׯzO4_1=谒Y(2.ۓ@FX퍗۠~{Z<\ (nUUUs#6.E n˗^z%>fȐ!>(vw_~ykҽk^_f0EČZ./OK5q!'(2@I9,h"T[k'L!Vk 9A[(9r?D'3tO>$WTn#o;j׮]. b[oY#px'76zyg|QmJ 2e ^Ű{LC!G(2*BnddqR͓fq~ãמGXŐl4WN#j"닮(-[Z} "p\XĆΝ_f:n&ڷo,Y^@K#e팰YAՓ@pX58cڎ'kvYr9DT Ij~YGt1GMhd[_Q5w;p5yu'u m.2ٰgϞnݺu8{vu˰%c +%D9&OI*UWNiZ6Za\˕W^iv}ν8n1k7IQ64IBjh⍌f͚b]!Ưy*j_vڙuuu.Xjbbm'|HGιޑ:fq~Ygwob]35558/&"JpT\1쮩7 Kf*OD '$vX5h͟VmؽlHmذu:Cp=ι(A&5Ç|_:ٯ_?zj59/oߞ])je|ƉV2k<ʀ J=Y$êHU9v@~(P0[Vҗ9l*9;s_biW\˶Miܴi4hPco0?'$>wvYr֭֨gݷo_*wsC±6dָ?䠀 JddRP3T2#VSNqk$HD7W8Q&eܹɓIkl9~IkZى9眓{Aquuv/5ӧf> zؽcRҩ5d;EA{HҋKF_f Zj|E*|;v&jJXoqXVVP|ؽ 7v=fgyu ;.ڐY֐(&{H2YUn~$mx4QPEJPenIgl^1\ZUUb//$ Վ؝q^9 ј qjkkYRcR_35 ֳ8?1kC6%YD p'$aGPuk5?={ܵ^k:Og}6["-FJQٳgc.5Zy饗LYo8p vAQ_uX2|#Ac=Y$*o |n֮ڔ:EdB$ uwy'yc#7Aj1뺓ݙK{yOݻ[t)RSoRjG=̙3,\d̦Kdָ:d Ja,Laӽט6*uipَ 2ճt?~<6IkF̽W_E$/߿cϞ=7\?{)wĈsҾ}{?̤݅pׂa%!Q\' $pX.i14vh S7xÕzڵ+i톍xlƍa[/lm۶eԎ:K.tnzʙ"jlV2\Y@%@G=Y$tUg )nvXT0qȐ!sӥKdK/-[믿^HUєv:acǎL۽DFRy=z;tP.{D+e DOOI&鰂4.%zW]wE\veZH3im^ӎ13fp:t(ܹ{ꩧEov/v/t6oޜJqE.吟g +5 Dr' $JLl@؊Yqja<說No>i]Nvxb/|(_~eڽDWZ:קBAkXɬ* ,SvtE{L~ְYdE@%BOxH21UnM?՞_8xy湶mۚV9h]2+ ޮh1׳v-Y$UvWԦZ/$a%SJ9* ΨfCHk&֮];}-ӦM8~*.j:L &š-(! yܓAIװj)caAeÆ Ce*Bjϡ`#g&7:vί% c0BvL;R?; 7܀zLTia%tXRk!z H2 U`}M*Nj`;~_VV~iɎ.IckyFbot3giwO'ί5>m4`F(ϳK0%E@%ĠGݻwwկkG6H:_|1vϣU׽]r̦KdV8/d JOIׯW? n{MZQ~kds9ǽ+޷5n)$_.|݅4۽H1W˼Ah$ַFm&V2K; ٓAI9q:|(1haqsy͛77'@.W31OYMZ; 4('Bki{QkZTnٲ1cv`Xɢ B;ꢥqz# _rp`S=vOZ?ׯ_?ZWWW{iw`wì~ <, La՗"r5bVkq?#7|pѬgժUqѮy(j}݈R{ힴ%K`,itM^=z[oLfC&x(H2(6D&4UV't'Nv@3_vjo2ڑԩSv*Ҙ3JkC  FXz輢Z!F 5g?L\j& :ԴQ{cwI^|_ZKW .ۓAIְjfiY@3&s:ٰOي&<3R˗ڛ-[ZYQul!XJfs=Bndad!֨iz]-ڥQ{fn`?A Zڛv.]Եi&}#0KGtuV2K7 O9k, ,êHNMd)h1N8#Kb۶u8ihh%ivjoQ>eԤYQ{]ISTda%ʯ Z\ ɤ"vwb)4)HDTysD[nqG)D4$vGNe\`>~+V(ݵdZl)dVx*䀀 T)B{͆ \>}Lvt۶m>`;vDvjO={Zg1P ڈeV\!谒idqdMdP~~ãoT;P[[/lڵkWf͚ CesRک:u+W4gLcǎ@ԔckB 5 0ēAaSٟ7ؙ|v1թ=#.si6^ک=P:i$S}{fܬY0vG#ƜJfKB #{8H%iH%^ # wڵ3[ou5_'iWO<.S; wV6+:w^zT=b߂% " &d' $Qfܪ͗˳a=zlٿ :L1M&S;Gx ƌf=)Ƚg ]ɬdȉAx!zHH2`yn"ip!7rHtm.]˗ 鍂~6↔کڑ`ԳRobiR;谒Yѐc -Bdd!# z!ɕdZnVMj˖-ٳ\iqNԮԎ=ug-HÀ{LfB^ghr'$ H@i7UKܐvƼճ:4ou2P8稝ک=}34uIjʏAL;=Y($Y̦K08ߞch߀P*D&<ȱ)S;۴^bz^RLDXsX2\:~O IUXkO!kFe+VHM@NiS;H… M7jjj=& !ڐi€ <!{PH2`qdԲ5[7՝3g7GQ H[{:5ǧvjiG=ԩSs}$K#e팰iԀ |cǎ@W25dy*䘀 <"O IztI+I͛7޽{lVYYl٢ol0FZک=^z1_|۹sg2 *{s+5 Y``23*l͕'U4FajVZ%iir}\P;S{/^ڵkg i$Ф[R#=i榐=c&;}_ĬE!$(jvj/v_og} ],fDiű6dyW@]ȥ,̓䍏m@}}9rF[m|FLϦvjkG:/YM8r$@vn7mkM~\uu0_1"4]vjvOtO܎;,䈵r f.JBdᐤa6= |NĦ]8l0~ŶK׮]ݟgDj-9SI.NvK-Z:tԬY3w 76?vtN3.iĀ R,9rFEq\'N䬢uڴihSХ:+.0Nvܟ^8O͛7wsPڅvׂa%ƣ!"fN<]?ɓ')- ~NNԞoM2ce.*Z.i=A mC.d%*9(.M_NJK.u;wmDezԭjRu@}]f>@N)ӎ_WMp^Zp/M.吟g +F"xؓDtX博~|Zrs-Ν;.b;@NԞR L޽{]v9R*Pa%<; b'$-)HDzرc9udiNԞr\Mn 3-݊` +FC@)!OyHajDE˼Wԭ˒ /ԒӣUm:Rj4S;\c<`nu|#YJ3C"hr' $835R#!xb׮];SMtOMO4ajvjψz|SNNʧ]}6ՑeJ065 Yȅ,&4DXz#)a^xsmܸQp7Q)?S;gLo***L*gjuva%ʚUA0-L+)F;XJ#?kjj܈#LWZ< F}?jvjϨvdq{ܸq\]]]}&(.>.d=dۀ RkCxH 9[pLyw 7m4WVVj @ݪ& Y*-?/'S;gT{CCLmڴqf|VAxuoק. "87fOIjVE44^\y=z4"1;Ziejߗک3$C5gYFҧ??#dABdAai*ii׭[ `ty|W|J=VeT%w=GK5%K zUCeK[{~a6B@(uX%1쮽+sM6k&93fУ } Eq+w=?3^yyyf֬YOǩ{aJKAP=Pgρ ,ߢKZ~j*Ӻukx=CisCZ5Bw=o;t YcYw.A]`ZP=QeU  eêE$H/I؏?ާ~hEx;sԻܹ\xuי={(ӻ{0G.pSP=QtC]w9:)tj_ZZjF!9X[۶m/[g%6v 9]Y}]z> g-++ӣ{s8^+LIP=ҝ@O[S8{׼6R矗MټTt-"r.9'N+u޼yZ^IsٰB|!T˯ 0V[\I7N[t)**ڬ=9rDXP%BjyPؽ{>0>ܹs楗^~^EE^~eR}/U;w#©S̳>+OԳgϖʦiS1G.’!Tm  @eŅ*"%5kHtqѣg<4d_wg~AsM7y͙;v4^IذBLʷO  Ɇ5Q^!<۷o7_~ի\ջ\]5w=v͛7{ϝ{.bhra9m!TX Ɇեמ\17]Q‚!.r9"wbSPP57NzDc>1}X!tf)ldVEL6{Θ1Ü9sFS= ]#-Iw,'O[-Yfi޵dž !3ǒ!Tg.p$8&-J4?)ڊ BJCȀw|5޳I#Iw''UY 7l ss6_aC]B9ف :#i[׸ITGZ,t3$xǻכ.]xͩ 03_Z +̯B9;iouLa1E^T>|-ZHea煨1?My5*x;^S"˖-3M6:'Of;5*[p$ E刺[2 Kꫯ*=S{)Sȵ\@zxg?~K=6k̼ۦ-]lX!T&GXV2|.%my>>託#FH\|W"7x;̭5JOuea?mm 4Y5B(D{L,BFBk֭O>^~*wߙRx}o}Qd1woܸt;~Ҿq KRX!tGœh殻^%7TjT$mc-ZYx;ޫ̻]hw˰zH*{' K^PeM @߰ (1L^̙36nؼ Y.oq{ngxOG$4ilZ%UDN]B(TXDX[*QtIm!|۵ksذa$ͻ_:-\x;}޽f^soΝ%53}X.Pji!h) d EN"jϞ=}ӸG>oOXg@Ҷ9I|p>w{yꫯ I/cǎeGrX!&D,sEȍ9b>/OEEEfŊ{x#;7&5x^\\l ?~<@k}F[2K!G bVH-F"}^yӤI~@[$z8$}lwJ8q<^G5kfΝkV"@]` lGÁ L5*ĤD.?c[no**ui 99/iQx2;t`6n[蕕@([ BE@'@e2onzꫯ6[lqݥ}R/.sͿw{/0ݻwzg㆟K%TFud  au<{G|%K(S7_9lµhKwgxrw޼yQF^sĉ͙3g(kVBm9ՁW lXoo_|EӸqӍ,zDwREH6wWN:ez)eٳc9 !I 8 !}N~CvZӲeK~T$dλ.}AH\x;ޫ{II>GvM̻DX!$J,F=A ۰ .Ǹviu+B:YW]<8ЯS_wnl׭[g.2|РAf߾}.-z _-"PLl dȆ55[9rDHZJ"{& =~]|no}x{zd/6^-ƌ#-ɒq&Bʷ dȆ9ߨܼ曾yRCJæջ }vGX#wzϺi>{ye%E2V4VMN[:GJ dBo97_fiժ}n9tsk4IZmx;}GW5kN'< EJUH`Ç.;v{Szm޼Y_XJ%gL}F ^n%w5}cǎ^s% Y!@-8Z;w{^y͚53˖-մmbS :uc}x;]Ք盦MMرchp6Bm3BRF6I7xë_42e,bHMП"J/.-ڊB;w_慎|?n883gۜs$j!@.0aMRO>1:tm&9RJj#-kEh}Gwט]vyg֭//V;#PbM dB#VHȞ={̕W^uN:ݻw'G+mc~ݣ;*[mz}V܏*Pl*Bnd9wG5>WK.,\PY@~Z5xnzΜ9E^&M2'N7.AMRaykU rٰV`Uu{Nr(3h npx;^ޝ:uʌ?3I&w! A!?eP.~3zjU&+kƽG2tٯw]O?T(y}V <ݻXafŖu d`C9sƌ;Z52/Nԋ0\%mե2uӶw{zy3w\:Or6PLBU2! ,>fΜ)6SNrCU~AK.|UGE1wWw-y":a>R魷ޒ lXe!L7[#H 6֭[{:p@%Gv>O[9C18tR_x;^<~F"lb g";sUeM rݻwiyD >V;9i<]t3o6} 3#Pk"9СCMÆ SiӦoU+͘,\\3G!x;^Uޕcn-t$UcBPh)Be=@)OHK^IMR^"6NWtxݏךt6kNWn5.2 0+jԹN"C6bI\sqȘm:]SךNw$nqI|ߏ"Jh.ޏIqx't26 fQԫ~[MR:w $:](-26Wwxێzډ:](~;Evn,5Io)>/2<V$i-ĚOإGqIu:^dk'V$p?"C@MXat4~Sdg3V$R P8VcI!v9FjKMX+2$H'^L>TQ\"C M5JA/ &g$n 0(m,6I@1.2zjԑ^O (0.6IXgbȐ0}0$uQ||" t|$uqȰ&Iobqӧ/cbMzB,27$-WEێwbIR;}VNĚK$ Q 0JRqmMb|YdO% q _Mܥ.2D1$ijg4Iҿ:h!{o6I.2C4]$InAqB$=+UdOr$=x/E5IҮ:I諭xV%ioE߇wcՈE.**jŪ+VTTb^ ^jXU1*ZQ"ы1"F㰯?d̙9/|_߯/i(NXu(9La%IZ_r0H OouũX.rt_Ʈ&Iݗ&?@$-GX&Iڐvb>$Y_5I҆'-r8&Iк8w @eQ5I: @U|$.ģ"cP0. M)u~<.2 U܈Mw~w7kU4hhPtMTK X$lw\-2kUjb|Wd8a%ދ~$@(2 i%6IDJ)2$ab[$MT] ( ǀ%ir}aa|M4xRd`cWbI0.&Iq" 籫I^EY-O$iũX*2>Os9v7IL4ư?ċM4sN+Pص$I3\N+Pbo]|Ϊ$_]b|`;4ĠX+Y$X'Af0.Ϫ$iǃq^*Izz;$Izzf-2ht'$IZC] 0qѝUI(:7 0V\5IFP/ǭ;`I4"LMtM jo\qxx$IB\u <q̝UI8b|$Iж8"P0nAwV%IY/R6IT~$9Vϱ$I*q`5bIT}W_gbK$x{j (qIX$MRVj&I5~ 0uUl$Mp80.&I{Qq%I4R,0LUI4->" <ݭY$igb K5If." .B$i@\^+bk$ijYv'zX7 f_&I^zDQ|/4I+1(20͖1$I35"cfU%Iz⭸_d`ZάpP$IҠV|YKy4y7[l I$=9i y!U$IXɎ|k?"C.0 CɛTI$=+.OJ$I4lᜱexٓH$IԊnQ,ym~a˯$IF_]aI/?$Im<'zfGdL\慬H$I y% W9-O$Ibi"+r1wFd~\C6fR%I*岅M0Rf-I$IRoc\sy5s025$Io-Ϧ\LFd^nζs23Ғ$I$ID6dWXgfD7,|\1慬H$I#,ssy-T{K99Ye I$Iғh2k%|s3?davQ^f2K[+ٖY`*I$iTZ/׊˧9+?\n|NXeowW$IBm,Y5٘mٗwY\˭X4/ȕ3$I%xVٖٗr,'s!7]3~dwr%_Dy5;%kk*I$IiY&2ٚ_i>˷30r'r-r!g-Hײ=2H$I^YYMy>۲=/ٗ7s(G|eNl.\ۙ 7빜K4O9cS2[9&2*I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I=8$+lyDIENDB`PK NN&}} e2m/main.pyimport configparser import email import imaplib import logging import logging.handlers import os import time import uuid home_dir = os.path.expanduser("~") conf = configparser.ConfigParser() conf.read(os.path.join(home_dir, '.e2mrc')) mail_dir = conf['DEFAULT']['maildir'] logging.basicConfig( level=logging.DEBUG, format='%(asctime)s %(message)s', handlers=[ logging.handlers.RotatingFileHandler( os.path.join(mail_dir, 'sync.log'), backupCount=1, maxBytes=1024*256 ), logging.StreamHandler()] ) log = logging.getLogger(__name__) tmp_dir = os.path.join(mail_dir, 'tmp') new_dir = os.path.join(mail_dir, 'new') cur_dir = os.path.join(mail_dir, 'cur') lock_file = os.path.join('/tmp', 'eamil2maildir.pid') def get_tmp_filename(): return f'{time.time()}-{os.getpid()}-{uuid.uuid4().hex[:16]}' def notify(unseen, _from, subject): msg = '-message {!r}'.format(subject) subtitle = '-subtitle {!r}'.format(_from) title = '-title {!r}'.format(f'Synced {unseen} new emails') sound = '-sound default' icon_path = os.path.join(os.path.dirname(__file__), 'e2m.png') icon = f'-appIcon {icon_path}' cmd = '/usr/local/bin/terminal-notifier' os.system( f'{cmd} {icon} {sound} {title} {subtitle} {msg}' ) def truncate(conf): files = [e for e in os.listdir(cur_dir) if conf['email'] in e] log.debug('Before deleting: %s', len(files)) files.sort(key=lambda fn: int(fn.replace(conf['email'], '').split(':')[0])) for fn in reversed(files[int(conf['keep']):]): log.debug('Deleting: %s', fn) os.remove(os.path.join(cur_dir, fn)) log.debug( 'After deleting: %s', len([e for e in os.listdir(cur_dir) if conf['email'] in e]) ) def initial_sync(conf): state_file = os.path.join(mail_dir, f'.last-uid-{conf["email"]}') mail = imaplib.IMAP4_SSL(conf['imap_host'], conf['imap_port']) mail.login(conf['email'], conf['pswd']) rc, data = mail.select('inbox', readonly=True) if rc != 'OK': log.error('mail.select returned not ok response') return last_uid_str = data[0].decode() if not last_uid_str.isdigit(): log.error('last returned uid not digit: %s', last_uid_str) return last_uid = int(last_uid_str) start_uid = last_uid - int(conf['keep']) for uid in range(start_uid, last_uid+1): _, mail_data = mail.fetch(str(uid).encode(), '(RFC822)') email = mail_data[0][1] tmp_path = os.path.join(tmp_dir, get_tmp_filename()) with open(tmp_path, 'wb') as f: f.write(email) filename = f'{conf["email"]}-{uid}:2,S' os.rename(tmp_path, os.path.join(cur_dir, filename)) log.debug('Initial sync, marked as read: %s', filename) with open(state_file, 'w') as f: f.write(str(last_uid)) log.debug('Saved last uid: %s', last_uid) mail.close() def sync(conf): state_file = os.path.join(mail_dir, f'.last-uid-{conf["email"]}') last_saved_uid = None if os.path.isfile(state_file): with open(state_file) as f: content = f.read() if content.isdigit(): last_saved_uid = int(content) if last_saved_uid is None: initial_sync(conf) return mail = imaplib.IMAP4_SSL(conf['imap_host'], conf['imap_port']) mail.login(conf['email'], conf['pswd']) rc, data = mail.select('inbox', readonly=True) if rc != 'OK': log.error('mail.select returned not ok response') return last_uid_str = data[0].decode() if not last_uid_str.isdigit(): log.error('last returned uid not digit: %s', last_uid_str) return last_uid = int(last_uid_str) log.debug('Last uid: %s', last_uid) if last_uid <= last_saved_uid: log.info( 'No messages to retrieve: last_uid=%s, last_saved_uid=%s', last_uid, last_saved_uid ) truncate(conf) return else: start_uid = last_saved_uid last_email = None filters = conf.get('filters') for uid in range(start_uid+1, last_uid+1): _, mail_data = mail.fetch(str(uid).encode(), '(RFC822)') _email = mail_data[0][1] tmp_path = os.path.join(tmp_dir, get_tmp_filename()) with open(tmp_path, 'wb') as f: f.write(_email) last_email = email.message_from_bytes(_email) filename = f'{conf["email"]}-{uid}' if filters and match_filter(last_email['subject'], filters): filename += ':2,S' log.debug( 'Marking email as read because of filter: %s', filename ) last_email = None os.rename(tmp_path, os.path.join(cur_dir, filename)) continue os.rename(tmp_path, os.path.join(new_dir, filename)) log.debug('Synced: %s', filename) if last_email: notify( last_uid-last_saved_uid, last_email['from'], last_email['subject'] ) with open(state_file, 'w') as f: f.write(str(last_uid)) log.debug('Saved last uid: %s', last_uid) truncate(conf) mail.close() def match_filter(subject, filters): return any([ key_phrase.strip() in subject for key_phrase in filters.split('|') ]) def pid_exists(pid): try: os.kill(pid, 0) except ProcessLookupError: # errno.ESRCH return False # No such process except PermissionError: # errno.EPERM return True # Operation not permitted (i.e., process exists) else: return True # no error, we can send a signal to the process def lock(): if os.path.isfile(lock_file): with open(lock_file) as f: pid = int(f.read()) if pid_exists(pid) and pid != os.getpid(): log.info('Another instance running with pid: %s', pid) raise SystemExit else: log.info('There is zombie file left from pid: %s', pid) os.remove(lock_file) with open(lock_file, 'w') as f: f.write(str(os.getpid())) def release(): try: os.remove(lock_file) except FileNotFoundError: pass def main(): lock() try: for section in conf.sections(): sync(conf[section]) except Exception: log.exception('Error happened during sync') finally: release() if __name__ == '__main__': main() PK!Hd#%$e2m-1.0.2.dist-info/entry_points.txtN+I/N.,()J5ʵb<+PK!HPOe2m-1.0.2.dist-info/WHEEL HM K-*ϳR03rOK-J,/RH,szd&Y)r$[)T&UrPK!HJK:Me2m-1.0.2.dist-info/METADATAR]o0|XA$\Q:8ILG^XάaG^|B5 傭 `=?|R& c/4D /0^ ;BSU}ڕI5Pe+%b\]bSo:PhVY-sIf})g#7vC+6yLD#XC>|Hޘ֌m[53I0!䫌QUI Gi$ /IȠ~౜=#f[ \96ki 0^fQt{e7_{"y_v4(vh[>}jjGʑ"O;-Kն.MG\ۘ^Ͷ_\W;e˅zpJ$}jPK!H#Ze2m-1.0.2.dist-info/RECORDmKs0}KEhÈcMF)r _ˌ3]|o~>s. !9W4'U7^2( ͌8m#߅Tm@o{JYdwڛ{37S_8U0uf^NtMGHS<Ϗ[w춳S:v}YyA3UE#gHoI!둗7QFzl}hS\]PEez:'=_Rǵ 4> ޽Mxńpx7B-j85vm3U=J<;w]6h.Ʋ3Q|/i J3ڱWPK#NN!rre2m/__init__.pyPK"FLiF e2m/e2m.pngPK NN&}} e2m/main.pyPK!Hd#%$Ve2m-1.0.2.dist-info/entry_points.txtPK!HPOe2m-1.0.2.dist-info/WHEELPK!HJK:MBe2m-1.0.2.dist-info/METADATAPK!H#Z}e2m-1.0.2.dist-info/RECORDPK