
    c                         d Z dZddlZddlmZ ddlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZmZmZmZmZ 	 dd
lmZ ddlmZ dedefdZd Zdededef   fdZ G d d      Zy# e$ r eZY 2w xY w)z1Unicode email support (extends email from stdlib)zrestructuredtext en    N)search_function)	parseaddr	parsedate)decode_header)Message)datetime)AnyOptionalListTupleUnion)DateTimestringreturnc                 .   g }t        |       D ]Q  \  }}|sd}t        |t              r|j                  |d      }n|}t        |t              sJ |j                  |       S t        j                  dk  rdj                  |      S dj                  |      S )Nziso-8859-15replace)   r     )	r   
isinstancebytesdecodestrappendsysversion_infojoin)r   partsmaybe_decodedcharsetdecodeds        9/usr/lib/python3/dist-packages/logilab/common/umessage.py	decode_QPr#   (   s    E"/"7 w#G
 mU+#**7I>G#G'3'''W &  xx775>    c                     	 t        t        j                  |             S # t        j                  j                  $ r Y yw xY wNr   )UMessageemailmessage_from_fileerrorsMessageParseError)fds    r"   r)   r)   A   s9    //344<<))      A A r'   c                     	 t        t        j                  |             S # t        j                  j                  $ r Y yw xY wr&   )r'   r(   message_from_stringr*   r+   )r   s    r"   r/   r/   H   s9    11&9::<<)) r-   c                       e Zd ZdZdeddfdZddedee   dee   fdZ	d	 Z
ddeded
   dee   fdZd Zd Zd Z	 ddee   dedeed ed    f   fdZd Zd ZddZd Zd ZddZy)r'   zHEncapsulates an email.Message instance and returns only unicode objects.messager   Nc                     || _         y N)r1   )selfr1   s     r"   __init__zUMessage.__init__R   s	    r$   headerdefaultc                 X    | j                   j                  ||      }|rt        |      S |S r3   )r1   getr#   )r4   r6   r7   values       r"   r9   zUMessage.getW   s+      1U##r$   c                 $    | j                  |      S r3   )r9   )r4   r6   s     r"   __getitem__zUMessage.__getitem__]   s    xxr$    c                 x    | j                   j                  ||      D cg c]  }|t        |       c}S c c}w r3   )r1   get_allr#   )r4   r6   r7   vals       r"   r?   zUMessage.get_all`   s1    *.,,*>*>vw*Oc3SVSb	#cccs   77c                 6    | j                   j                         S r3   )r1   is_multipartr4   s    r"   rB   zUMessage.is_multipartc       ||((**r$   c                 6    | j                   j                         S r3   )r1   get_boundaryrC   s    r"   rF   zUMessage.get_boundaryf   rD   r$   c              #   d   K   | j                   j                         D ]  }t        |        y wr3   )r1   walkr'   )r4   parts     r"   rH   zUMessage.walki   s,     LL%%' 	!D4. 	!s   .0indexr   c                    | j                   }||j                  ||      }t        |t              r|D cg c]  }t	        |       c}S |j                         dk7  r|S t        |t              r|S |j                         xs d}t        |      d}t        |xs d|d      S t	        |j                  ||            }|S c c}w )Ntextz
iso-8859-1r$   r   )	r1   get_payloadr   listr'   get_content_maintyper   get_content_charsetr   )r4   rJ   r   r1   payloadmsgr    s          r"   rM   zUMessage.get_payloadm   s     ,,= ))%8G'4(189#99++-7'3'113C|Gw'/&w~#w	::w225&ABG! :s   C c                 H    t        | j                  j                               S r3   )r   r1   rO   rC   s    r"   rO   zUMessage.get_content_maintype   s    4<<44677r$   c                 H    t        | j                  j                               S r3   )r   r1   get_content_typerC   s    r"   rU   zUMessage.get_content_type   s    4<<00233r$   c                 z    | j                   j                  |      }||u r|S 	 t        |      S # t        $ r Y yw xY w)Nzerror decoding filename)r1   get_filenamer   UnicodeDecodeError)r4   failobjr:   s      r"   rW   zUMessage.get_filename   sD    ))'2GL	-u:! 	-,	-s   
. 	::c                     g }| j                   j                         D ]'  }|j                  |d| j                  |             ) dj	                  |      S )z=return an unicode string containing all the message's headersz: 
)r1   keysr   r9   r   )r4   valuesr6   s      r"   headerszUMessage.headers   sN    ll'') 	AFMMfdhhv.>?@	Ayy  r$   c                 z    g }| j                  |d      D ]#  }t        |      \  }}|j                  ||f       % |S )zreturn a list of 2-uple (name, address) for the given address (which
        is expected to be an header containing address such as from, to, cc...)
        r=   )r?   r   r   )r4   r6   personspersonnamemails         r"   multi_addrszUMessage.multi_addrs   sH     ll62. 	)F"6*JD$NND$<(	) r$   c                 "   | j                  d      }|4|r2| j                  j                         }|	 |j                  dd      d   }|6t        |      }|r&t        j                  rt        |dd  S t        |dd  S |sy|S # t        $ r Y Ew xY w)zqreturn a datetime object for the email's date or None if no date is
        set or if it can't be parsed
        dateNr         )
r9   r1   get_unixfromsplit
IndexErrorr   lgcUSE_MX_DATETIMEr   r   )r4   alternative_source
return_strr:   	unix_from	datetuples         r"   rf   zUMessage.date   s      =/113I$%OOC3A6E !%(I&&#Yr]332A// " s   B 	BBr3   )r=   )NF)FF)__name__
__module____qualname____doc__r   r5   r   r
   r	   r9   r<   r   r   r?   rB   rF   rH   boolr   rM   rO   rU   rW   r^   rd   rf   r=   r$   r"   r'   r'   O   s    R D 
#  #  dc dE"I dtCy d++!
 ;@c]37	sJZ 00	1@84-!r$   )ru   __docformat__r(   	encodingsr   r   email.utilsr   r   email.headerr   email.messager   r   typingr	   r
   r   r   r   mx.DateTimer   ImportErrorlogilab.commoncommonrl   r   r#   r)   r/   r'   r=   r$   r"   <module>r      s   $ 8%  % 
 , & !  4 4$ c c 2 j#o(> t t[  Hs   A+ +A54A5