ó
K~‰Pc           @  sð  d  d l  m Z d  d l Z d  d l Z 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 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 d  d
 l m Z d  d l m Z d  d l m  Z  d  d l! m" Z" e	 j# d e	 j$ d d ƒ d Z& d e' f d „  ƒ  YZ( d d „ Z) e* d d d d d d d d d d d g ƒ Z+ d „  Z, d „  Z- d  e f d! „  ƒ  YZ. d" e f d# „  ƒ  YZ/ d$ e0 f d% „  ƒ  YZ1 d& e1 f d' „  ƒ  YZ2 d S((   iÿÿÿÿ(   t   unicode_literalsN(   t   charsett   encoders(   t	   Generator(   t   MIMEText(   t   MIMEMultipart(   t   MIMEBase(   t   Header(   t
   formatdatet   getaddressest
   formataddrt	   parseaddr(   t   settings(   t   DNS_NAME(   t
   force_text(   t   sixu   utf-8u   application/octet-streamt   BadHeaderErrorc           B  s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s1   ../Django//lib/python/django/core/mail/message.pyR      s   c         C  s¢   t  j  ƒ  } t  j d t  j | ƒ ƒ } y t j ƒ  } Wn t k
 rP d } n Xt j d ƒ } |  d k ru d }  n
 d |  }  t	 } d | | | |  | f } | S(   uè   Returns a string suitable for RFC 2822 compliant Message-ID, e.g:

    <20020201195627.33539.96671@nightshade.la.mastaler.com>

    Optional idstring if given is a string used to strengthen the
    uniqueness of the message id.
    u   %Y%m%d%H%M%Si   i † u    u   .u   <%s.%s.%s%s@%s>N(
   t   timet   strftimet   gmtimet   ost   getpidt   AttributeErrort   randomt	   randranget   NoneR   (   t   idstringt   timevalt   utcdatet   pidt   randintt   idhostt   msgid(    (    s1   ../Django//lib/python/django/core/mail/message.pyt
   make_msgid&   s    
	
u   fromu   senderu   reply-tou   tou   ccu   bccu   resent-fromu   resent-senderu	   resent-tou	   resent-ccu
   resent-bccc           sú   ˆ  p t  j ‰  t | ƒ } d | k s3 d | k rL t d | |  f ƒ ‚ n  y | j d ƒ Wnc t k
 rÂ |  j ƒ  t k rª d j ‡  f d †  t	 | f ƒ Dƒ ƒ } qê t
 | ˆ  ƒ j ƒ  } n( X|  j ƒ  d k rê t
 | ƒ j ƒ  } n  t |  ƒ | f S(   u8   Forbids multi-line headers, to prevent header injection.u   
u   u;   Header values can't contain newlines (got %r for header %r)u   asciiu   , c         3  s   |  ] } t  | ˆ  ƒ Vq d  S(   N(   t   sanitize_address(   t   .0t   addr(   t   encoding(    s1   ../Django//lib/python/django/core/mail/message.pys	   <genexpr>Y   s   u   subject(   R   t   DEFAULT_CHARSETR   R   t   encodet   UnicodeEncodeErrort   lowert   ADDRESS_HEADERSt   joinR	   R   t   str(   t   namet   valR'   (    (   R'   s1   ../Django//lib/python/django/core/mail/message.pyt   forbid_multi_line_headersO   s    c         C  s(  t  |  t j ƒ r' t t |  ƒ ƒ }  n  |  \ } }  y t | | ƒ j ƒ  } Wn& t k
 rt t | d ƒ j ƒ  } n Xy |  j d ƒ Wn t k
 rd |  k rÿ |  j d d ƒ \ } } t	 t | | ƒ ƒ } | j d ƒ j
 d ƒ } d j | | g ƒ }  qt |  | ƒ j ƒ  }  n Xt | |  f ƒ S(   Nu   utf-8u   asciiu   @i   u   idna(   t
   isinstanceR   t   string_typesR   R   R   R)   R*   t   splitR.   t   decodeR-   R
   (   R&   R'   t   nmt	   localpartt   domain(    (    s1   ../Django//lib/python/django/core/mail/message.pyR$   c   s"    t   SafeMIMETextc           B  s&   e  Z d  „  Z d „  Z e d „ Z RS(   c         C  s#   | |  _  t j |  | | | ƒ d  S(   N(   R'   R   t   __init__(   t   selft   textt   subtypeR   (    (    s1   ../Django//lib/python/django/core/mail/message.pyR:   |   s    	c         C  s2   t  | | |  j ƒ \ } } t j |  | | ƒ d  S(   N(   R1   R'   R   t   __setitem__(   R;   R/   R0   (    (    s1   ../Django//lib/python/django/core/mail/message.pyR>   €   s    c         C  s}   t  j ƒ  } t | d t ƒ} t j d k  r` t |  j t  j ƒ r` |  j j	 |  j
 j ƒ |  _ n  | j |  d | ƒ| j ƒ  S(   u&  Return the entire formatted message as a string.
        Optional `unixfrom' when True, means include the Unix From_ envelope
        header.

        This overrides the default as_string() implementation to not mangle
        lines that begin with 'From '. See bug #13433 for details.
        t   mangle_from_i   i   t   unixfrom(   i   i   i   (   R   t   StringIOR   t   Falset   syst   version_infoR2   t   _payloadt	   text_typeR)   t   _charsett   output_charsett   flattent   getvalue(   R;   R@   t   fpt   g(    (    s1   ../Django//lib/python/django/core/mail/message.pyt	   as_string„   s    $(   R   R   R:   R>   RB   RM   (    (    (    s1   ../Django//lib/python/django/core/mail/message.pyR9   z   s   		t   SafeMIMEMultipartc           B  s2   e  Z d  d d d d „ Z d „  Z e d „ Z RS(   u   mixedc         K  s&   | |  _  t j |  | | | |  d  S(   N(   R'   R   R:   (   R;   t   _subtypet   boundaryt	   _subpartsR'   t   _params(    (    s1   ../Django//lib/python/django/core/mail/message.pyR:   —   s    	c         C  s2   t  | | |  j ƒ \ } } t j |  | | ƒ d  S(   N(   R1   R'   R   R>   (   R;   R/   R0   (    (    s1   ../Django//lib/python/django/core/mail/message.pyR>   ›   s    c         C  s;   t  j ƒ  } t | d t ƒ} | j |  d | ƒ| j ƒ  S(   u&  Return the entire formatted message as a string.
        Optional `unixfrom' when True, means include the Unix From_ envelope
        header.

        This overrides the default as_string() implementation to not mangle
        lines that begin with 'From '. See bug #13433 for details.
        R?   R@   (   R   RA   R   RB   RI   RJ   (   R;   R@   RK   RL   (    (    s1   ../Django//lib/python/django/core/mail/message.pyRM   Ÿ   s    N(   R   R   R   R:   R>   RB   RM   (    (    (    s1   ../Django//lib/python/django/core/mail/message.pyRN   •   s   	t   EmailMessagec        
   B  s³   e  Z d  Z d Z d Z d Z d d d d d d d d d d „	 Z e d „ Z	 d „  Z
 d „  Z e d „ Z d d d d	 „ Z d d
 „ Z d „  Z d „  Z d „  Z d d „ Z RS(   u,   
    A container for email information.
    u   plainu   mixedu    c
   
      C  s  | r7 t  | t j ƒ s% t d ƒ ‚ t | ƒ |  _ n	 g  |  _ |	 rw t  |	 t j ƒ se t d ƒ ‚ t |	 ƒ |  _ n	 g  |  _ | r· t  | t j ƒ s¥ t d ƒ ‚ t | ƒ |  _ n	 g  |  _ | pÌ t j	 |  _
 | |  _ | |  _ | pí g  |  _ | pü i  |  _ | |  _ d S(   u  
        Initialize a single email message (which can be sent to multiple
        recipients).

        All strings used to create the message can be unicode strings
        (or UTF-8 bytestrings). The SafeMIMEText class will handle any
        necessary encoding conversions.
        u%   "to" argument must be a list or tupleu%   "cc" argument must be a list or tupleu&   "bcc" argument must be a list or tupleN(   R2   R   R3   t   AssertionErrort   listt   tot   cct   bccR   t   DEFAULT_FROM_EMAILt
   from_emailt   subjectt   bodyt   attachmentst   extra_headerst
   connection(
   R;   R[   R\   RZ   RV   RX   R_   R]   t   headersRW   (    (    s1   ../Django//lib/python/django/core/mail/message.pyR:   µ   s$    
					c         C  s5   d d l  m } |  j s. | d | ƒ |  _ n  |  j S(   Niÿÿÿÿ(   t   get_connectiont   fail_silently(   t   django.core.mailRa   R_   (   R;   Rb   Ra   (    (    s1   ../Django//lib/python/django/core/mail/message.pyRa   Õ   s    	c         C  sI  |  j  p t j } t |  j |  j | ƒ } |  j | ƒ } |  j | d <|  j j	 d |  j
 ƒ | d <|  j j	 d d j |  j ƒ ƒ | d <|  j r© d j |  j ƒ | d <n  g  |  j D] } | j ƒ  ^ q³ } d | k rç t ƒ  | d <n  d | k rt ƒ  | d	 <n  x? |  j j ƒ  D]. \ } } | j ƒ  d k r7qn  | | | <qW| S(   Nu   Subjectu   Fromu   Tou   , u   Ccu   dateu   Dateu
   message-idu
   Message-IDu   fromu   to(   u   fromu   to(   R'   R   R(   R9   R\   t   content_subtypet   _create_messageR[   R^   t   getRZ   R-   RV   RW   R+   R   R#   t   items(   R;   R'   t   msgt   keyt   header_namesR/   t   value(    (    s1   ../Django//lib/python/django/core/mail/message.pyt   messageÛ   s$    %	"c         C  s   |  j  |  j |  j S(   uƒ   
        Returns a list of all recipients of the email (includes direct
        addressees as well as Cc and Bcc entries).
        (   RV   RW   RX   (   R;   (    (    s1   ../Django//lib/python/django/core/mail/message.pyt
   recipientsò   s    c         C  s)   |  j  ƒ  s d S|  j | ƒ j |  g ƒ S(   u   Sends the email message.i    (   Rm   Ra   t   send_messages(   R;   Rb   (    (    s1   ../Django//lib/python/django/core/mail/message.pyt   sendù   s    c         C  ss   t  | t ƒ rD | | k o& d k n s1 t ‚ |  j j | ƒ n+ | d k	 sV t ‚ |  j j | | | f ƒ d S(   u  
        Attaches a file with the given filename and content. The filename can
        be omitted and the mimetype is guessed, if not provided.

        If the first parameter is a MIMEBase subclass it is inserted directly
        into the resulting message attachments.
        N(   R2   R   R   RT   R]   t   append(   R;   t   filenamet   contentt   mimetype(    (    s1   ../Django//lib/python/django/core/mail/message.pyt   attach  s
    "c         C  sM   t  j j | ƒ } t | d ƒ  } | j ƒ  } Wd QX|  j | | | ƒ d S(   u$   Attaches a file from the filesystem.u   rbN(   R   t   patht   basenamet   opent   readRt   (   R;   Ru   Rs   Rq   t   fRr   (    (    s1   ../Django//lib/python/django/core/mail/message.pyt   attach_file  s    c         C  s   |  j  | ƒ S(   N(   t   _create_attachments(   R;   Rh   (    (    s1   ../Django//lib/python/django/core/mail/message.pyRe     s    c         C  s¢   |  j  rž |  j p t j } | } t d |  j d | ƒ } |  j rR | j | ƒ n  xI |  j  D]; } t | t	 ƒ r | j | ƒ q\ | j |  j
 | Œ  ƒ q\ Wn  | S(   NRO   R'   (   R]   R'   R   R(   RN   t   mixed_subtypeR\   Rt   R2   R   t   _create_attachment(   R;   Rh   R'   t   body_msgt
   attachment(    (    s1   ../Django//lib/python/django/core/mail/message.pyR{     s    		c         C  sx   | j  d d ƒ \ } } | d k rK |  j p3 t j } t | | | ƒ } n) t | | ƒ } | j | ƒ t j | ƒ | S(   uT   
        Converts the content, mimetype pair into a MIME attachment object.
        u   /i   u   text(	   R4   R'   R   R(   R9   R   t   set_payloadt   Encoderst   encode_base64(   R;   Rr   Rs   t   basetypeR=   R'   R   (    (    s1   ../Django//lib/python/django/core/mail/message.pyt   _create_mime_attachment(  s    c         C  s½   | d k r9 t j | ƒ \ } } | d k r9 t } q9 n  |  j | | ƒ } | r¹ y | j d ƒ Wn; t k
 rŸ t j s | j d ƒ } n  d d | f } n X| j	 d d d | ƒn  | S(   uh   
        Converts the filename, content, mimetype triple into a MIME attachment
        object.
        u   asciiu   utf-8u    u   Content-Dispositionu
   attachmentRq   N(
   R   t	   mimetypest
   guess_typet   DEFAULT_ATTACHMENT_MIME_TYPER„   R)   R*   R   t   PY3t
   add_header(   R;   Rq   Rr   Rs   t   _R   (    (    s1   ../Django//lib/python/django/core/mail/message.pyR}   7  s    	
N(   R   R   t   __doc__Rd   R|   R   R'   R:   RB   Ra   Rl   Rm   Ro   Rt   Rz   Re   R{   R„   R}   (    (    (    s1   ../Django//lib/python/django/core/mail/message.pyRS   ­   s    					t   EmailMultiAlternativesc           B  sV   e  Z d  Z d Z d d d d d d d d d d d „
 Z d „  Z d „  Z d „  Z RS(   u°   
    A version of EmailMessage that makes it easy to send multipart/alternative
    messages. For example, including text and HTML versions of the text is
    made easier.
    u   alternativeu    c      
   C  sA   t  t |  ƒ j | | | | | | | | |
 ƒ	 |	 p7 g  |  _ d S(   u  
        Initialize a single email message (which can be sent to multiple
        recipients).

        All strings used to create the message can be unicode strings (or UTF-8
        bytestrings). The SafeMIMEText class will handle any necessary encoding
        conversions.
        N(   t   superRŒ   R:   t   alternatives(   R;   R[   R\   RZ   RV   RX   R_   R]   R`   RŽ   RW   (    (    s1   ../Django//lib/python/django/core/mail/message.pyR:   U  s    .c         C  s>   | d k	 s t ‚ | d k	 s$ t ‚ |  j j | | f ƒ d S(   u-   Attach an alternative content representation.N(   R   RT   RŽ   Rp   (   R;   Rr   Rs   (    (    s1   ../Django//lib/python/django/core/mail/message.pyt   attach_alternativec  s    c         C  s   |  j  |  j | ƒ ƒ S(   N(   R{   t   _create_alternatives(   R;   Rh   (    (    s1   ../Django//lib/python/django/core/mail/message.pyRe   i  s    c         C  sƒ   |  j  p t j } |  j r | } t d |  j d | ƒ } |  j rR | j | ƒ n  x* |  j D] } | j |  j | Œ  ƒ q\ Wn  | S(   NRO   R'   (	   R'   R   R(   RŽ   RN   t   alternative_subtypeR\   Rt   R„   (   R;   Rh   R'   R~   t   alternative(    (    s1   ../Django//lib/python/django/core/mail/message.pyR   l  s    		N(	   R   R   R‹   R‘   R   R:   R   Re   R   (    (    (    s1   ../Django//lib/python/django/core/mail/message.pyRŒ   M  s   		(3   t
   __future__R    R…   R   R   RC   R   t   emailR   t   CharsetR   R   t   email.generatorR   t   email.mime.textR   t   email.mime.multipartR   t   email.mime.baseR   t   email.headerR   t   email.utilsR   R	   R
   R   t   django.confR   t   django.core.mail.utilsR   t   django.utils.encodingR   t   django.utilsR   t   add_charsett   SHORTESTR   R‡   t
   ValueErrorR   R#   t   setR,   R1   R$   R9   RN   t   objectRS   RŒ   (    (    (    s1   ../Django//lib/python/django/core/mail/message.pyt   <module>   sL   "		 