
    hB                         d dl Z d dlmZmZ d dlmZmZmZmZm	Z	m
Z
 d dlZd dlZd dlmZmZ 	 d dlmZ dZ	 d dlZdZd dlmZmZ  G d	 d
e      Z G d de      Z G d d      Zy# e$ r dZY 9w xY w# e$ r dZY ?w xY w)    N)ABCabstractmethod)AnyDictListOptionalSetUnion)EmailNotValidErrorvalidate_email)asyncioTF)ApiErrorDBProvaiderErrorc                       e Zd Zededefd       Zedefd       Zeddedefd       Zedefd       Z	edefd	       Z
ed
ee   fd       Zedefd       Zedefd       Zed        Zy)AbstractEmailCheckeremailreturnc                      y N selfr   s     o/var/www/html/retail-simulation-api/retail/lib/python3.12/site-packages/fastapi_mail/email_utils/email_check.pyr   z#AbstractEmailChecker.validate_email           c                    K   y wr   r   r   s     r   is_disposablez"AbstractEmailChecker.is_disposable   	        domainfull_resultc                    K   y wr   r   )r   r    r!   s      r   check_mx_recordz$AbstractEmailChecker.check_mx_record#   r   r   c                    K   y wr   r   r   s     r   blacklist_add_emailz(AbstractEmailChecker.blacklist_add_email'   r   r   c                    K   y wr   r   r   r    s     r   blacklist_add_domainz)AbstractEmailChecker.blacklist_add_domain+   r   r   domain_listsc                    K   y wr   r   )r   r)   s     r   add_temp_domainz$AbstractEmailChecker.add_temp_domain/   r   r   c                    K   y wr   r   r'   s     r   is_blocked_domainz&AbstractEmailChecker.is_blocked_domain3   r   r   c                    K   y wr   r   r   s     r   is_blocked_addressz'AbstractEmailChecker.is_blocked_address7   r   r   c                      y r   r   r   s    r   catch_all_checkz$AbstractEmailChecker.catch_all_check;   r   r   NF)__name__
__module____qualname__r   strboolr   r   r#   r%   r(   r   r+   r-   r/   r2   r   r   r   r   r      s    C D      C d   s      $s)   c   c    r   r   c                      e Zd ZU dZg Zee   ed<    e       Z	e
e   ed<    e       Ze
e   ed<   	 	 d*dddddd	d
ee   dee   dedededee   dee   defdZd ZdefdZdedefdZdeee   ef   fdZdeddfdZdeddfdZdeddfdZdeddfdZdee   ddfdZdedefd Zdedefd!Zdedefd"Zdedefd#Z	 d+ded$edee eef   ef   fd%Z!defd&Z"defd'Z#defd(Z$defd)Z%y),DefaultCheckera  
    Default class for checking email from collected public resource.
    The class makes it possible to use redis to save data.
    ```
    :param source(optional): source for collected email data.
    :param db_provider: switch to redis

    example:
        from email_utils import DefaultChecker
        import asyncio

        a = DefaultChecker(db_provider="redis") # if you use redis
        loop = asyncio.get_event_loop()
        loop.run_until_complete(a.init_redis()) # Connect to redis and create default values
    ```
    TEMP_EMAIL_DOMAINSBLOCKED_DOMAINSBLOCKED_ADDRESSESN	localhosti  r   )
redis_host
redis_portredis_dbredis_passwordusernamesourcedb_providerr?   r@   rA   rB   rC   optionsc                    t         st        d      t        st        d      |xs d| _        d| _        |dk(  r1d| _        || _        || _        || _        || _        || _	        || _
        d| _        y )NzXYou must install redis from https://pypi.org/project/redis in order to run functionalityzXYou must install httpx from https://pypi.org/project/httpx in order to run functionalityzhttps://gist.githubusercontent.com/Turall/3f32cb57270aed30d0c7f5e0800b2a92/raw/dcd9b47506e9da26d5772ccebf6913343e53cec9/temporary-email-address-domainsFredisTzredis is not connected)	redis_libImportErrorrequest_librD   redis_enabledrC   r?   r@   rA   rB   rF   redis_error_msg)	r   rD   rE   r?   r@   rA   rB   rC   rF   s	            r   __init__zDefaultChecker.__init__W   s     j  j 
  i i 	 #'!!%D$DM(DO(DO$DM"0D"DL7r   c                     t        dt        j                         j                  j                   d| j
                  j                         )NFunc named z not implementedfor class NotImplementedErrorinspectcurrentframef_codeco_name	__class__r4   r1   s    r   r2   zDefaultChecker.catch_all_check~   G    !'..077??@ A0013
 	
