a
    zeԷ                     @   s   d dg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mZ ddlmZ dd	lmZ ejZd
ZedZdd ZdddZdd Zdd ZG dd  d ZG dd deZG dd deZdS )MessageEmailMessage    N)BytesIOStringIO)utils)errors)Policycompat32charset)decode_bz; z[ \(\)<>@,;:\\"/\[\]\?=]c                 C   s4   t | d\}}}|s$| d fS | | fS )N;)str	partitionstrip)paramasepb r   #/usr/lib/python3.9/email/message.py_splitparam   s    r   Tc                 C   s   |d urt |dkrt|trL| d7 } t|d |d |d }d| |f S z|d W n4 ty   | d7 } t|dd}d| |f  Y S 0 |st|rd	| t	|f S d| |f S n| S d S )
Nr   *      %s=%sasciizutf-8 z%s="%s")
len
isinstancetupler   Zencode_rfc2231encodeUnicodeEncodeError	tspecialssearchquote)r   valuer%   r   r   r   _formatparam'   s    	
r'   c                 C   s   dt |  } g }| d d dkr| dd  } | d}|dkrp| dd|| dd| d rp| d|d }q6|dk rt| }| d | }d|v r|d}|d |   d ||d d    }||  | |d  } q|S )Nr   r   r   "z\"r   =)r   findcountr   indexr   lowerappend)sZplistendfir   r   r   _parseparamI   s     
(
,r3   c                 C   s4   t | tr&| d | d t| d fS t| S d S )Nr   r   r   )r   r    r   unquote)r&   r   r   r   _unquotevalue]   s    
r5   c                   @   s  e Zd ZefddZdd Zdcdd	Zd
d ZddddZdd Z	dd Z
dd Zdd ZdeddZdfddZdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zdgd0d1Zd2d3 Zd4d5 Zdhd6d7Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%didJdKZ&djdLdMZ'dkdPdQZ(dldRdSZ)dmdTdUZ*dndVdWZ+dodXdYZ,dZd[ Z-dpd\d]Z.dqd^d_Z/d`da Z0ddbl1m2Z2 dS )rr   c                 C   s:   || _ g | _d | _d | _d | _d  | _| _g | _d| _d S )N
text/plain)	policy_headers	_unixfrom_payload_charsetZpreambleZepiloguedefects_default_type)selfr7   r   r   r   __init__x   s    zMessage.__init__c                 C   s   |   S N)	as_stringr>   r   r   r   __str__   s    zMessage.__str__Fr   Nc                 C   sJ   ddl m} |d u r| jn|}t }||d||d}|j| |d | S )Nr   )	GeneratorF)mangle_from_maxheaderlenr7   unixfrom)email.generatorrD   r7   r   flattengetvalue)r>   rH   rF   r7   rD   fpgr   r   r   rA      s    zMessage.as_stringc                 C   s   |   S r@   )as_bytesrB   r   r   r   	__bytes__   s    zMessage.__bytes__c                 C   sH   ddl m} |d u r| jn|}t }||d|d}|j| |d | S )Nr   )BytesGeneratorF)rE   r7   rG   )rI   rP   r7   r   rJ   rK   )r>   rH   r7   rP   rL   rM   r   r   r   rN      s    zMessage.as_bytesc                 C   s   t | jtS r@   )r   r:   listrB   r   r   r   is_multipart   s    zMessage.is_multipartc                 C   s
   || _ d S r@   r9   )r>   rH   r   r   r   set_unixfrom   s    zMessage.set_unixfromc                 C   s   | j S r@   rS   rB   r   r   r   get_unixfrom   s    zMessage.get_unixfromc                 C   sD   | j d u r|g| _ n,z| j | W n ty>   tdY n0 d S )Nz=Attach is not valid on a message with a non-multipart payload)r:   r.   AttributeError	TypeError)r>   payloadr   r   r   attach   s    

zMessage.attachc                 C   s  |   r(|rd S |d u r| jS | j| S |d urNt| jtsNtdt| j | j}t| dd }t|trt	
|r|dd}|sz|| ddd}W q ty   |dd}Y q0 n0|rz|d}W n ty   |d}Y n0 |s |S |d	krt|S |d
krRtd| \}}|D ]}| j| | q8|S |dv rt|}	t }
ztj|	|
dd |
 W S  tjy   | Y S 0 t|tr|S |S )NzExpected list, got %szcontent-transfer-encodingr   r   surrogateescaper   replaceraw-unicode-escapezquoted-printablebase64    )z
