
    Ng                    \   d Z ddlm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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! er&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.  ej^                  e0      Z1dZ2ddZ3 G d d      Z4y)zB
Mail sending helpers

See documentation in docs/topics/email.rst
    )annotationsN)encoders)MIMEBase)MIMEMultipart)MIMENonMultipart)MIMEText)
formatdate)BytesIO)IOTYPE_CHECKINGAny)ssl)Deferred)ScrapyDeprecationWarning)arg_to_iterto_bytes)CallableSequenceESMTPSenderFactory)Failure)Self)Crawler)BaseSettingsz, c                    | y t        |       S Nr   )texts    +lib/python3.12/site-packages/scrapy/mail.py_to_bytes_or_noner    1   s    |D>    c                     e Zd Z	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd       Zedd       Zedd       Z	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZ		 	 	 	 	 	 	 	 	 	 	 	 ddZ
dd	Z	 	 	 	 	 	 	 	 dd
Zy)
MailSenderNc	                    || _         || _        t        |      | _        t        |      | _        || _        || _        || _        || _        y r   )	smtphostsmtpportr    smtpusersmtppasssmtptlssmtpsslmailfromdebug)	selfr%   r+   r'   r(   r&   r)   r*   r,   s	            r   __init__zMailSender.__init__8   sF     &%&7&A&7&A$$% 
r!   c                v    t        j                  | j                   dt        d       | j	                  |      S )Nz;.from_settings() is deprecated, use from_crawler() instead.   )category
stacklevel)warningswarn__name__r   _from_settingsclssettingss     r   from_settingszMailSender.from_settingsL   s6    ||nWX-	

 !!(++r!   c                8    | j                  |j                        S r   )r6   r9   )r8   crawlers     r   from_crawlerzMailSender.from_crawlerU   s    !!'"2"233r!   c                     | |d   |d   |d   |d   |j                  d      |j                  d      |j                  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getboolr7   s     r   r6   zMailSender._from_settingsY   sW    k*k*k*k*__[1$$Z0$$Z0
 	
r!   c	           	        ddl m}	 |rt               }
nt        |j	                  dd       }
t        t        |            }t        t        |            }| j                  |
d<   t        j                  |      |
d<   t        d      |
d	<   ||
d
<   |d d  }|r)|j                  |       t        j                  |      |
d<   |r|r|
j                  |       |
j                  t        |d|xs d             |D ]v  \  }}}t        |j	                  d       }|j!                  |j#                                t%        j&                  |       |j)                  dd|       |
j                  |       x n|
j!                  ||       |r |||||||
       | j*                  r%t,        j+                  d|||t/        |      d       y | j1                  ||
j3                         j5                  |xs d            j7                  | j8                  |||t/        |             j;                  | j<                  |||t/        |             |	j?                  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beforeshutdownc                      S r    )dfds   r   <lambda>z!MailSender.send.<locals>.<lambda>   s    Cr!   ) twisted.internetrJ   r   r   splitlistr   r+   
COMMASPACEjoinr	   extendset_charsetrZ   r   r   set_payloadreadEncodersencode_base64
add_headerr,   loggerlen	_sendmail	as_stringencodeaddCallback_sent_ok
addErrback_sent_failedaddSystemEventTrigger)r-   rV   rW   rX   rY   attachsmimetypecharset	_callbackrJ   r[   rcptsattach_nameattach_mimetypefpartre   s                   @r   sendzMailSender.sende   s    	- /C"HNN3$:;C+b/"+b/"mmFOOB'D	 40F I1LL"+CI(JJxgw/D*EF3:/_a!6!6s!;<  *&&t,)<+    

4  4; OOD'*W4BwTWX::LLD ! #*#&w<		 !^^3==?))'*<W=
 	r2wGEt(("b'3w<H%%h
KH
r!   c                :    t         j                  d||||d       y )Nz[Mail sent OK: To=%(mailto)s Cc=%(mailcc)s Subject="%(mailsubject)s" Attachs=%(mailattachs)dr\   )rs   info)r-   resultrV   rY   rW   nattachss         r   ry   zMailSender._sent_ok   s)     	@ &'			
r!   c           	     h    t        |j                        }t        j                  d|||||d       |S )NzoUnable to send mail: To=%(mailto)s Cc=%(mailcc)s Subject="%(mailsubject)s" Attachs=%(mailattachs)d- %(mailerr)s)r]   r^   r_   r`   mailerr)strvaluers   error)r-   failurerV   rY   rW   r   errstrs          r   r{   zMailSender._sent_failed   s@     W]]# &'!		
 r!   c                @   ddl m} t        |      }t               }| j	                  |||      }| j
                  r<|j                  | j                  | j                  |t        j                                |S |j                  | j                  | j                  |       |S )Nr   rI   )rg   rJ   r
   r   _create_sender_factoryr*   
connectSSLr%   r&   r   ClientContextFactory
connectTCP)r-   to_addrsr[   rJ   msg_iodfactorys          r   ru   zMailSender._sendmail   s    ,#:--hB<<t}}gs7O7O7Q  t}}dmmWEr!   c                    ddl m} dd| j                  | j                  d} || j                  | j
                  | j                  |||fi |}d|_        |S )Nr   r   TF)heloFallbackrequireAuthenticationrequireTransportSecurityhostname)twisted.mail.smtpr   r)   r%   r'   r(   r+   noisy)r-   r   r[   r   r   factory_keywordsr   s          r   r   z!MailSender._create_sender_factory   sg     	9 !%*(,	,
 %MMMMMM
 
 r!   )	localhostzscrapy@localhostNN   FFF)r%   r   r+   r   r'   
str | Noner(   r   r&   intr)   boolr*   r   r,   r   )r9   r   returnr   )r<   r   r   r   )Nrd   z
text/plainNN)rV   zstr | list[str]rW   r   rX   r   rY   zstr | list[str] | Noner}   z"Sequence[tuple[str, str, IO[Any]]]r~   r   r   r   r   zCallable[..., None] | Noner   zDeferred[None] | None)r   r   rV   	list[str]rY   r   rW   r   r   r   r   None)r   r   rV   r   rY   r   rW   r   r   r   r   r   )r   r   r[   bytesr   Deferred[Any])r   r   r[   z	IO[bytes]r   r   r   r   )r5   
__module____qualname__r.   classmethodr:   r=   r6   r   ry   r{   ru   r   rd   r!   r   r#   r#   7   s    $*##!! ! 	!
 ! ! ! ! !( , , 4 4 	
 	
  &*68$"04DD D 	D
 #D 4D D D .D 
DL

(
.7
BE
QT
	
  	
   
."!(16C	r!   r#   )r   zstr | bytes | Noner   zbytes | None)5__doc__
__future__r   loggingr3   emailr   rp   email.mime.baser   email.mime.multipartr   email.mime.nonmultipartr   email.mime.textr   email.utilsr	   ior
   typingr   r   r   rg   r   twisted.internet.deferr   scrapy.exceptionsr   scrapy.utils.miscr   scrapy.utils.pythonr   collections.abcr   r   r   r   twisted.python.failurer   typing_extensionsr   scrapy.crawlerr   scrapy.settingsr   	getLoggerr5   rs   rj   r    r#   rd   r!   r   <module>r      s    #   & $ . 4 $ "  ) )   + 6 ) (2 5. '&, 
		8	$
 
@ @r!   