;ò ø™®Ec@s¿dZdklZdklZdkZdkZdkZdkZdkZdk Z dk l Z dk l Z dk l Z dklZd„Zd „Zd „Zd efd „ƒYZdS( sOMaildir compatible pending queue format. http://en.wikipedia.org/wiki/Maildir (s parseaddr(sglobN(sDefaults(sErrors(sUtil(sQueuecCsdG|GHtd‚dS(sHandle an alarm.s!Signal handler called with signalsCouldn't open device!N(ssignumsIOError(ssignumsframe((s./TMDA/Queue/MaildirQueue.pys alarm_handler.s cCsti|iƒtiƒdS(sDo fcntl file locking.N(sfcntlsflocksfpsfilenosLOCK_EX(sfp((s./TMDA/Queue/MaildirQueue.pys lock_file3scCsti|iƒtiƒdS(sDo fcntl file unlocking.N(sfcntlsflocksfpsfilenosLOCK_UN(sfp((s./TMDA/Queue/MaildirQueue.pys unlock_file7ss MaildirQueuecBsntZd„Zd„Zd„Zd„Zd„Zd„Zd„Ze d„Z d „Z d „Z d „Z RS( NcCsti|ƒd|_dS(Nsmaildir(sQueues__init__sselfsformat(sself((s./TMDA/Queue/MaildirQueue.pys__init__>s cCs&tiitiƒotSntSdS(N(sosspathsexistssDefaultss PENDING_DIRsTruesFalse(sself((s./TMDA/Queue/MaildirQueue.pysexistsCscCs||iƒ ojti}titii|dƒdƒti tii|dƒdƒti tii|dƒdƒndS(NscuriÀsnewstmp( sselfsexistssDefaultss PENDING_DIRsdirpathsossmakedirsspathsjoinsmkdir(sselfsdirpath((s./TMDA/Queue/MaildirQueue.pys_createJs  cCsdS(N((sself((s./TMDA/Queue/MaildirQueue.pys_convertRscCsû|iƒ odSntitiƒ}tiƒ}ti ti i ti dƒƒtdƒ}ti ti i ti dƒƒtdƒ} ti |ƒ|| }xS|D]K}dtiƒ} t| ƒt|ƒ}t|idƒdƒ} | |joq¨nx\ti i ti d|ƒti i ti d|ƒfD]$} ti i| ƒo | } Pq8q8Wtiobytit| dƒƒ}Wntj oqÌXt |i!dƒƒd }ti#|tiƒnyti$| ƒWq¨t%j oq¨Xq¨WdS( Nsnews 1*.[0-9]*.*scurs%ds.isrs return-pathi(&sselfsexistssUtilssecondssDefaultssPENDING_LIFETIMEs lifetimesecssossgetcwdscwdschdirspathsjoins PENDING_DIRsglobsnew_msgsscur_msgssmsgssmsgstimesnowsintsmin_timessplitsmsg_timesfsfpathsPENDING_DELETE_APPENDs msg_from_filesopensmsgobjsIOErrors parseaddrsgetsrpsappend_to_filesunlinksOSError(sselfsmsgssmin_times lifetimesecssrpsmsgscwdsmsgobjsnew_msgssmsg_timesnowsfsfpathscur_msgs((s./TMDA/Queue/MaildirQueue.pyscleanupVsB      7  cCs¸tiƒ}titiitidƒƒtdƒ}titiitidƒƒtdƒ}gi }||D]&}|di|idƒd ƒƒqt~}ti|ƒ|SdS(Nsnews 1*.[0-9]*.*scurs.i(sossgetcwdscwdschdirspathsjoinsDefaultss PENDING_DIRsglobsnew_msgsscur_msgssappends_[1]sissplitsids(sselfscur_msgssisidsscwds_[1]snew_msgs((s./TMDA/Queue/MaildirQueue.pys fetch_ids€s   A cCs]|iƒ|d=||d<|idƒ\}}|it i |ƒ||t i ƒ|d=dS(NsX-TMDA-Recipients.( sselfs_createsmsgs recipientsmailidssplitstimespids_MaildirQueue__deliver_maildirsUtils msg_as_stringsDefaultss PENDING_DIR(sselfsmsgsmailids recipientspidstime((s./TMDA/Queue/MaildirQueue.pysinsert_messageŒs   cCs—ttiitidƒdƒttiitidƒdƒ}xN|D]9}||jo&t i t |dƒd|ƒ}|SqIqIWtd|‚dS(Nsnew/s 1*.[0-9]*.*scur/srs fullParsescouldn't locate %s, will retry(sglobsosspathsjoinsDefaultss PENDING_DIRsmsgssmsmailidsUtils msg_from_filesfiles fullParsesmsgsIOError(sselfsmailids fullParsesmsgssmsmsg((s./TMDA/Queue/MaildirQueue.pys fetch_message™sB  cCsuttiitidƒdƒttiitidƒdƒ}x,|D]$}||joti |ƒqIqIWdS(Nsnew/s 1*.[0-9]*.*scur/( sglobsosspathsjoinsDefaultss PENDING_DIRsmsgssmsmailidsunlink(sselfsmailidsmsgssm((s./TMDA/Queue/MaildirQueue.pysdelete_message§s B cCs·tiƒ}titiƒtdƒtdƒ}xmtdƒD]_}xV|D](}||joti|ƒt SqLqLWt idƒtdƒtdƒ}q?q?Wti|ƒtSdS(Nsnew/1*.[0-9]*.*scur/1*.[0-9]*.*if0.10000000000000001(sossgetcwdscwdschdirsDefaultss PENDING_DIRsglobsmsgssrangesismsmailidsTruestimessleepsFalse(sselfsmailidsmsgssismscwd((s./TMDA/Queue/MaildirQueue.pys find_message±s       cCsüd||tiƒf} tititƒtidddƒt i i |dƒ} t i i |dƒ}t i i |dƒ}t i i| ƒo#t i i|ƒot i i|ƒ otid|‚nt i i | | ƒ} t i i || ƒ}t i i| ƒoti| d‚nt i i|ƒoti|d‚nt i|ƒ} | ti} | ti}y°t i| t it iBt iBd ƒ}t i!|d d ƒ}t i#| d ƒyt i$| | |ƒWnt%j onX|i&|ƒ|i(ƒt i)|i*ƒƒ|i+ƒWn>t%t,fj o,}tid ƒtid | |f‚nXy!t i.| |ƒt i/| ƒWnQt%j oEtid ƒyt i/| ƒWnnXtid| |f‚nXtid ƒtititi0ƒdS(sÄReliably deliver a mail message into a Maildir. Implementation differs slightly from the one in TMDA.Deliver() since we need to maintain the time and pid in the file's name. message is the mail message as a string. time and pid come from the mailid. maildir is the destination Maildir. Based on code from getmail Copyright (C) 2001 Charles Cazabon, and licensed under the GNU General Public License version 2. s%s.%s.%sii<stmpscursnewsnot a Maildir! (%s)salready exists!i€swbiisFailure writing file %s (%s)sfailure renaming "%s" to "%s"N(1stimespidssockets gethostnamesfilenamessignalsSIGALRMs alarm_handlersalarmsosspathsjoinsmaildirsdir_tmpsdir_cursdir_newsisdirsErrorss DeliveryErrors fname_tmps fname_newsexistssstats s_maildirsST_UIDs maildir_ownersST_GIDs maildir_groupsopensO_WRONLYsO_CREATsO_EXCLsfdsfdopensfpschmodschownsOSErrorswritesmessagesflushsfsyncsfilenosclosesIOErrorsoslinksunlinksSIG_DFL(sselfsmessagestimespidsmaildirsdir_news maildir_groups fname_newsdir_curs s_maildirs fname_tmpsdir_tmpsfilenames maildir_ownersfpsfdso((s./TMDA/Queue/MaildirQueue.pys__deliver_maildirÆsZ:  &     (s__name__s __module__s__init__sexistss_creates_convertscleanups fetch_idssinsert_messagesFalses fetch_messagesdelete_messages find_messages_MaildirQueue__deliver_maildir(((s./TMDA/Queue/MaildirQueue.pys MaildirQueue=s     *  (s__doc__s email.utilss parseaddrsglobsfcntlsosssignalssocketsstatstimesTMDAsDefaultssErrorssUtilsTMDA.Queue.QueuesQueues alarm_handlers lock_files unlock_files MaildirQueue(sfcntls parseaddrsstatsErrorsssocketsglobs MaildirQueuesQueues unlock_files alarm_handlersUtils lock_filesDefaultsstimesosssignal((s./TMDA/Queue/MaildirQueue.pys?s