x-uuencodeZuuencodeZuuezx-uueT)quiet)rR   r:   r   rQ   rW   typer   getr-   r   Z_has_surrogatesr!   decode	get_paramLookupErrorUnicodeErrorquopriZdecodestringr   join
splitlinesr7   Zhandle_defectr   uurK   Error)r>   r2   rb   rX   cteZbpayloadr&   r<   ZdefectZin_fileZout_filer   r   r   get_payload   sV    "








zMessage.get_payloadc                 C   sp   t |dr:|d u r|| _d S t|ts.t|}||j}t |drT|dd| _n|| _|d url| | d S )Nr!   rb   r   rZ   )hasattrr:   r   Charsetr!   output_charsetrb   set_charset)r>   rX   r   r   r   r   set_payload/  s    


zMessage.set_payloadc                 C   s  |d u r|  d d | _d S t|ts.t|}|| _d| vrH| dd d| vrf| jdd| d n| d|  || kr|| j| _d| vr|	 }z||  W nf t
y   | j}|rz|dd	}W n ty   ||j}Y n0 ||| _| d| Y n0 d S )
Nr   MIME-Version1.0Content-Typer6   r
   zContent-Transfer-Encodingr   rZ   )	del_paramr;   r   rn   
add_headerZget_output_charset	set_paramZbody_encoder:   Zget_body_encodingrW   r!   re   ro   )r>   r   rk   rX   r   r   r   rp   C  s:    


zMessage.set_charsetc                 C   s   | j S r@   )r;   rB   r   r   r   get_charsetr  s    zMessage.get_charsetc                 C   s
   t | jS r@   )r   r8   rB   r   r   r   __len__z  s    zMessage.__len__c                 C   s
   |  |S r@   )ra   r>   namer   r   r   __getitem__~  s    	zMessage.__getitem__c                 C   sr   | j |}|rX| }d}| jD ]4\}}| |kr"|d7 }||kr"td||q"| j| j || d S )Nr   r   z/There may be at most {} {} headers in a message)r7   Zheader_max_countr-   r8   
