
    3 d                         d 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mZmZ ddlmZ ddlmZ ddlmZ  ej        e          ZdZ d Z! G d d          Z"dS )zB
Mail sending helpers

See documentation in docs/topics/email.rst
    N)encoders)MIMEBase)MIMEMultipart)MIMENonMultipart)MIMEText)
formatdate)BytesIO)version)deferssl)Version)arg_to_iterto_bytesz, c                 (    | d S t          |           S Nr   )texts    +lib/python3.11/site-packages/scrapy/mail.py_to_bytes_or_noner      s     tD>>    c                   f    e Zd Z	 	 	 	 	 	 	 	 ddZed             Z	 	 	 	 	 dd
Zd Zd Zd Z	d Z
dS )
MailSender	localhostscrapy@localhostN   Fc	                     || _         || _        t          |          | _        t          |          | _        || _        || _        || _        || _        d S r   )	smtphostsmtpportr   smtpusersmtppasssmtptlssmtpsslmailfromdebug)	selfr   r#   r   r    r   r!   r"   r$   s	            r   __init__zMailSender.__init__%   sP     ! )(33)(33 


r   c                      | |d         |d         |d         |d         |                     d          |                    d          |                    d                    S )	N	MAIL_HOST	MAIL_FROM	MAIL_USER	MAIL_PASS	MAIL_PORTMAIL_TLSMAIL_SSL)r   r#   r   r    r   r!   r"   )getintgetbool)clssettingss     r   from_settingszMailSender.from_settings9   sl    sk*k*k*k*__[11$$Z00$$Z00
 
 
 	
r    
text/plainc	                 h   ddl m}	 |rt                      }
nt          |                    dd           }
t          t          |                    }t          t          |                    }| j        |
d<   t          	                    |          |
d<   t          d          |
d	<   ||
d
<   |d d          }|r2|                    |           t          	                    |          |
d<   |r|
                    |           |r|
                    t          |d|pd                     |D ]\  }}}t          |                    d           }|                    |                                           t%          j        |           |                    dd|           |
                    |           n|
                    |           |r |||||||
           | j        r/t,                              d|||t/          |          d           d S |                     ||
                                                    |pd                                        | j        | j        |||t/          |          g|||t/          |          g           |	                    ddfd           S )Nr   reactor/   FromToT)	localtimeDateSubjectCcplainzus-asciizContent-Disposition
attachment)filename)tosubjectbodyccattachmsgzaDebug mail sent OK: To=%(mailto)s Cc=%(mailcc)s Subject="%(mailsubject)s" Attachs=%(mailattachs)dmailtomailccmailsubjectmailattachszutf-8)callbackerrbackcallbackArgserrbackArgsbeforeshutdownc                       S r   r4   )dfds   r   <lambda>z!MailSender.send.<locals>.<lambda>   s    C r   )twisted.internetr8   r   r   splitlistr   r#   
COMMASPACEjoinr   extendset_charsetrH   r   r   set_payloadreadEncodersencode_base64
add_headerr$   loggerlen	_sendmail	as_stringencodeaddCallbacks_sent_ok_sent_failedaddSystemEventTrigger)r%   rD   rE   rF   rG   attachsmimetypecharset	_callbackr8   rI   rcptsattach_namefpartrV   s                  @r   sendzMailSender.sendE   s    	-,,,,, 	<//CC"HNN3$:$:;C+b//""+b//""mFOOB''D	 4000F I111 	,LL"++CI 	%OOG$$$ 	"JJxgw/D*EEFFF,3 ! !(Xq!4!45  ***&t,,,)<+      

4    ! OOD!!! 	YIW4BwTWXXXX: 	LLD ! #*#&w<<	 	 	 	 FnnUCMMOO$:$:7;Mg$N$NOO]%b'3w<<8R#g,,7	 	 	
 	
 	
 	%%h
KKKKHHH
r   c                 F    t                               d||||d           d S )Nz[Mail sent OK: To=%(mailto)s Cc=%(mailcc)s Subject="%(mailsubject)s" Attachs=%(mailattachs)drJ   )rd   info)r%   resultrD   rG   rE   nattachss         r   rj   zMailSender._sent_ok   s@    @ &'	 		
 		
 		
 		
 		
r   c           	      p    t          |j                  }t                              d|||||d           d S )NzoUnable to send mail: To=%(mailto)s Cc=%(mailcc)s Subject="%(mailsubject)s" Attachs=%(mailattachs)d- %(mailerr)s)rK   rL   rM   rN   mailerr)strvaluerd   error)r%   failurerD   rG   rE   ry   errstrs          r   rk   zMailSender._sent_failed   sQ    W]## &'! 		
 	
 	
 	
 	
r   c                 <   ddl m} t          |          }t          j                    }|                     |||          }| j        r4|                    | j        | j	        |t          j                               n!|                    | j        | j	        |           |S )Nr   r7   )rX   r8   r	   r   Deferred_create_sender_factoryr"   
connectSSLr   r   r   ClientContextFactory
connectTCP)r%   to_addrsrI   r8   dfactorys         r   rf   zMailSender._sendmail   s    ,,,,,,cllN--hQ??< 	Ft}gs7O7Q7Q    t}dmWEEEr   c                     ddl m} dd| j        d}t          t	          dddd          k    r
| j        |d	<    || j        | j        | j        |||fi |}d|_	        |S )
Nr   )ESMTPSenderFactoryTF)heloFallbackrequireAuthenticationrequireTransportSecuritytwisted      hostname)
twisted.mail.smtpr   r!   twisted_versionr   r   r   r    r#   noisy)r%   r   rI   r   r   factory_keywordsr   s          r   r   z!MailSender._create_sender_factory   s    888888 !%*(,
 
 giQ::: 	9+/=Z($$MMM
 
 
 
 r   )r   r   NNr   FFF)Nr4   r5   NN)__name__
__module____qualname__r&   classmethodr3   ru   rj   rk   rf   r   r4   r   r   r   r   $   s         #   ( 	
 	
 [	
  F F F FP

 

 


 
 
  "    r   r   )#__doc__loggingemailr   ra   email.mime.baser   email.mime.multipartr   email.mime.nonmultipartr   email.mime.textr   email.utilsr   ior	   r   r
   r   rX   r   r   twisted.python.versionsr   scrapy.utils.miscr   scrapy.utils.pythonr   	getLoggerr   rd   r[   r   r   r4   r   r   <module>r      s\   
  & & & & & & $ $ $ $ $ $ . . . . . . 4 4 4 4 4 4 $ $ $ $ $ $ " " " " " "       . . . . . . ' ' ' ' ' ' ' ' + + + + + + ) ) ) ) ) ) ( ( ( ( ( (		8	$	$
 
  l l l l l l l l l lr   