r   r   c                   K   | j                   st        | j                        t        | d      s| j                  r| j
                  s0t        j                  dddd| j                   d {   | _	        nct        j                  dd| j                   d| j
                   d| j                   d| j                   dd| j                   d {   | _	        | j                  j                  d	       d {   }| j                  j                  d
       d {   }| j                  j                  d       d {   }|s$| j                  j                  d	d       d {    |s$| j                  j                  d
d       d {    |s$| j                  j                  dd       d {    | j                          d {   }| j                  j                  d       d {   }|sV|D ci c]&  }|| j                  j!                  d	       d {   ( }}| j                  j#                  d|       d {    y7 7 |7 W7 77 7 7 7 7 7 t7 Gc c}w 7 %w)Nredis_clientzredis://localhostzUTF-8)urlencodingzredis://:z@localhost:/temp_counterdomain_counteremail_counterr   temp_domains)mappingTr   )rL   r   rM   hasattrrC   rB   aioredisfrom_urlrF   rZ   r@   rA   getsetfetch_temp_email_domainshgetallincrhset)r   r_   r`   blocked_emailsrb   	check_keyr    kwargss           r   
init_rediszDefaultChecker.init_redis   sI    !!"4#7#788t^,==(;(;*2*;*; ++g+AE+ %! +3*;*; +"4==/43F3F2G{SWSbSbRccdeiererdst$+ ll+ %! "..22>BB#00445EFF#0044_EE##'':::##''(8!<<<##'';;;!::<<++33NCC	 +*F d//44^DDD*   ##(((HHH;%% CFE ;<;<C E Is   A+I,-I
.A#I,I'I,9I:"I,I"I,?I %I,%I&%I,I%I,1I2I,	I
"I,,I!-
I,7$I%I#I%""I,I*I,I,I,I,I,I,I,I,I,!I,#I%%I,r   c                 ^    	 t        |d      }|j                  }y# t        $ r t        w xY wzValidate email addressF)check_deliverabilityTr   
normalizedr   r   r   	emailinfos      r   r   zDefaultChecker.validate_email   s:    	%&u5II((E  " 	%$$	%s    ,c                   K   t        j                         4 d{   }|j                  | j                         d{   }| j                  r,|j
                  j                  d      cddd      d{    S | j                  j                  |j
                  j                  d             ddd      d{    y7 7 7 N7 # 1 d{  7  sw Y   yxY ww)z&Async request to source param resourceN
)	httpxAsyncClientrg   rD   rL   textsplitr;   extend)r   clientresponses      r   ri   z'DefaultChecker.fetch_temp_email_domains   s     $$&&&#ZZ44H!!}}**40	F 	F 	F
 ##**8==+>+>t+DE '&  '4	F&&&& sr   CC CCC*C)C5C6C;4C/C:C;CCCCCCCCr    c                 F  K   | j                   rp| j                  j                  d|       d{   }|sI| j                  j                  d       d{   }| j                  j	                  d||       d{    yy| j
                  j                  |       y7 l7 I7 &w)zAdd domain to blacklistblocked_domainsNr`   )rL   rZ   hgetrk   rl   r<   add)r   r    resultrk   s       r   r(   z#DefaultChecker.blacklist_add_domain   s     ,,112CVLLF!..334DEE'',,->MMM    $$V, MEMs3   ,B!B$B!B$B!8B9#B!B!B!c                    K   | j                   rK| j                  j                  d|       d {   }|r$| j                  j                  d       d {    y y | j                  j                  |       y 7 G7 $w)Nr   r`   )rL   rZ   hdeldecrr<   remover   r    ress      r   blacklist_rm_domainz"DefaultChecker.blacklist_rm_domain   sn     ))../@&IIC'',,-=>>>    ''/	 J>!   ,A:A6$A:A8#A:8A:c                 j  K   | j                  |      r| j                  rp| j                  j                  d|       d{   }|sI| j                  j	                  d       d{   }| j                  j                  d||       d{    yy| j                  j                  |       yy7 m7 J7 'w)zAdd email address to blacklistrm   Nra   )r   rL   rZ   r   rk   rl   r=   r   )r   r   blocked_domainincs       r   r%   z"DefaultChecker.blacklist_add_email   s     u%!!'+'8'8'='=>NPU'V!V% $ 1 1 6 6 GGC++001A5#NNN & &&**51 &!VGNs4   =B3B- $B3$B/%$B3	B1
$B3/B31B3c                    K   | j                   rK| j                  j                  d|       d {   }|r$| j                  j                  d       d {    y y | j                  j                  |       y 7 G7 $w)Nrm   ra   )rL   rZ   r   r   r=   r   )r   r   r   s      r   blacklist_rm_emailz!DefaultChecker.blacklist_rm_email   sm     ))../?GGC'',,_===  ""))%0	 H=r   r)   c                 T  K   | j                   rw|D ]q  }| j                  j                  d|       d{   }|r*| j                  j                  d       d{   }| j                  j	                  d||       d{    s y| j
                  j                  |       y7 n7 J7 'w)zManually add temporary emailrb   Nr_   )rL   rZ   r   rk   rl   r;   r~   )r   r)   r    
temp_emailrk   s        r   r+   zDefaultChecker.add_temp_domain   s     &#'#4#4#9#9.&#QQ
!!%!2!2!7!7!GGD++00NNN	 ' ##**<8 RGNs8   1B(B"B(B(B$$B(>B&?$B($B(&B(c                    K   | j                   rJ| j                  j                  d|       d {   }|r#| j                  j                  d       d {    y| j                  j                  |       y7 F7 #w)Nrb   r_   T)rL   rZ   r   r   r;   r   r   s      r   blacklist_rm_tempz DefaultChecker.blacklist_rm_temp   so     ))..~vFFC'',,^<<<  ##**62 G<s!   ,A9A5$A9A7"A97A9c                    K   | j                  |      r_|j                  d      \  }}d}| j                  r/| j                  j	                  d|       d{   }t        |      S || j                  v S y7 w)z'Check email address is temporary or not@Nrb   F)r   r}   rL   rZ   r   r8   r;   )r   r   _r    r   s        r   r   zDefaultChecker.is_disposable   ss     u%C(IAvF!!#0055nfMMF|#T4444 Ns   AA6A4A6c                    K   | j                   s|| j                  v S | j                  j                  d|       d{   }t	        |      S 7 w)zCheck blocked email domainr   N)rL   r<   rZ   r   r8   )r   r    blocked_emails      r   r-   z DefaultChecker.is_blocked_domain   sM     !!T1111"//445FOOM"" Ps   :AAAc                    K   | j                  |      rI| j                  s|| j                  v S | j                  j	                  d|       d{   }t        |      S y7 w)zCheck blocked email addressrm   NF)r   rL   r=   rZ   r   r8   )r   r   r   s      r   r/   z!DefaultChecker.is_blocked_address  s^     u%%% 6 666#'#4#4#9#9:JE#RRN'' Ss   AA AA r!   c                 d  K   	 t         j                  j                  |d      }|r|j                  |j                  dS dS # t         j                  j
                  t         j                  j                  t         j                  j                  t         j                  j                  f$ r Y yw xY ww)zCheck domain MX recordsMX)port