ValueErrorformatr.   header_store_parse)r>   r{   valZ	max_countZlnamefoundkvr   r   r   __setitem__  s    zMessage.__setitem__c                 C   s@   |  }g }| jD ]"\}}|  |kr|||f q|| _d S r@   )r-   r8   r.   )r>   r{   
newheadersr   r   r   r   r   __delitem__  s    zMessage.__delitem__c                 C   s   |  dd | jD v S )Nc                 S   s   g | ]\}}|  qS r   )r-   .0r   r   r   r   r   
<listcomp>  r^   z(Message.__contains__.<locals>.<listcomp>)r-   r8   rz   r   r   r   __contains__  s    zMessage.__contains__c                 c   s   | j D ]\}}|V  qd S r@   r8   )r>   Zfieldr&   r   r   r   __iter__  s    zMessage.__iter__c                 C   s   dd | j D S )Nc                 S   s   g | ]\}}|qS r   r   r   r   r   r   r     r^   z Message.keys.<locals>.<listcomp>r   rB   r   r   r   keys  s    zMessage.keysc                    s    fdd j D S )Nc                    s   g | ]\}} j ||qS r   r7   header_fetch_parser   rB   r   r   r     s   z"Message.values.<locals>.<listcomp>r   rB   r   rB   r   values  s    
zMessage.valuesc                    s    fdd j D S )Nc                    s"   g | ]\}}| j ||fqS r   r   r   rB   r   r   r     s   z!Message.items.<locals>.<listcomp>r   rB   r   rB   r   items  s    
zMessage.itemsc                 C   s:   |  }| jD ]&\}}|  |kr| j||  S q|S r@   )r-   r8   r7   r   )r>   r{   failobjr   r   r   r   r   ra     s
    zMessage.getc                 C   s   | j ||f d S r@   )r8   r.   )r>   r{   r&   r   r   r   set_raw  s    zMessage.set_rawc                 C   s   t | j S r@   )iterr8   copyrB   r   r   r   	raw_items  s    zMessage.raw_itemsc                 C   sH   g }|  }| jD ](\}}|  |kr|| j|| q|sD|S |S r@   )r-   r8   r.   r7   r   )r>   r{   r   r   r   r   r   r   r   get_all  s    	zMessage.get_allc                 K   sp   g }|  D ]<\}}|d u r0||dd q|t|dd| q|d ur^|d| t|| |< d S )N_-r   )r   r.   r[   r'   insert	SEMISPACErg   )r>   _name_valueZ_paramspartsr   r   r   r   r   rv     s    zMessage.add_headerc                 C   s\   |  }ttt| j| jD ]0\}\}}|  |kr| j||| j|<  qXqt|d S r@   )r-   zipranger   r8   r7   r   KeyError)r>   r   r   r2   r   r   r   r   r   replace_header!  s    "zMessage.replace_headerc                 C   sH   t  }| d|}||u r"|  S t|d  }|ddkrDdS |S )Ncontent-typer   /r   r6   )objectra   get_default_typer   r-   r+   )r>   missingr&   ctyper   r   r   get_content_type4  s    zMessage.get_content_typec                 C   s   |   }|dd S )Nr   r   r   splitr>   r   r   r   r   get_content_maintypeL  s    zMessage.get_content_maintypec                 C   s   |   }|dd S )Nr   r   r   r   r   r   r   get_content_subtypeU  s    zMessage.get_content_subtypec                 C   s   | j S r@   r=   rB   r   r   r   r   ^  s    zMessage.get_default_typec                 C   s
   || _ d S r@   r   r   r   r   r   set_default_typeg  s    zMessage.set_default_typec           	   	   C   s   t  }| ||}||u r|S g }t|D ]V}z$|dd\}}| }| }W n typ   | }d}Y n0 |||f q*t|}|S )Nr)   r   r   )	r   ra   r3   r   r   r}   r.   r   Zdecode_params)	r>   r   headerr   r&   paramspr{   r   r   r   r   _get_params_preservep  s     

zMessage._get_params_preserver   Tc                 C   s8   t  }| ||}||u r|S |r0dd |D S |S d S )Nc                 S   s   g | ]\}}|t |fqS r   )r5   r   r   r   r   r     r^   z&Message.get_params.<locals>.<listcomp>)r   r   )r>   r   r   r4   r   r   r   r   r   
get_params  s    zMessage.get_paramsc                 C   sN   || vr|S |  ||D ]0\}}| | kr|r@t|  S |  S q|S r@   )r   r-   r5   )r>   r   r   r   r4   r   r   r   r   r   rc     s    
zMessage.get_paramrt   r   c                 C   s
  t |ts|r|||f}|| vr2| dkr2d}n
| |}| j||dst|s\t|||}qt|t|||g}nbd}| j||dD ]N\}	}
d}|	 | krt|||}nt|	|
|}|s|}qt||g}q|| |kr|r| 	|| n| |= || |< d S )Nr   r6   )r   r   r   r4   )
r   r    r-   ra   rc   r'   r   rg   r   r   )r>   r   r&   r   requoter   languager[   r   Z	old_param	old_valueZappend_paramr   r   r   rw     s6    

