ó
Hü½cc           @   sa  d  Z  d d l Z d d l Z d d l Z d d l 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 d d	 l m Z d d
 l m Z d d l Z d d l m Z d d l m Z d d l m Z d Z y e e f Wn e k
 r%d Z d Z n Xd d d „  ƒ  YZ d „  Z d „  Z  d „  Z! d „  Z" d S(   s¢  Local SMTP direct drop-off.

This module delivers messages via SMTP to a locally specified daemon.  This
should be compatible with any modern SMTP server.  It is expected that the MTA
handles all final delivery.  We have to play tricks so that the list object
isn't locked while delivery occurs synchronously.

Note: This file only handles single threaded delivery.  See SMTPThreaded.py
for a threaded implementation.
iÿÿÿÿN(   t	   b64encode(   t   UnicodeType(   t   mm_cfg(   t   Utils(   t   Errors(   t   Decorate(   t   syslog(   t   MsgSafeDict(   t
   formataddr(   t   Header(   t   Charsett   .i   i    t
   Connectionc           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   s   d  |  _ d  S(   N(   t   Nonet   _Connection__conn(   t   self(    (    s:   /export/web/mailman/mailman/Mailman/Handlers/SMTPDirect.pyt   __init__<   s    c         C   s¨  t  j ƒ  |  _ |  j j t j ƒ |  j j t j t j ƒ t j	 r˜t j
 rÞ y |  j j ƒ  Wn0 t k
 r } t d d | ƒ |  j ƒ  ‚  n Xy |  j j t j ƒ WqÞ t k
 rÚ } t d d | ƒ |  j ƒ  ‚  qÞ Xn  y |  j j t j t j ƒ Wq˜t  j k
 r0} t d d | ƒ |  j ƒ  ‚  q˜t  j k
 rb} t d d | ƒ |  j ƒ  ‚  q˜t  j k
 r”} t d d | ƒ |  j ƒ  ‚  q˜Xn  t j |  _ d  S(   Ns   smtp-failures   SMTP TLS error: %ss   SMTP EHLO error: %ss   SMTP HELO error: %ss   SMTP AUTH error: %ss2   SMTP - no suitable authentication method found: %s(   t   smtplibt   SMTPR   t   set_debuglevelR   t   SMTPLIB_DEBUG_LEVELt   connectt   SMTPHOSTt   SMTPPORTt	   SMTP_AUTHt   SMTP_USE_TLSt   starttlst   SMTPExceptionR   t   quitt   ehlot   SMTP_HELO_HOSTt   logint	   SMTP_USERt   SMTP_PASSWDt   SMTPHeloErrort   SMTPAuthenticationErrort    SMTP_MAX_SESSIONS_PER_CONNECTIONt   _Connection__numsessions(   R   t   e(    (    s:   /export/web/mailman/mailman/Mailman/Handlers/SMTPDirect.pyt	   __connect?   sB    		







c         C   s‹   |  j  d  k r |  j ƒ  n  y |  j  j | | | ƒ } Wn! t j k
 r[ |  j ƒ  ‚  n X|  j d 8_ |  j d k r‡ |  j ƒ  n  | S(   Ni   i    (   R   R   t   _Connection__connectt   sendmailR   R   R   R%   (   R   t	   envsendert   recipst   msgtextt   results(    (    s:   /export/web/mailman/mailman/Mailman/Handlers/SMTPDirect.pyR)   c   s    
c         C   sH   |  j  d  k r d  Sy |  j  j ƒ  Wn t j k
 r: n Xd  |  _  d  S(   N(   R   R   R   R   R   (   R   (    (    s:   /export/web/mailman/mailman/Mailman/Handlers/SMTPDirect.pyR   v   s    (   t   __name__t
   __module__R   R(   R)   R   (    (    (    s:   /export/web/mailman/mailman/Mailman/Handlers/SMTPDirect.pyR   ;   s   		$	c         C   s  | j  d ƒ } | s d  S| j  d ƒ } | d  k r^ |  rI |  j ƒ  } q^ t j d d ƒ } n  d  } | j d ƒ s~ | d rÅ | j  d ƒ s– |  j rÅ g  | D] } | g ^ q } d | d <t } n- t j	 d k rà | g } n t
 | t j	 ƒ } | j d	 ƒ r| d	 } n  | d  k rR| j  d
 ƒ sIt j |  | | ƒ t | d
 <n  t } n  i  } t j ƒ  }	 | d }
 | j  d | j ƒ  ƒ } t ƒ  } zy | | d	 <xa | rÿ| j ƒ  } | | d <y | |  | | | | | ƒ WqŸt k
 rû| j | ƒ ‚  qŸXqŸW| d	 =Wd  | j ƒ  |
 | d <Xt j ƒ  } t | i | |	 d 6t | j ƒ  ƒ d 6t | ƒ d 6t | ƒ d 6|  j ƒ  d 6| d 6ƒ } t j r·t j t j d t j d d | ƒn  | rðt j r2t j t j d t j d d | ƒq2nB | j  d ƒ r2t j r2t j t j d t j d d | ƒq2n  g  } g  } x§ | j ƒ  D]™ \ } \ } } | d k r…| d k r…| j | ƒ n | j | ƒ t j  rK| j! i | d 6| d 6| d 6ƒ t j t j  d t j  d d | ƒqKqKW| sô| r	t" j# | | ƒ ‚ n  d  S(   NR+   R*   t   extrat   bouncest   personalizet   verpi   i    t   undeliveredt	   decoratedt   original_sendert   timet   sizes   #recipss   #refusedt   listnamet   sendert   kwst   tolistiô  i(  t	   recipientt   failcodet   failmsg($   t   getR   t   GetBouncesEmailR   t   get_site_emailt   has_keyR2   t   verpdeliverR   t   SMTP_MAX_RCPTSt   chunkifyR   t   processt   Truet   bulkdeliverR7   t
   get_senderR   t   popt	   Exceptiont   appendR   R   t   lent	   as_stringt   internal_namet   SMTP_LOG_EVERY_MESSAGER   t   write_ext   SMTP_LOG_REFUSEDt   SMTP_LOG_SUCCESSt   itemst   SMTP_LOG_EACH_FAILUREt   updateR   t   SomeRecipientsFailed(   t   mlistt   msgt   msgdataR+   R*   t   deliveryfunct   recipt   chunkst   refusedt   t0t
   origrecipst
   origsendert   connt   chunkt   t1t   dt   tempfailurest   permfailurest   codet   smtpmsg(    (    s:   /export/web/mailman/mailman/Mailman/Handlers/SMTPDirect.pyRG      s”    
		
	
	

			
	c         C   sS  i d d 6d d 6d d 6d d 6d d 6d d	 6} i  } x{ |  D]s } d  } | j d
 ƒ } | d k ru | | d } n  | j | d ƒ } | j | g  ƒ } | j | ƒ | | | <q= Wg  }	 g  }
 d } x† | j ƒ  D]x } xM | D]E } |
 j | ƒ | d } | | k rà |	 j |
 ƒ g  }
 d } qà qà W|
 rÓ |	 j |
 ƒ g  }
 d } qÓ qÓ W|	 S(   Ni   t   comi   t   nett   orgi   t   edut   ust   caR   i    (   R   t   rfindR@   RM   t   values(   R+   t	   chunksizet   chunkmapt   bucketst   rt   tldt   it   bint   bucketR^   t   currentchunkt   chunklen(    (    s:   /export/web/mailman/mailman/Mailman/Handlers/SMTPDirect.pyRF     s@    


c         C   sQ  xJ| d D]>} | g | d <t  j | ƒ } t j |  | | ƒ | j d ƒ râ t j | ƒ \ } }	 t j | ƒ \ }
 } | d  k r› t d d | ƒ q n  i | d 6|
 d 6t	 j
 | ƒ d 6} d t j | t	 j
 |	 ƒ f } n  |  j d	 k rÌ| d
 =d  } |  j | ƒ r|  j | ƒ } n  | r¿t j |  j | ƒ ƒ } | d k rRd } n  t | ƒ } | j pjd } t | t ƒ s‘t | | d ƒ } n  t | | ƒ j ƒ  } t | | f ƒ | d <qÌ| | d <n  | d =| j d i  ƒ j | ƒ rûd | d <n  t t j ƒ d k r0| t j =t | ƒ | t j <n  t |  | | | | | ƒ q Wd  S(   NR+   R3   t   smtps*   Skipping VERP delivery to unqual recip: %sR1   t   mailboxt   hosts   %s@%si   t   tos   us-asciis
   iso-8859-1t   asciit   replacet   Tos   x-mailman-copys   add-dup-headert   yess   X-Mailman-Copyi    (   t   copyt   deepcopyR   RG   R@   R   t
   ParseEmailR   R   t   DOTt   joinR   t   VERP_FORMATR2   t   isMembert   getMemberNamet
   GetCharSett   getMemberLanguageR
   t   input_codect
   isinstanceR   t   unicodeR	   t   encodeR   RC   RN   t   RCPT_BASE64_HEADER_NAMER    RI   (   RY   RZ   R[   R*   t   failuresRc   R]   t   msgcopyt   bmailboxt   bdomaint   rmailboxt   rdomainRf   t   namet   charsett   codec(    (    s:   /export/web/mailman/mailman/Mailman/Handlers/SMTPDirect.pyRD   7  sL    		
#	
c         C   s   | d =| | d <|  j  r; | d =d |  j | f | d <n  | j d t ƒ } i  } | d } | d }	 y | j | | | ƒ } Wnt j k
 r´ }
 t d	 d
 |
 |	 ƒ |
 j } nÛ t j	 k
 r-}
 t d	 d |
 j
 |
 j |	 ƒ |
 j
 d k  s |
 j
 d k rx' | D] } |
 j
 |
 j f | | <qWqnb t j t t j f k
 rŽ}
 t d	 d |
 |	 ƒ t |
 ƒ } x" | D] } d | f | | <qqWn X| j | ƒ d  S(   Ns	   errors-tos	   Errors-ToR:   s	   "%s" <%s>t   Sendert   mangle_from_R+   s
   message-ids   smtp-failures%   All recipients refused: %s, msgid: %ss'   SMTP session failure: %s, %s, msgid: %siô  i(  s#   Low level smtp error: %s, msgid: %siÿÿÿÿ(   t   include_sender_headert	   real_nameRO   t   FalseR)   R   t   SMTPRecipientsRefusedR   t
   recipientst   SMTPResponseExceptiont	   smtp_codet
   smtp_errort   sockett   errort   IOErrorR   t   strRW   (   RY   RZ   R[   R*   R”   Rc   R,   R_   R+   t   msgidR&   Rv   R¨   (    (    s:   /export/web/mailman/mailman/Mailman/Handlers/SMTPDirect.pyRI     s6    
	

	
	 (    (#   t   __doc__R…   R7   R§   R   t   base64R    t   typesR   t   MailmanR   R   R   t   Mailman.HandlersR   t   Mailman.Logging.SyslogR   t   Mailman.SafeDictR   t   emailt   email.UtilsR   t   email.HeaderR	   t   email.CharsetR
   Rˆ   RH   R¡   t	   NameErrorR   RG   RF   RD   RI   (    (    (    s:   /export/web/mailman/mailman/Mailman/Handlers/SMTPDirect.pyt   <module>   s6   
F	‹	+	J