nameserverTF)
dnsresolverresolver   r   NXDOMAINNoAnswerNoNameservers	exceptionTimeout)r   r    r!   
mx_recordss       r   r#   zDefaultChecker.check_mx_record  s     	--fd;J  $
8M8MN  LL!!LL!!LL&&MM!!	
 	 	s3   B0:A B0A  B0A)B-*B0,B--B0c                    K   | j                   r'| j                  j                  d       d{   }||S t        | j                        S 7 w)z!count all blocked emails in redisra   N)rL   rZ   rg   lenr=   r   r   s     r   blocked_email_countz"DefaultChecker.blocked_email_count&  sJ     ,,00AAF!4))** B   +AAAc                    K   | j                   r'| j                  j                  d       d{   }||S t        | j                        S 7 w)z"count all blocked domains in redisr`   N)rL   rZ   rg   r   r<   r   s     r   blocked_domain_countz#DefaultChecker.blocked_domain_count.  sK     ,,001ABBF!4''(( Cr   c                    K   | j                   r'| j                  j                  d       d{   }||S t        | j                        S 7 w)z#count all temporary emails in redisr_   N)rL   rZ   rg   r   r;   r   s     r   temp_email_countzDefaultChecker.temp_email_count6  sJ     ,,00@@F!4**++ Ar   c                    K   | j                   r#| j                  j                          d{    yt        | j                        7 w)z)for correctly close connection from redisNT)rL   rZ   closer   rM   r1   s    r   close_connectionsz DefaultChecker.close_connections>  s@     ##))+++t3344 ,s   *A	AA	)NNr3   )&r4   r5   r6   __doc__r;   r   r7   __annotations__rh   r<   r	   r=   r   intdictrN   r2   r8   rp   r   r
   r   ri   r(   r   r%   r   r+   r   r   r-   r/   r   r#   r   r   r   r   r   r   r   r:   r:   @   s   " %'S	& #OSX%"%%s3x' !%%)%8
 &(,"&%8%8 c]%8
 %8 %8 %8 !%8 3-%8 %8N
"$ "HC D 	d3in0E 	- - -0 0 0	2s 	2t 	21c 1d 1	9$s) 	9 	9c d 	 	 	#c #d #c d  05(,	tCH~t#	$(+3 +)C ), ,5 5r   r:   c                       e Zd ZdZdedefdZdefdZdedefdZdefdZ	defd	Z
defd
Zdee   fdZdefdZdefdZd Zd Zd Zd Zd Zy)WhoIsXmlApia  
    WhoIsXmlApi class provide working with api  https://www.whoisxmlapi.com/ .
    This service gives free 1000 request to checking email address per month
    ```
    :param token: token you can get from this https://www.whoisxmlapi.com/ link
    :param email: email for checking

    example:
        from email_utils import WhoIsXmlApi

        who_is = WhoIsXmlApi(token="Your access token", email = "your@mailaddress.com")

        print(who_is.smtp_check_())  # check smtp server
        print(who_is.is_disposable()) # check email is disposable or not
        print(who_is.check_mx_record()) # check domain mx records
        print(who_is.free_check()) # check email domain is free or not
    ```
    tokenr   c                     || _         | j                  |       || _        t               | _        t               | _        t               | _        t               | _        t               | _        g | _	        d| _
        y )Nz0https://emailverification.whoisxmlapi.com/api/v1)r   r   r   r8   