zMessage.set_paramc                 C   s   || vrd S d}| j ||dD ]@\}}| | kr|sHt|||}qt|t|||g}q|| |kr|| |= || |< d S )Nr   r   )r   r-   r'   r   rg   ra   )r>   r   r   r   Z	new_ctyper   r   r   r   r   ru     s    
zMessage.del_paramc                 C   s   | ddkst| dkr,| d= d| d< || vr@|| |< d S | j||d}| |= || |< |dd  D ]\}}| |||| qhd S )Nr   r   r   zmime-versionrs   rr   r   )r+   r}   r-   r   rw   )r>   r`   r   r   r   r   r   r   r   r   set_type  s    zMessage.set_typec                 C   sD   t  }| d|d}||u r*| d|d}||u r6|S t| S )Nfilenamecontent-dispositionr{   r   )r   rc   r   collapse_rfc2231_valuer   )r>   r   r   r   r   r   r   get_filename&  s    zMessage.get_filenamec                 C   s,   t  }| d|}||u r|S t| S )Nboundary)r   rc   r   r   rstrip)r>   r   r   r   r   r   r   get_boundary6  s
    zMessage.get_boundaryc                 C   s  t  }| |d}||u r$tdg }d}|D ]:\}}| dkr\|dd| f d}q0|||f q0|s|dd| f g }| jD ]z\}	}
|	 dkrg }|D ].\}}
|
dkr|| q|d||
f  qt|}|| j	
|	| q||	|
f q|| _d S )	Nr   zNo Content-Type header foundFr   z"%s"Tr   r   )r   r   r   ZHeaderParseErrorr-   r.   r8   r   rg   r7   r   )r>   r   r   r   Z	newparamsZfoundpZpkZpvr   hr   r   r   r   r   r   r   set_boundaryC  s2    


zMessage.set_boundaryc              	   C   s   t  }| d|}||u r|S t|trp|d p2d}z|d d}t||}W n ttfyn   |d }Y n0 z|d W n ty   | Y S 0 | S )Nr   r   zus-asciir   r\   )	r   rc   r   r    r!   r   rd   re   r-   )r>   r   r   r   ZpcharsetrN   r   r   r   get_content_charsetq  s     

zMessage.get_content_charsetc                    s    fdd|   D S )Nc                    s   g | ]}|  qS r   )r   )r   partr   r   r   r     r^   z(Message.get_charsets.<locals>.<listcomp>walk)r>   r   r   r   r   get_charsets  s    zMessage.get_charsetsc                 C   s*   |  d}|d u rd S t|d  }|S )Nr   r   )ra   r   r-   )r>   r&   c_dr   r   r   get_content_disposition  s
    
zMessage.get_content_dispositionr   )Fr   N)FN)NF)N)N)N)Nr   T)Nr   T)rt   TNr   F)r   T)rt   T)N)N)N)N)3__name__
__module____qualname__r	   r?   rC   rA   rO   rN   rR   rT   rU   rY   rl   rq   rp   rx   ry   r|   r   r   r   r   r   r   r   ra   r   r   r   rv   r   r   r   r   r   r   r   r   rc   rw   ru   r   r   r   r   r   r   r   Zemail.iteratorsr   r   r   r   r   r   i   sd   


Z
/


				
  
"  
3

 

.

c                       s   e Zd Zd/ fdd	Zd0 fdd	Zdd Zd	d
 Zdd Zd1ddZh dZ	dd Z
dd ZddddZddddZdd Zd2ddZd3ddZd4d d!Zdd"d#d$Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Z  ZS )5MIMEPartNc                    s(   |d u rddl m} |}t | d S )Nr   )default)Zemail.policyr   superr?   )r>   r7   r   	__class__r   r   r?     s    zMIMEPart.__init__Fc                    s0   |d u r| j n|}|d u r |j}t |||S r@   )r7   Zmax_line_lengthr   rA   )r>   rH   rF   r7   r   r   r   rA     s    zMIMEPart.as_stringc                 C   s   | j | jjdddS )NT)utf8r7   )rA   r7   ZclonerB   r   r   r   rC     s    zMIMEPart.__str__c                 C   s    |  d}|d u rdS |jdkS )Nr   F
attachment)ra   Zcontent_disposition)r>   r   r   r   r   is_attachment  s    
zMIMEPart.is_attachmentc           	      c   s  |  rd S | d\}}|dkrB||v r>|||fV  d S |dksR|  sVd S |dkr| D ]}| ||E d H  qfd S d|v r|d|fV  d }|d}|r| D ]}|d |kr|} qq|d u r| }|r|d nd }|d ur
| ||E d H  d S )Nr   text	multipartrelatedstart
content-idr   )	r   r   r   r,   rR   
iter_parts
_find_bodyrc   rl   )	r>   r   preferencelistmaintypesubtypeZsubpart	candidater   Zsubpartsr   r   r   r     s6    

zMIMEPart._find_bodyr   htmlplainc                 C   sB   t |}d }| | |D ]$\}}||k r|}|}|dkr q>q|S )Nr   )r   r   )r>   r   Z	best_priobodyZprior   r   r   r   get_body  s    
zMIMEPart.get_body>   )r   r   )r   r   )r   r   )r   alternativec           
      c   s"  |   d\}}|dks"|dkr&d S |  }z| }W n tyN   Y d S 0 |dkr|dkr| d}|rd}g }|D ]"}|d|krd}qz|| qz|r|E d H  d S |d	 |E d H  d S g }	|D ]L}|  d\}}||f| j	v r|
 s||	vr|	| q|V  qd S )
Nr   r   r   r   r   Fr   Tr   )r   r   rl   r   rV   rc   ra   r.   pop_body_typesr   )
r>   r   r   rX   r   r   r   Zattachmentsr   seenr   r   r   iter_attachments  sD    




zMIMEPart.iter_attachmentsc                 c   s   |   r|  E d H  d S r@   )rR   rl   rB   r   r   r   r   =  s    zMIMEPart.iter_parts)content_managerc                O   s(   |d u r| j j}|j| g|R i |S r@   )r7   r   get_contentr>   r   argskwr   r   r   r   E  s    zMIMEPart.get_contentc                O   s,   |d u r| j j}|j| g|R i | d S r@   )r7   r   set_contentr   r   r   r   r   J  s    zMIMEPart.set_contentc           
      C   s   |   dkr6|  }||f }||v r6td||g }g }| jD ]4\}}| drj|||f qD|||f qD|rt| | j	d}	||	_| j
|	_
|	g| _
ng | _
|| _d| | d< |d ur| d| d S )Nr   zCannot convert {} to {}content-r   z
multipart/rt   r   )r   r   r}   r~   r8   r-   
startswithr.   r`   r7   r:   rw   )
r>   r   Zdisallowed_subtypesr   Zexisting_subtypeZkeep_headersZpart_headersr{   r&   r   r   r   r   _make_multipartO  s.    

zMIMEPart._make_multipartc                 C   s   |  dd| d S )Nr   )r   mixedr   r>   r   r   r   r   make_relatedj  s    zMIMEPart.make_relatedc                 C   s   |  dd| d S )Nr   )r   r   r   r   r   r   make_alternativem  s    zMIMEPart.make_alternativec                 C   s   |  dd| d S )Nr   r   r   r   r   r   r   
make_mixedp  s    zMIMEPart.make_mixed)_dispc                O   sj   |   dks|  |kr(t| d|   t| | jd}|j|i | |r\d|vr\||d< | | d S )Nr   Zmake_r   r   zContent-Disposition)r   r   getattrr`   r7   r   rY   )r>   Z_subtyper   r   r   r   r   r   r   _add_multiparts  s    
zMIMEPart._add_multipartc                 O   s    | j dg|R ddi| d S )Nr   r   Zinliner   r>   r   r   r   r   r   add_related}  s    zMIMEPart.add_relatedc                 O   s   | j dg|R i | d S )Nr   r   r   r   r   r   add_alternative  s    zMIMEPart.add_alternativec                 O   s    | j dg|R ddi| d S )Nr   r   r   r   r   r   r   r   add_attachment  s    zMIMEPart.add_attachmentc                 C   s   g | _ d | _d S r@   r8   r:   rB   r   r   r   clear  s    zMIMEPart.clearc                 C   s   dd | j D | _ d | _d S )Nc                 S   s&   g | ]\}}|  d s||fqS )r   )r-   r   )r   nr   r   r   r   r     s   z*MIMEPart.clear_content.<locals>.<listcomp>r  rB   r   r   r   clear_content  s    zMIMEPart.clear_content)N)FNN)r   )N)N)N)r   r   r   r?   rA   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  __classcell__r   r   r   r   r     s*   
7



r   c                       s   e Zd Z fddZ  ZS )r   c                    s&   t  j|i | d| vr"d| d< d S )Nrr   rs   )r   r   r   r   r   r   r     s    zEmailMessage.set_content)r   r   r   r   r  r   r   r   r   r     s   )NT)__all__reri   rf   ior   r   Zemailr   r   Zemail._policybaser   r	   r   r;   Zemail._encoded_wordsr   rn   r   compiler#   r   r'   r3   r5   r   r   r   r   r   r   r   <module>   s4   


"      N `