
;t/Uc           @   s   d  d l  Z  d  d l Z d  d l Z d d l m Z m Z d d l m Z d d l m	 Z	 m
 Z
 m Z d d l m Z d d l m Z d d	 l m Z d
 e f d     YZ d S(   iNi   (   t   IDENTITYt   GLOBAL_LOCKER(   t   ConnectionPool(   t   Fieldt   Queryt
   Expression(   t   SQLALL(   t   use_common_filtersi   (   t   NoSQLAdaptert   IMAPAdapterc        	   B   s  e  Z d  Z d. Z i
 e d 6e d 6e j d 6e j d 6e d 6e d 6e	 d 6e d	 6e d
 6e d 6Z
 d Z e j d  Z d d/ d e i  i  e d/ d  Z d/ e d  Z d   Z d   Z d/ e d  Z e d    Z d d  Z d   Z d   Z d   Z d   Z d/ d  Z d   Z  d   Z! d   Z" d    Z# d/ d!  Z$ d"   Z% d#   Z& e d$  Z' d%   Z( d&   Z) d'   Z* d(   Z+ d/ d)  Z, d*   Z- d+   Z. d,   Z/ d-   Z0 RS(0   s   IMAP server adapter

    This class is intended as an interface with
    email IMAP servers to perform simple queries in the
    web2py DAL query syntax, so email read, search and
    other related IMAP mail services (as those implemented
    by brands like Google(r), and Yahoo!(r)
    can be managed from web2py applications.

    The code uses examples by Yuji Tomita on this post:
    http://yuji.wordpress.com/2011/06/22/python-imaplib-imap-example-with-gmail/#comment-1137
    and is based in docs for Python imaplib, python email
    and email IETF's (i.e. RFC2060 and RFC3501)

    This adapter was tested with a small set of operations with Gmail(r). Other
    services requests could raise command syntax and response data issues.

    It creates its table and field names "statically",
    meaning that the developer should leave the table and field
    definitions to the DAL instance by calling the adapter's
    .define_tables() method. The tables are defined with the
    IMAP server mailbox list information.

    .define_tables() returns a dictionary mapping dal tablenames
    to the server mailbox names with the following structure:

    {<tablename>: str <server mailbox name>}

    Here is a list of supported fields:

    ===========   ============== ===========
    Field         Type           Description
    ===========   ============== ===========
    uid           string
    answered      boolean        Flag
    created       date
    content       list:string    A list of dict text or html parts
    to            string
    cc            string
    bcc           string
    size          integer        the amount of octets of the message*
    deleted       boolean        Flag
    draft         boolean        Flag
    flagged       boolean        Flag
    sender        string
    recent        boolean        Flag
    seen          boolean        Flag
    subject       string
    mime          string         The mime header declaration
    email         string         The complete RFC822 message (*)
    attachments   list           Each non text part as dict
    encoding      string         The main detected encoding
    ===========   ============== ===========

    (*) At the application side it is measured as the length of the RFC822
    message string

    WARNING: As row id's are mapped to email sequence numbers,
    make sure your imap client web2py app does not delete messages
    during select or update actions, to prevent
    updating or deleting different messages.
    Sequence numbers change whenever the mailbox is updated.
    To avoid this sequence numbers issues, it is recommended the use
    of uid fields in query references (although the update and delete
    in separate actions rule still applies).
    ::

        # This is the code recommended to start imap support
        # at the app's model:

        imapdb = DAL("imap://user:password@server:port", pool_size=1) # port 993 for ssl
        imapdb.define_tables()

    Here is an (incomplete) list of possible imap commands::

        # Count today's unseen messages
        # smaller than 6000 octets from the
        # inbox mailbox

        q = imapdb.INBOX.seen == False
        q &= imapdb.INBOX.created == datetime.date.today()
        q &= imapdb.INBOX.size < 6000
        unread = imapdb(q).count()

        # Fetch last query messages
        rows = imapdb(q).select()

        # it is also possible to filter query select results with limitby and
        # sequences of mailbox fields

        set.select(<fields sequence>, limitby=(<int>, <int>))

        # Mark last query messages as seen
        messages = [row.uid for row in rows]
        seen = imapdb(imapdb.INBOX.uid.belongs(messages)).update(seen=True)

        # Delete messages in the imap database that have mails from mr. Gumby

        deleted = 0
        for mailbox in imapdb.tables
            deleted += imapdb(imapdb[mailbox].sender.contains("gumby")).delete()

        # It is possible also to mark messages for deletion instead of ereasing them
        # directly with set.update(deleted=True)


        # This object give access
        # to the adapter auto mailbox
        # mapped names (which native
        # mailbox has what table name)

        imapdb.mailboxes <dict> # tablename, server native name pairs

        # To retrieve a table native mailbox name use:
        imapdb.<table>.mailbox

        ### New features v2.4.1:

        # Declare mailboxes statically with tablename, name pairs
        # This avoids the extra server names retrieval

        imapdb.define_tables({"inbox": "INBOX"})

        # Selects without content/attachments/email columns will only
        # fetch header and flags

        imapdb(q).select(imapdb.INBOX.sender, imapdb.INBOX.subject)

    t   imaplibt   stringt   textt   datet   datetimet   idt   booleant   integert   bigintt   blobs   list:stringt   imapsP   ^(?P<user>[^:]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:@]+)(\:(?P<port>[0-9]+))?$i    s   UTF-8c      	      sD  |  _  |  _ |	 r(  j |  n  |  _ |  _ |  _ |
  _ |  _ |  _ |  _	 d   _ d   _ t j    _ d   _ | j d  d } i d d 6d d 6d d 6d	 d
 6d d 6d d 6 _ i d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d  6d d 6d d 6d d 6d	 d
 6d d 6d! d" 6d d 6d  d# 6d  d$ 6d  d% 6 _ d& | d' < j j |  } | j d(  } | j d)  } | j d*  } t | j d+   } t   | d, k rt   n  | j d* | d+ | d) | d( |  |    f d-  }  j  j  _ |  _ |	 r@ j   n  d  S(.   Ns   ://i   s   \Deletedt   deleteds   \Draftt   drafts   \Flaggedt   flaggeds   \Recentt   recents   \Seent   seens	   \Answeredt   answeredt   MESSAGER   t   DATEt   createdt   UIDt   uidt   FROMt   sendert   TOt   tot   CCt   cct   BCCt   bcct   TEXTt   contentt   SIZEt   sizet   SUBJECTt   subjectt   mimet   emailt   attachmentst    t   _lastsqlt   usert   passwordt   hostt   porti  c            st     r  j  j  _ n  j  j  _  j |  d |  d  } | j |  d |  d  } d  | _ d   | _ | S(   NR5   R6   R3   R4   c           S   s   t  S(   N(   t   True(    (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   <lambda>   s    (   t   drivert	   IMAP4_SSLt   imap4t   IMAP4t   logint   Nonet   mailbox_namest   cursor(   t   driver_argst
   connectiont   data(   t   over_sslt   self(    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt	   connector   s    	(   t   dbt   urit   find_drivert	   pool_sizet   foldert   db_codect   _after_connectiont   credential_decoderRA   t   adapter_argsR>   t   mailbox_sizet   static_namest   syst   getfilesystemencodingt   charsetR;   t   splitt   flagst   search_fieldst	   REGEX_URIt   matcht   groupt   intt   FalseR7   t   updatet   define_tablesRF   t	   reconnect(   RE   RG   RH   RJ   RK   RL   RN   RA   RO   t
   do_connectt   after_connectiont   mR3   R4   R5   R6   RF   (    (   RD   RE   sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   __init__   sZ    		 										
	"	 c         C   sj  t  |  d d  d k	 r d S| d k r4 |  j } n  |  j sd |   |  _ | o[ |  j j   |  _ n t j } |  j } x t	 r[t
 j   | | k r g  | | <n  | | r)| | j   |  _ t
 j   | o |  j j   |  _ |  j r%|  j r%y |  j j   \ } } Wq%|   |  _ q%Xn  Pqy t
 j   |   |  _ | oQ|  j j   |  _ Pqy W|  j   d S(   s   
        IMAP4 Pool connection method

        imap connection lacks of self cursor command.
        A custom command should be provided as a replacement
        for connection pooling to prevent uncaught remote session
        closing

        RB   N(   t   getattrR>   RF   RJ   RB   R@   R   t   POOLSRH   R7   R   t   acquiret   popt   releaset   check_active_connectiont   listt   after_connection_hook(   RE   t   fR@   Re   RH   t   resultRC   (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyR_      s8    
				



c         C   s   d  } t |  j j t  s( |  j   n  yI |  j j |  j j |  } t | d d  } | d k rp d } n  WnN t t	 t
 t f k
 r t j   d } |  j j j d d t |   n X| S(   Ni   i    s!   Error retrieving the last mailboxs    sequence number. %s(   R>   t
   isinstanceRB   R?   t   dictt   get_mailboxest   selectR[   t
   IndexErrort
   ValueErrort	   TypeErrort   KeyErrorRR   t   exc_infoRG   t   loggert   debugt   str(   RE   t	   tablenamet   last_messageRm   t   e(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   get_last_message$  s    	c         C   s   t  |  j j t  s" |  j   n  |  j |  } |  j j d d  d  \ } } | d j   j	   } t
 |  d k r{ d  S| d | d f Sd  S(   Nt   searchs   (ALL)i    i(   Rn   RB   R?   Ro   Rp   R}   R   R>   t   stripRU   t   len(   RE   Rz   R{   Rm   RC   t   uid_list(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   get_uid_bounds6  s    c         C   s  | d  k r t j   } n  d  d d d d d d d d d	 d
 d d g } t | t  r_y d | k r~ | j d  \ } } n d  | } } | j   j   } t | d  } | j | d j	    }	 t | d  }
 t
 t | d j d   } t j | |	 |
 | d | d | d  | SWqt t t f k
 r[} |  j j j d | | f  d  SXnE t | t j t j f  r| rd } n d } | | j |  Sd  Sd  S(   Nt   JANt   FEBt   MARt   APRt   MAYt   JUNt   JULt   AUGt   SEPt   OCTt   NOVt   DECt   ,i   i   i    i   t   :s!   Could not parse date text: %s. %ss   %a, %d %b %Y %H:%M:%S %zs   %d-%b-%Y(   R>   R   t	   timedeltaRn   t
   basestringRU   R   R[   t   indext   uppert   mapRs   t   AttributeErrorRr   RG   Rw   t   errorR   t   strftime(   RE   R   t   addt   imft   monthst   daynamet
   datestringt	   date_listt   yeart   montht   dayt   hmsR|   t   date_format(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   convert_dateC  s4    ! 	c         C   sK   d d l  m } | |   d \ } } | rG | j |  j d  } n  | S(   Ni(   t   decode_headeri    s   utf-8(   t   email.headerR   t   decodet   encode(   Rl   t   rR   R   t   encoding(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   header_representg  s
    t   replacec         C   s}   | d k r d } n[ t | t  rZ | d k rE t | d |  } qp t | | |  } n t d t |    | j d  S(   s!    convert text for mail to unicodeR1   s   utf-8s   Unsupported mail text type %sN(   R>   Rn   Ry   t   unicodet	   Exceptiont   typeR   (   RE   R   RT   t   errors(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   encode_texto  s    	c         C   s   | j    } | S(   N(   t   get_content_charset(   RE   t   messageRT   (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   get_charset}  s    c   	      C   s6  |  j  r% |  j  |  j _ |  j  j   S|  j j   } t   |  j _ t   } d } x | d D] } | d } | j   } d | j   k r] | j d  } g  | D]$ } t	 | j    d k r | ^ q } | d j   } t
 j d d t
 j d d t
 j d	 d
 |    } | j |  | |  j j | <q] q] W| S(   s+    Query the mail database for mailbox names i    i   t   NOSELECTs   "is   ^[_0-9]*R1   s   [^_\w]s   [/ ]t   _(   RQ   RB   R?   t   keysRj   Ro   R   R   RU   R   t   ret   subt   append(	   RE   t   mailboxes_listt	   mailboxest   xt   itemt	   sub_itemst   sub_itemt   mailboxt   mailbox_name(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyRp     s&    		
$3c         C   sn   t  } d  } | } xU | ri t | d  rb | j } t | t  rI | j St | t  r[ qf d  Sq d  Sq W| S(   Nt   first(   R7   R>   t   hasattrR   Rn   R   Rz   R   (   RE   t   queryt   nofieldRz   t   attr(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   get_query_mailbox  s    		c         C   s0   |  j  j | d   |  j j   k r( t St Sd  S(   N(   RW   t   getR>   RV   t   valuesR7   R\   (   RE   t   flag(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   is_flag  s    $c         C   s0  | r | |  _  n	 d |  _  t |  j j t  s= |  j   n  |  j j j   } x| D]} |  j j	 d | t
 d d t t
 d d d t t
 d d d t t
 d d t t
 d	 d t t
 d
 d t t
 d d t t
 d d d t t
 d d t t
 d d t t
 d d d t d t t
 d d d t d t t
 d d t t
 d d  t
 d d  t
 d d  t
 d d  t
 d d d t t
 d d   |  j j | |  j | _ |  j |  j | j _ |  j | j _ |  j | j _ |  j | j _ |  j | j _ qV W|  j j |  j _ |  j j S(   s|  
        Auto create common IMAP fileds

        This function creates fields definitions "statically"
        meaning that custom fields as in other adapters should
        not be supported and definitions handled on a service/mode
        basis (local syntax for Gmail(r), Ymail(r)

        Returns a dictionary with tablename, server native mailbox name
        pairs.
        s   %sR   t   writableR   R   R)   R   R#   R%   R'   R!   R+   R   R-   R.   R/   t   readableR0   R   R   R   R   R   R   R   R   N(   RQ   R>   Rn   RB   R?   Ro   Rp   R   RG   t   define_tableR   R\   R   R   R#   t	   representR%   R'   R!   R-   R   (   RE   R?   t   namest   name(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyR^     s>    	^c         O   s   d  S(   N(    (   RE   t   argst   kwargs(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   create_table  s    c   ,      C   s2	  t  |  r- |  j | |  j |  g  } n  d d l } d } t   } t | t  r|  j |  } |  j	 j
 j | d  } | d k r t d |   q|  j	 j | t  \ } }	 | d k r t d |	   n  t |	 d  |  _ d t |  j   }
 |  j	 j d d |
  } | d d k r| j d	 d  } | d
 d j   } | j   | d k	 r| t | d  t | d
  !} n  t g  | D] } | j dE k ^ q rd } n d } t |  d k rx | D] } |  j	 j d | |  \ } } | d k ri t | d d j   d  d 6t |  d 6| j | d d
  d 6| d d
 d 6} | d j   | d <|  j j | d
  | d <| j |  qt d |   qWqqt d | d
   n- t | t  t! f  rt"    n t# d   i  } i  } t |  d
 k r7t | d t$  r7t } n! t |  d k rRt } n t% } | rg  |  j& j'   D] } d | | f ^ qn} n& g  | D] } d | | j f ^ q} x | D] } | | | <qWt   } t   } x| D]} g  } g  } d } t | d  } t(   } | d }  | d } |  j) |   }! | d }" | d }# d | | k rp| | d | <n  d | | k r|  j* |  d  | d | <n  d | | k r| | d | <n  d | | k r|  d  | d | <n  d! | | k r	|  d" | d! | <n  d# | | k rQd$ |  j'   k r@|  d$ | d# | <qQd% | d# | <n  d& | | k rd' |  j'   k r|  d' | d& | <qd% | d& | <n  d( | | k rd) |" k | d( | <n  d* | | k rd+ |" k | d* | <n  d, | | k rd- |" k | d, | <n  d. | | k r5d/ |" k | d. | <n  d0 | | k r\d1 |" k | d0 | <n  d2 | | k r|  d3 | d2 | <n  d4 | | k rd5 |" k | d4 | <n  d6 | | k r|  j+   | d6 | <n  d7 | | k r|! | d7 | <n  d8 | | k r|# | d8 | <n  xo|  j,   D]a}$ |$ j-   }% d9 | | k sPd: | | k rG|$ j. d; t  }& |& rG|$ j/   }' i |$ j+   d< 6}( |' sd= |% k rd9 | | k r|( j0 i |& d> 6|' d? 6|$ j1   d@ 6|$ dA dB 6 | j |(  qDd= |% k rDd: | | k rD|( j0 i |  j2 |& |  j) |$   d= 6 | j |(  qDqGn  dC | | k r|$ d k	 r| t t |$   7} qqqW| | d: | <| | d9 | <| | dC | <| j |  qWxF | D]> } t   }) x | D] }* |) j | |*  qW| j |)  qW| } | j dD |  j3  }+ |+ | | |  S(F   s>     Searches and Fetches records and return web2py rows
        iNs   Mailbox name not found: %st   OKs   IMAP error: %si    s   (%s)R~   t   limitbyi   R)   R+   R0   R/   s   (RFC822 FLAGS)s   (RFC822.HEADER FLAGS)t   fetchR   R   t   raw_messaget	   multipartRV   s"   IMAP error retrieving the body: %ss   IMAP search error: %ss   Unexpected query types   %s.%ss   %s.ids
   %s.createdt   Dates   %s.uids	   %s.sendert   Froms   %s.tot   Tos   %s.cct   CcR1   s   %s.bcct   Bccs
   %s.deleteds   \Deleteds   %s.drafts   \Drafts
   %s.flaggeds   \Flaggeds	   %s.recents   \Recents   %s.seens   \Seens
   %s.subjectt   Subjects   %s.answereds	   \Answereds   %s.mimes   %s.encodings   %s.emails   %s.attachmentss
   %s.contentR   R.   R   t   payloadt   filenameR   s   Content-Dispositiont   dispositions   %s.sizet	   processor(   s   contents   sizes   attachmentss   email(4   R   t   common_filterR   R/   R>   Rj   Rn   R   t	   get_tableRB   R?   R   Rs   Rq   R7   R   R[   RP   Ry   R   R   RU   t   reverset   anyR   R   t   longt   message_from_stringt   is_multipartR9   t
   ParseFlagsR   R   R   t   NotImplementedErrorRt   R   R\   RW   R   Ro   R   R   t   get_content_typet   walkt   get_content_maintypet   get_payloadt   get_filenameR]   R   R   t   parse(,   RE   R   t   fieldst
   attributesR/   Rz   t   fetch_resultsR   Rm   t   selectedt   search_queryt   search_resultR   t   messages_sett   fieldt   imap_fieldsR   t   typRC   t   frt   imapqry_dictt   imapfields_dictt	   allfieldst   colnamest   kt   imapqry_listt   imapqry_arrayR0   R)   R+   t   nt	   item_dictR   RT   RV   R   t   partt   maintypeR   R   R   t   imapqry_array_itemt	   fieldnameR   (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyRq     s   !	
$"	"%		/&			



 	c      	      sR    f d   } | j  } t d   | D  } | j d  pI t j j   } | j   } t |  d k rB| j d d   } | j d g   }	 | j d g   }
 d j g  d$ D]( } | j | t	  r d | j
   ^ q  } | sd d l m   | j d d   } | j d d   }     } | j d d  | d <| j d d  | d <|  j | d t | d <| r|| j |  n  | r| j |  n  xb d% D]Z } | j | d  } t | t  r| | | <qd j g  | D] } | ^ q | | <qW| j   rf| j   j d  rft |
 t  r9| j |
  qt |
  d k r| j |
 d d  qn@ g  |
 D] } | | |  ^ qmg  |	 D] } | | |  ^ q| j   } n  |  j j | | | |  \ } } | d  k r/t t j d! t |   d  } |  j | j | k  j  | j!  j"   j! St# d" |   n t$ d#   d  S(&   Nc            s       } | j  d d  } | rF | j   d k rF | j d |  n | j |  | j  d d   } | r{ | j |  n  d	 | k r | j | d	  n  d
 | k r | j | d
  n  d | k r | d r | j d d d | d n  |  j |  d  S(   NR   s   utf-8t   BASE64t   7BITt   8BITt   BINARYs   Content-Transfer-EncodingR.   R   R   R   s   Content-Dispositiont
   attachment(   R  R  R  s   BINARY(   R   R   t
   add_headert   set_charsetR>   t   set_typet   set_payloadt   attach(   R   t   objR   R   R.   (   t   Message(    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   add_payload  s"    			c         s   s$   |  ] \ } } | j  | f Vq d  S(   N(   R   (   t   .0R  t   v(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pys	   <genexpr>  s    R   i    R/   R0   R)   t    R   R   R   R   R   R   s   \%si(   R  R.   R   R!   R1   t   fromR-   R   R   R#   R%   R'   t   ;R   R   R   s   \d+s   IMAP message append failed: %ss$   IMAP empty insert is not implemented(   s   answereds   deleteds   drafts   flaggeds   recents   seen(   s   tos   ccs   bcc(%   R   Ro   R   R   t   nowt	   timetupleR   R>   t   joinR\   t
   capitalizet   email.messageR  R   R7   R  R  Rn   R   R   R   t
   startswithR  t	   as_stringRB   R   R[   R   t   findallRy   RG   R   Rq   R   R   R   R   (   RE   t   tableR   R  R   t   dt	   date_timet   struct_timeR   R0   R)   R   RV   R.   RT   R   t   valuet   it   ct   aRm   RC   R   (    (   R  sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   insert  s\    		 5		!
  !"+c         C   s2  t    } d } t |  r3 |  j | | g  } n  g  } g  } | rx | D] } | d }	 |	 j }
 | d } |  j |
  rL |  j |
 } | d  k	 r | d k r | r | j |  q | j |  q qL qL W|  j j	 |  j j
 |  \ } } d | } |  j j d  |  \ } } g  | d j   D]$ } | j   j   r(| j   ^ q(} x | D]| } d  } t |  d k r| j | d d d j |  f  n  t |  d k rY| j | d d d j |  f  qYqYWn  xO | D]G } |  j j |   \ } } | d k r| d 7} qt d	 |   qW| S(
   Ni    i   s   \Recents   (%s)s   +FLAGSR  s   -FLAGSR   s   IMAP storing error: %s(   Rj   R   R   R   R   RW   R>   R   RB   Rq   R?   R~   RU   R   t   isdigitR   R   t   storeR   (   RE   Rz   R   R   t   commandst   rowcountt   markt   unmarkR   R   R   R*  R   Rm   RC   t   string_queryt
   store_listt   numbert   command(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyR]     sF    	
	
	
$&-c   
      C   s   d } |  j  |  } | r | d  k	 r t |  rK |  j | | g  } n  |  j j |  j j |  \ } } d | } |  j j d  |  \ } } g  | d j   D]$ } | j	   j
   r | j	   ^ q }	 t |	  } n  | S(   Ni    s   (%s)(   R   R>   R   R   RB   Rq   R?   R~   RU   R   R/  R   (
   RE   R   t   distinctt   counterRz   Rm   RC   R5  R   R6  (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   count<  s    "
;c   
      C   s5  d } | r1t  |  r0 |  j | | g  } n  |  j j |  j j |  \ } } d | } |  j j d  |  \ } } g  | d j   D]$ } | j   j	   r | j   ^ q } xU | D]M }	 |  j j
 |	 d d  \ } } | d k r | d 7} q t d |   q W| d k r1|  j j   \ } } q1n  | S(   Ni    s   (%s)s   +FLAGSs
   (\Deleted)R   i   s   IMAP store error: %s(   R   R   RB   Rq   R?   R~   R>   RU   R   R/  R0  R   t   expunge(
   RE   Rz   R   R:  Rm   RC   R5  R   R6  R7  (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   deleteI  s     "
;c         C   s   d  } |  j | j } | d k ro g  | D]$ } t |  j   r) t |  ^ q) } d d j |  j   } ne | d k r g  | D]$ } t |  j   r t |  ^ q } d d j |  j   } n t d   | S(   NR   s   %sR   R   s   UID %ss   Operation not supported(   R>   RW   R   Ry   R/  R   R   R   (   RE   R   t   secondRm   R   t   valR   (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   BELONGS\  s    11c         C   s   d  } |  j | j } | d k r> d | |  j |  f } ne | j d k rr d | j j   |  j |  f } n1 | j d k r d	 |  j |  } n t d
   | S(   NR    R"   R,   R(   s   %s "%s"R%   R'   R.   s   HEADER Content-Type "%s"s   Operation not supported(   s   FROMs   TOs   SUBJECTs   TEXT(   s   ccs   bcc(   R>   RW   R   t   expandR   R   (   RE   R   R>  t   case_sensitiveRm   R   (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   CONTAINSl  s    %c   
      C   s  d  } |  j | j } | d k rZ |  j | j  } d t |  j |   d | f } n.| d k r)y |  j | j  \ } } Wn> t k
 r t	 j
   d } |  j j j d t |   d SXy t |  j |   d }	 Wn3 t t f k
 rt	 j
   d } t d   n Xd |	 | f } n_ | d	 k rZd
 |  j | d t j d  } n. | d k r|d |  j |  } n t d   | S(   NR   s   %d:%di   R   s   Error requesting uid bounds: %sR1   s)   Operation not supported (non integer UID)s	   UID %s:%sR   s   SINCE %sR   R*   s	   LARGER %ss   Operation not supported(   R>   RW   R   R}   Rz   R[   RA  R   Rt   RR   Rv   RG   Rw   Rx   Ry   Rs   R   R   R   R   (
   RE   R   R>  Rm   R   R{   t   pedestalt	   thresholdR|   t   lower_limit(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   GT|  s0    &%c   
      C   s  d  } |  j | j } | d k rP |  j | j  } d |  j |  | f } n | d k r y |  j | j  \ } } Wn> t k
 r t j	   d } |  j
 j j d t |   d SX|  j |  }	 d |	 | f } n. | d k r d	 |  j |  } n t d
   | S(   NR   s   %s:%sR   i   s   Error requesting uid bounds: %sR1   s	   UID %s:%sR   s   SINCE %ss   Operation not supported(   R>   RW   R   R}   Rz   RA  R   Rt   RR   Rv   RG   Rw   Rx   Ry   R   R   (
   RE   R   R>  Rm   R   R{   RD  RE  R|   RF  (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   GE  s$    c   	      C   sk  d  } |  j | j } | d k rH d d t |  j |   d f } n| d k ry |  j | j  \ } } Wn> t k
 r t j	   d } |  j
 j j d t |   d SXy t |  j |   d } Wn3 t t f k
 rt j	   d } t d   n Xd | | f } nP | d	 k r9d
 |  j |  } n. | d k r[d |  j |  } n t d   | S(   NR   s   %s:%si   R   s   Error requesting uid bounds: %sR1   s)   Operation not supported (non integer UID)s	   UID %s:%sR   s	   BEFORE %sR*   s
   SMALLER %ss   Operation not supported(   R>   RW   R   R[   RA  R   Rz   Rt   RR   Rv   RG   Rw   Rx   Ry   Rs   R   R   (	   RE   R   R>  Rm   R   RD  RE  R|   t   upper_limit(    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   LT  s.    &c   	      C   s  d  } |  j | j } | d k r> d d |  j |  f } n | d k r y |  j | j  \ } } Wn> t k
 r t j   d } |  j	 j
 j d t |   d SXt |  j |   } d | | f } n= | d k r d	 |  j | d
 t j d  } n t d   | S(   NR   s   %s:%si   R   s   Error requesting uid bounds: %sR1   s	   UID %s:%sR   s	   BEFORE %sR   s   Operation not supported(   R>   RW   R   RA  R   Rz   Rt   RR   Rv   RG   Rw   Rx   Ry   R[   R   R   R   R   (	   RE   R   R>  Rm   R   RD  RE  R|   RI  (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   LE  s"    %c         C   st   | d  k r= t | t  r= | j d k r= |  j | d  Sn  |  j |  j | |   } | j d d  j   } | S(   NR   i   s   NOT NOTR1   (	   R>   Rn   R   R   RH  t   NOTt   EQR   R   (   RE   R   R>  Rm   (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   NE  s    c         C   s   |  j  | j } d  } | d  k	 r | d k rD d |  j |  } q | d k rf d |  j |  } q | d k r d |  j |  } q | |  j j   k r | r d | j   d } q d | j   d } q t d	   n t d	   | S(
   NR   s   %sR   s   UID %sR   s   ON %si   s   NOT %ss   Operation not supported(	   RW   R   R>   RA  R   RV   R   R   R   (   RE   R   R>  R   Rm   (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyRM    s     c         C   s&   d |  j  |  |  j  |  f } | S(   Ns   %s %s(   RA  (   RE   R   R>  Rm   (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   AND   s    "c         C   s6   d |  j  |  |  j  |  f } d | j d d  S(   Ns   OR %s %ss   %ss   OR ORt   OR(   RA  R   (   RE   R   R>  Rm   (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyRP    s    "c         C   s   d |  j  |  } | S(   Ns   NOT %s(   RA  (   RE   R   Rm   (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyRL    s    (   s   imaplibN(1   t   __name__t
   __module__t   __doc__t   driversRy   R   R   R   t   boolR[   t   typest   dbengineR   t   compileRX   R>   R    R7   Rc   R_   R}   R   R\   R   t   staticmethodR   R   R   Rp   R   R   R^   R   Rq   R.  R]   R;  R=  R@  RC  RG  RH  RJ  RK  RN  RM  RO  RP  RL  (    (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyR	      sf   


J-		$				;			I	*										(   R   R   RR   t   _globalsR    R   RB   R   t   objectsR   R   R   t   helpers.classesR   t   helpers.methodsR   t   baseR   R	   (    (    (    sP   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/imap.pyt   <module>   s   