smtp_check	dns_check
free_check
disposable	catch_allr   host)r   r   r   s      r   rN   zWhoIsXmlApi.__init__Z  sY    
E"
&&&%'F	r   r   c                 R  K   t        j                         4 d {   }| j                  | j                  d}|j	                  | j
                  |       d {   }|j                  dk(  r^|j                         }|d   | _        |d   | _	        |d   | _
        |d   | _        |d   | _        |d	   | _        	 d d d       d {    y
d d d       d {    t        dj                  j                  |j                               7 7 7 H7 9# 1 d {  7  sw Y   IxY ww)N)apiKeyemailAddress)params   	smtpCheckdnsCheck	freeCheckdisposableCheckcatchAllCheck	mxRecordsTz(Response status code is {}, error msg {})rz   r{   r   r   rg   r   status_codejsonr   r   r   r   r   r   r   formatr|   )r   r   r   r   datas        r   
fetch_infozWhoIsXmlApi.fetch_infof  s    $$&&& $

DJJGF#ZZ		&ZAAH##s*}}"&{"3!%j!1"&{"3"&'8"9!%o!6"&{"3	 	 	&& 6==$$hmm
 	
 'A	&&&&si   D'D
D':DDA D:D'DD'D4D'DD'D'D$DD$ D'c                 V    	 t        |d      }|j                  }y# t        $ r Y yw xY wrr   rt   rv   s      r   r   zWhoIsXmlApi.validate_email|  s7    	&u5II((E  " 		s    	((c                     | j                   S )u'  
        Tells you whether or not this mail server has a “catch-all” address.
        This refers to a special type of address that can receive emails for any number of
        non-existent email addresses under a particular domain.
        Catch-all addresses are common in businesses where if you send an email to test@hi.com and
        another email to non-existent test2@hi.com, both of those emails will go into the same
        inbox.
        Possible values are 'true' or 'false'. May be 'null' for invalid or non-existing emails.
        )r   r1   s    r   r2   zWhoIsXmlApi.catch_all_check  s     ~~r   c                     | j                   S )a,  
        Checks if the email address exists and
        can receive emails by using SMTP connection and
        email-sending emulation techniques.
        This value will be 'true' if the email address exists and
        can receive email over SMTP, and 'false' if the email address does not exist
        on the target SMTP server or temporarily couldn't receive messages.
        The value will be null if the SMTP request could not be completed,
        mailbox verification is not supported on the target mailbox provider, or not applicable.

        )r   r1   s    r   smtp_check_zWhoIsXmlApi.smtp_check_  s     r   c                     | j                   S )a7  
        Tells you whether or not the email address is disposable (created via a service like
        Mailinator).
        This helps you check for abuse. This value will be 'false' if the email is not disposable,
        and 'true' otherwise.
        May be 'null' for invalid or non-existing emails.

        )r   r1   s    r   r   zWhoIsXmlApi.is_disposable  s     r   c                     | j                   S )z^
        Mail servers list.
        May be absent for invalid or non-existing emails.
        )r   r1   s    r   r#   zWhoIsXmlApi.check_mx_record  s    
 r   c                     | j                   S )z
        Ensures that the domain in the email address, eg: gmail.com, is a valid domain.
        This value will be 'true' if the domain is good and 'false' otherwise.
        May be 'null' for invalid or non-existing emails.

        )r   r1   s    r   	check_dnszWhoIsXmlApi.check_dns  s     ~~r   c                     | j                   S )z
        Check to see if the email address is from a free email provider like Gmail or not.
        This value will be 'false' if the email address is not free, and 'true' otherwise.
        May be 'null' for invalid or non-existing emails.

        )r   r1   s    r   
check_freezWhoIsXmlApi.check_free  s     r   c                     t        dt        j                         j                  j                   d| j
                  j                         NrP   z not implemented for class rQ   r1   s    r   r%   zWhoIsXmlApi.blacklist_add_email  rX   r   c                     t        dt        j                         j                  j                   d| j
                  j                         r   rQ   r1   s    r   r(   z WhoIsXmlApi.blacklist_add_domain  rX   r   c                     t        dt        j                         j                  j                   d| j
                  j                         r   rQ   r1   s    r   r+   zWhoIsXmlApi.add_temp_domain  rX   r   c                     t        dt        j                         j                  j                   d| j
                  j                         r   rQ   r1   s    r   r-   zWhoIsXmlApi.is_blocked_domain  rX   r   c                     t        dt        j                         j                  j                   d| j
                  j                         r   rQ   r1   s    r   r/   zWhoIsXmlApi.is_blocked_address  rX   r   N)r4   r5   r6   r   r7   rN   r8   r   r   r2   r   r   r   r   r#   r   r   r%   r(   r+   r-   r/   r   r   r   r   r   F  s    &
Gc 
G# 
G
$ 
,C D 
 
T 	t 	c 4 D 




r   r   )rS   abcr   r   typingr   r   r   r   r	   r
   dns.exceptionr   dns.resolveremail_validatorr   r   rH   r   re   rI   rJ   rz   rK   fastapi_mail.errorsr   r   r   r:   r   r   r   r   <module>r      s     # 8 8   >)IK ;#3 #LC5) C5LZ
 Z
s	  I  Ks"   A& A3 &A0/A03A=<A=