ó
    ×[.j€e  ã                   óî   • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
JrJrJr  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJr  \R:                  " \5      rS r S r!S r"S r#S	 r$ " S
 S5      r%g)aR  
Copyright 2016 Fedele Mantuano (https://twitter.com/fedelemantuano)

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
é    N)ÚADDRESSES_HEADERSÚEPILOGUE_DEFECTSÚREGXIPÚREGXIP6)Úconvert_mail_dateÚdecode_header_partÚextract_msg_convertÚfind_betweenÚget_addressesÚ
get_headerÚget_mail_keysÚget_to_domainsÚ
msgconvertÚported_openÚported_stringÚrandom_stringÚreceiveds_parsingÚwrite_attachmentsc                 ó,   • [         R                  U 5      $ )z£
Parsing email from a file-like object.

Args:
    fp (file-like object): file-like object of raw email

Returns:
    Instance of MailParser with raw email parsed
)Ú
MailParserÚfrom_file_obj©Úfps    ÚL/home/mande/repo/quber/.venv/lib/python3.13/site-packages/mailparser/core.pyÚparse_from_file_objr   0   ó   € ô ×#Ñ# BÓ'Ð'ó    c                 ó,   • [         R                  U 5      $ )z„
Parsing email from file.

Args:
    fp (string): file path of raw email

Returns:
    Instance of MailParser with raw email parsed
)r   Ú	from_filer   s    r   Úparse_from_filer    =   s   € ô ×Ñ Ó#Ð#r   c                 ó,   • [         R                  U 5      $ )z˜
Parsing email from file Outlook msg.

Args:
    fp (string): file path of raw Outlook email

Returns:
    Instance of MailParser with raw email parsed
)r   Úfrom_file_msgr   s    r   Úparse_from_file_msgr#   J   r   r   c                 ó,   • [         R                  U 5      $ )zx
Parsing email from string.

Args:
    s (string): raw email

Returns:
    Instance of MailParser with raw email parsed
)r   Úfrom_string)Úss    r   Úparse_from_stringr'   W   s   € ô ×!Ñ! !Ó$Ð$r   c                 ó,   • [         R                  U 5      $ )zª
Parsing email from bytes. Only for Python 3

Args:
    bt (bytes-like object): raw email as bytes-like object

Returns:
    Instance of MailParser with raw email parsed
)r   Ú
from_bytes)Úbts    r   Úparse_from_bytesr+   d   s   € ô × Ñ  Ó$Ð$r   c                   ó0  • \ rS rSrSrS,S jrS\4S jr\S 5       r	\S-S j5       r
\S	 5       r\S
 5       r\S 5       rS rS rS.S jrS rS rS rS rS r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S\4S j5       r\S 5       r\S 5       r\S 5       r \S 5       r!\S 5       r"\S 5       r#\S  5       r$\S! 5       r%\S" 5       r&\S# 5       r'\S$ 5       r(\S% 5       r)\S& 5       r*\S' 5       r+\S( 5       r,\S) 5       r-\S* 5       r.S+r/g)/r   éq   a  
MailParser package provides a standard parser that understands
most email document structures like official email package.
MailParser handles the encoding of email and split the raw email for you.

Headers:
https://www.iana.org/assignments/message-headers/message-headers.xhtml
Nc                 ó¸   • Xl         UbA  [        R                  SR                  SR	                  UR                  5       5      5      5        U R                  5         g)z4
Init a new object from a message object structure.
NzAll headers of emails: {}z, )Ú_messageÚlogÚdebugÚformatÚjoinÚkeysÚparse)ÚselfÚmessages     r   Ú__init__ÚMailParser.__init__{   s?   € ð  ŒØÑÜ�I‰IÐ1×8Ñ8¸¿¹À7Ç<Á<Ã>Ó9RÓSÔTØ�
‰
�r   Úreturnc                 ób   • U R                   (       a  [        U R                  5      $ [        5       $ ©N)r7   ÚstrÚsubject©r6   s    r   Ú__str__ÚMailParser.__str__„   s   € Ø�<�<Ü�t—|‘|Ó$Ð$ä“5ˆLr   c                 óÜ   • [         R                  S5         UR                  S5        UR	                  5       nU R                  U5      $ ! [         a     N-f = f! UR	                  5       nf = f)z¦
Init a new object from a file-like object.
Not for Outlook msg.

Args:
    fp (file-like object): file-like object of raw email

Returns:
    Instance of MailParser
zParsing email from file objectr   )r0   r1   ÚseekÚOSErrorÚreadr%   )Úclsr   r&   s      r   r   ÚMailParser.from_file_objŠ   sa   € ô 	�	‰	Ð2Ô3ð	Ø�G‰G�AŒJð —‘“	ˆAà�‰˜qÓ!Ð!øô ó 	ñ ð	ûð
 —‘“	‰Aús#   —A	 Á	
AÁA ÁAÁA ÁA+c                 ó&  • [         R                  SU< 35        [        U5       n[        R                  " U5      nSSS5        U(       a/  [         R                  SU< 35        [
        R                  " U5        U " W5      $ ! , (       d  f       NL= f)z¯
Init a new object from a file path.

Args:
    fp (string): file path of raw email
    is_outlook (boolean): if True is an Outlook email

Returns:
    Instance of MailParser
zParsing email from file Nz&Removing temp converted Outlook email )r0   r1   r   ÚemailÚmessage_from_fileÚosÚremove)rF   r   Ú
is_outlookÚfr7   s        r   r   ÚMailParser.from_file¢   sl   € ô 	�	‰	Ð,¨R©FÐ3Ô4ä˜Œ_ Ü×-Ò-¨aÓ0ˆG÷ ö Ü�I‰IÐ>¸r¹fÐEÔFÜ�IŠI�bŒMá�7‹|Ð÷ �_ús   ¥BÂ
Bc                 óð   • [         R                  S5        [        R                  R	                  S5      b  [        U5      u  p#O"[         R                  S5        [        U5      u  p#U R                  US5      $ )uÒ  
Init a new object from a Outlook message file,
mime type: application/vnd.ms-outlook

Conversion backend precedence:
  1. ``extract-msg`` (pure Python, optional ``outlook`` extra).
  2. ``msgconvert`` external Perl tool â€” **deprecated** fallback,
     used only when ``extract-msg`` is not installed.

Args:
    fp (string): file path of raw Outlook email

Returns:
    Instance of MailParser

Raises:
    MailParserOSError: if no conversion backend is available
zParsing email from file OutlookÚextract_msgzšmsgconvert backend is deprecated and will be removed in a future release. Install the pure-Python Outlook support with 'pip install mail-parser[outlook]'.T)	r0   r1   Ú	importlibÚutilÚ	find_specr	   Úwarningr   r   )rF   r   rN   Ú_s       r   r"   ÚMailParser.from_file_msg¹   sd   € ô( 	�	‰	Ð3Ô4ä�>‰>×#Ñ# MÓ2Ñ>Ü& rÓ*‰DˆAˆqä�K‰KðCôô
 ˜b“>‰DˆAà�}‰}˜Q Ó%Ð%r   c                 óh   • [         R                  S5        [        R                  " U5      nU " U5      $ )zh
Init a new object from a string.

Args:
    s (string): raw email

Returns:
    Instance of MailParser
zParsing email from string)r0   r1   rI   Úmessage_from_string)rF   r&   r7   s      r   r%   ÚMailParser.from_stringÛ   s+   € ô 	�	‰	Ð-Ô.Ü×+Ò+¨AÓ.ˆÙ�7‹|Ðr   c                 óh   • [         R                  S5        [        R                  " U5      nU " U5      $ )z†
Init a new object from bytes.

Args:
    bt (bytes-like object): raw email as bytes-like object

Returns:
    Instance of MailParser
zParsing email from bytes)r0   r1   rI   Úmessage_from_bytes)rF   r*   r7   s      r   r)   ÚMailParser.from_bytesë   s+   € ô 	�	‰	Ð,Ô-Ü×*Ò*¨2Ó.ˆÙ�7‹|Ðr   c                 ó    • [         R                  S5        / U l        / U l        / U l        / U l        / U l        [        5       U l        SU l	        g)z!
Reset the state of mail object.
zReset all variablesFN)
r0   r1   Ú_attachmentsÚ_text_plainÚ
_text_htmlÚ_text_not_managedÚ_defectsÚsetÚ_defects_categoriesÚ_has_defectsr?   s    r   Ú_resetÚMailParser._resetú   sI   € ô 	�	‰	Ð'Ô(àˆÔØˆÔØˆŒØ!#ˆÔØˆŒÜ#&£5ˆÔ Ø!ˆÕr   c                 óž  • 0 nUR                    H‘  nUR                  R                   SUR                   3nU R                  R                  UR                  R                  5        UR                  U/ 5      R                  U5        [        R                  SU< 35        M“     U(       a#  SU l
        U R                  R                  U5        gg)zä
Add new defects and defects categories to object attributes.

The defects are a list of all the problems found
when parsing this message.

Args:
    part (string): mail part
    part_content_type (string): content type of part
z: zAdded defect TN)ÚdefectsÚ	__class__Ú__name__Ú__doc__re   ÚaddÚ
setdefaultÚappendr0   r1   rf   rc   )r6   ÚpartÚpart_content_typeÚpart_defectsÚerj   s         r   Ú_append_defectsÚMailParser._append_defects  s©   € ð ˆà—”ˆAØŸ™×-Ñ-Ð.¨b°·±°Ð<ˆGØ×$Ñ$×(Ñ(¨¯©×)=Ñ)=Ô>Ø×#Ñ#Ð$5°rÓ:×AÑAÀ'ÔJÜ�I‰I˜ g¡[Ð1Ö2ñ	 ö Ø $ˆDÔð �M‰M× Ñ  Õ.ð	 r   c                 ó8  • 0 n[        U R                  U5      nU H4  n[        R                  SU< 35        [	        X5      nU(       d  M0  XRU'   M6     U R
                  US'   U R
                  (       a'  U R                  US'   [        U R                  5      US'   U$ )zõ
This method assigns the right values to all tokens of email.
Returns a parsed object

Keyword Arguments:
    complete {bool} -- If True returns all mails parts
                        (default: {True})

Returns:
    dict -- Parsed email object
zGetting header or part Úhas_defectsrj   Údefects_categories)	r   r7   r0   r1   Úgetattrrx   rj   Úlistry   )r6   ÚcompleteÚmailr4   ÚiÚvalues         r   Ú
_make_mailÚMailParser._make_mail#  s�   € ð ˆÜ˜TŸ\™\¨8Ó4ˆãˆAÜ�I‰IÐ/°©uÐ5Ô6Ü˜DÓ$ˆEßˆuØ�Q“ñ	 ð #×.Ñ.ˆˆ]ÑØ××Ø"Ÿl™lˆD�‰OÜ)-¨d×.EÑ.EÓ)FˆDÐ%Ñ&àˆr   c                 ób  • U R                   (       d  U $ U R                  5         / nU R                   R                  5        H5  nUR                  5       nU R	                  X#5        UR                  U5        M7     U R                  [        -  (       a¸  [        R                  S5        [        U R                   R                  SR                  SU R                   R                  5       -   5      SR                  SU R                   R                  5       -   S-   5      5      nUb(   [        R                  " U5      nUR                  U5        [%        U5       GHV  u  pRUR'                  5       (       a-  [)        UR+                  5       5      R-                  5       S:X  d  MH  UR/                  S5      nUR/                  5       n[        R                  SU< S	U< 35        [)        UR+                  5       5      R-                  5       n[        R                  S
U< S	U< 35        [)        UR1                  S5      5      n	[        R                  SU	< S	U< 35        [)        UR3                  5       5      n
[        R                  SU
< S	U< 35        [5        UR7                  5       5      nSnU(       a  SnO=U	(       a  U
S;  a  SnU	nO+U
S;   a  Sn[9        5        S3nOUS:X  a  Sn[9        5        S3nU(       GaX  [        R                  SU< S35        [        R                  SU< S	U< 35        Sn[)        UR                  5       5      n[        R                  SU< S	U< 35        [)        UR1                  SS5      5      R-                  5       n[        R                  SU< S	U< 35        [)        UR1                  S5      5      n[        R                  S
U< S	U< 35        UR'                  5       (       a^  SR;                  UR=                  SS9 Vs/ s H  nUR?                  5       PM     sn5      nSn[        R                  SU< S	U< S35        OÒUS:X  d  US:X  a6  S U;   a0  UR=                  SS9nSn[        R                  SU< S	U< S!35        O�S"U;   aU  [@        RB                  " UR=                  SS95      RE                  S#5      nSnSn[        R                  SU< S	U< S$35        O5[)        UR=                  SS9US%9n[        R                  SU< S	U< S&35        U RF                  R                  UUUUU	UUUS'.5        GMù  [        R                  SU< S(35        UR=                  SS9nUR1                  S)5      nU(       a  UR-                  5       nU(       a  US*;   aD  UR=                  SS9n[I        U[J        5      (       a   URM                  S5        UnO[)        UUS%9nO
[)        UUS%9nU(       d  GM¯  UR3                  5       S,:X  a  U RP                  R                  U5        GMá  UR3                  5       S-:X  a  U RR                  R                  U5        GM  [        RU                  S.UR3                  5       < S/35        U RV                  R                  U5        GMY     U RY                  5       U l-        U RY                  SS09U l.        g! [          a    [        R#                  S5         GN²f = fs  snf ! [N         a     URM                  S#S+5      n[)        UUS%9n GN4f = f)1zs
This method parses the raw email and makes the tokens.

Returns:
    Instance of MailParser with raw email parsed
zFound defects in emailsz{}z--Nz,Failed to get epilogue part. Check raw mail.Ú
attachmentzutf-8zCharset z part zcontent-disposition ú
content-idzcontent-id zcontent subtype FT)ÚhtmlÚplainÚrtfz.rtfz.txtzEmail part z is an attachmentz	Filename zMail content type zcontent-transfer-encodingÚ zTransfer encoding úcontent-disposition)Údecodez is multipartÚbase64z'quoted-                       printableÚapplicationz
 is binaryÚuuencodeÚasciiz* is binary (uuencode re-encoded to base64))Úencodingz is not binary)ÚfilenameÚpayloadÚbinaryÚmail_content_typer„   r‰   ÚcharsetÚcontent_transfer_encodingz is not an attachmentzContent-Transfer-Encoding)Ú7bitÚ8bitÚsurrogateescaper…   r†   zEmail content z not handled)r|   )/r7   rg   ÚwalkÚget_content_typeru   rp   ry   r   r0   r1   r
   Úepiloguer2   Úget_boundaryrI   rY   Ú	ExceptionÚerrorÚ	enumerateÚis_multipartr   Úget_content_dispositionÚlowerÚget_content_charsetÚgetÚget_content_subtyper   Úget_filenamer   r3   Úget_payloadÚ	as_stringr‹   Ú	b64encoderŠ   r_   Ú
isinstancer=   ÚencodeÚUnicodeEncodeErrorra   r`   rU   rb   r€   Ú_mailÚ_mail_partial)r6   ÚpartsÚprr   r›   r~   r”   Úcharset_rawÚcontent_dispositionÚ
content_idÚcontent_subtyper�   Úis_attachmentr’   r“   Útransfer_encodingÚmr‘   ÚcteÚraw_strÚ
orig_bytess                        r   r5   ÚMailParser.parseA  ss  € ð �|�|ØˆKð 	�‰ŒØˆð —‘×"Ñ"Ö$ˆAØ !× 2Ñ 2Ó 4ÐØ× Ñ  Ô6Ø�L‰L˜ŽOñ %ð ×"Ñ"Ô%5×5Ü�I‰IÐ/Ô0Ü#Ø—‘×%Ñ%Ø—‘˜D 4§<¡<×#<Ñ#<Ó#>Ñ>Ó?Ø—‘˜D 4§<¡<×#<Ñ#<Ó#>Ñ>ÀÑEÓFóˆHð Ñ#ðNÜ×1Ò1°(Ó;�AØ—L‘L ”Oô
 ˜e×$‰DˆAà—N‘N×$Ñ$Ü  ×!:Ñ!:Ó!<Ó=×CÑCÓEÈÕUà×/Ñ/°Ó8�Ø×3Ñ3Ó5�Ü—	‘	˜H W¡K¨v°a±UÐ;Ô<Ü&3°A×4MÑ4MÓ4OÓ&P×&VÑ&VÓ&XÐ#Ü—	‘	Ð0Ð1DÑ0GÀvÈaÉUÐSÔTÜ*¨1¯5©5°Ó+>Ó?�
Ü—	‘	˜K¨
¡~°V¸A¹5ÐAÔBÜ"/°×0EÑ0EÓ0GÓ"H�Ü—	‘	Ð,¨_Ñ,?¸vÀaÁUÐKÔLÜ-¨a¯n©nÓ.>Ó?�à %�ÞØ$(‘Mæ! oÐ=NÓ&NØ(,˜Ø#-™Ø(¨UÓ3Ø(,˜Ü&3£oÐ%6°dÐ#;™Ø,°Ó<Ø(,˜Ü&3£oÐ%6°dÐ#;˜÷ !Ü—I‘I ¨A©5Ð0AÐBÔCÜ—I‘I 	¨(©°V¸A¹5ÐAÔBØ"�FÜ(5°a×6HÑ6HÓ6JÓ(KÐ%Ü—I‘IÐ 2Ð3DÑ2GÀvÈaÉUÐSÔTÜ(5ØŸ™Ð9¸2Ó>ó)ç‘e“gð &ô —I‘IÐ 2Ð3DÑ2GÀvÈaÉUÐSÔTÜ*7¸¿¹Ð>SÓ8TÓ*UÐ'Ü—I‘IÐ 4Ð5HÑ4KÈ6ÐRSÑQVÐWÔXà—~‘~×'Ñ'Ø"$§'¡'Ø45·M±MÈ°MÑ4OÓPÒ4O¨q˜QŸ[™[ž]Ñ4OÑPó#˜ð "'˜ÜŸ	™	 I¨h©\¸À¹uÀMÐ"RÕSØ*¨hÓ6Ø)ð"ó"ð *Ð->Ó>à"#§-¡-°u -Ð"=˜Ø!%˜ÜŸ	™	 I¨h©\¸À¹uÀJÐ"OÕPØ#Ð'8Ó8ä"(×"2Ò"2°1·=±=È°=Ð3MÓ"N×"UÑ"UØ#ó#˜ð "&˜Ø,4Ð)ÜŸ	™	Ø'¨¡|°6¸!¹ð ?5ð 5õô
 #0ØŸM™M°˜MÐ6Àñ#˜ô Ÿ	™	 I¨h©\¸À¹uÀNÐ"SÔTà×%Ñ%×,Ñ,à(0Ø'.Ø&,Ø1BØ*4Ø3FØ'2Ø9Jñ	÷ô —I‘I ¨A©5Ð0EÐFÔGàŸm™m°4˜mÐ8�GØŸ%™%Ð ;Ó<�CÞØ!Ÿi™i›k˜æ #Ð)9Ó"9ð #$§-¡-°u -Ð"=˜Ü% g¬s×3Ñ3ðVà '§¡¨wÔ 7Ø*1¡ô '4°GÀgÑ&N™Gä"/°À'Ñ"J˜ç‘wØ×0Ñ0Ó2°fÓ<Ø ŸO™O×2Ñ2°7×;Ø×2Ñ2Ó4¸Ó?Ø ×,Ñ,×3Ñ3°G×<äŸK™KØ"0°×1FÑ1FÓ1HÑ0KÈ<Ð Xôð !×2Ñ2×9Ñ9¸'×BñC %ðH —_‘_Ó&ˆŒ
ð "Ÿ_™_°e˜_Ð<ˆÕøôW !ó NÜ—I‘IÐL×MðNüòd QøôB $6ó Và-4¯^©^¸GÐEVÓ-W 
Ü*7¸
ÈWÑ*U£ðVús*   Ä"'[ Ð[?
×\Û[<Û;[<Ü&\.Ü-\.c                 óf  • [         R                  SU< 35        UR                  5       (       d  gU R                  (       d  gU R                  R	                  S/ 5      nU HN  n[        U5      nX;   d  M  [         R                  SU< SU< 35        U R                  U5      nU(       d  ML  Us  $    g)a}  
Return the ip address of sender

Overview:
Extract a reliable sender IP address heuristically for each message.
Although the message format dictates a chain of relaying IP
addresses in each message, a malicious relay can easily alter that.
Therefore we cannot simply take the first IP in
the chain. Instead, our method is as follows.
First we trust the sender IP reported by our mail server in the
Received headers, and if the previous relay IP address is on our trust
list (e.g. other well-known mail services), we continue to
follow the previous Received line, till we reach the first unrecognized
IP address in the email header.

From article Characterizing Botnets from Email Spam Records:
    Li Zhuang, J. D. Tygar

In our case we trust only our mail server with the trust string.

Args:
    trust (string): String that identify our mail server

Returns:
    string with the ip address
zTrust string is NÚreceivedzTrust string z is in )r0   r1   Ústripr7   Úget_allr   Ú_extract_ip)r6   Útrustr½   r~   Úip_strs        r   Úget_server_ipaddressÚMailParser.get_server_ipaddressð  s’   € ô6 	�	‰	Ð$ U¡IÐ.Ô/à�{‰{�}‰}Øà�|�|Øà—<‘<×'Ñ'¨
°BÓ7ˆãˆAÜ˜aÓ ˆAØ�zÜ—	‘	˜M¨%©°'¸!¹Ð?Ô@Ø×)Ñ)¨!Ó,�ß�6Ø!’Mò r   c                 ó¶  • UR                  S5      nUS:w  a  USU OUn[        R                  " U5      nU(       d  [        R                  " U5      nU(       aq   [	        US   5      n[
        R                  SU< SU< 35        [        R                  " U5      nUR                  (       d  [
        R                  SU< S35        U$  gg! [         a     gf = f)zô
Extract the IP address from the received header if it is not private.
Supports both IPv4 (RFC 791) and IPv6 (RFC 5952) addresses.

Args:
    received_header (string): The received header string

Returns:
    string with the ip address or None
ÚbyéÿÿÿÿNzFound sender IP z in zIP z not private)Úfindr   Úfindallr   r=   r0   r1   Ú	ipaddressÚ
ip_addressÚ
is_privateÚ
ValueError)r6   Úreceived_headerÚby_idxÚ	from_partÚcheckrÂ   Úips          r   rÀ   ÚMailParser._extract_ip  sÊ   € ð !×%Ñ% dÓ+ˆØ06¸"³�O G VÑ,À/ˆ	ô —’˜yÓ)ˆÞÜ—O’O IÓ.ˆEæð	"Ü˜U 2™Y›�Ü—	‘	Ð,¨V©J°d¸?Ñ:MÐNÔOÜ×)Ò)¨&Ó1�ð —}—}Ü—I‘I  F¡:¨\Ð:Ô;Ø!�Mð %ñ øô ó Ùðús   ÁAC Ã
CÃCc                 ó,   • [        U R                  US9  g)z|This method writes the attachments of mail on disk

Arguments:
    base_path {str} -- Base path where write the attachments
)ÚattachmentsÚ	base_pathN)r   rÕ   )r6   rÖ   s     r   r   ÚMailParser.write_attachments=  s   € ô 	 d×&6Ñ&6À)ÓLr   c                 óº  • UR                  S5      R                  5       nUR                  SS5      nUR                  S5      (       a#  US S n[        R
                  " [        X5      SS9$ UR                  S5      (       aH  US S nU R                  (       a  U R                  R                  U5      OS n[        R
                  " USS9$ U[        ;   an  U R                  (       a  U R                  R                  US	5      OS	n[        U5      nU VVs/ s H$  u  pU(       d  M  [        U5      =ov:X  a  S	OUU4PM&     snn$ [        U R                  U5      $ s  snnf )
NrV   Ú-Ú_jsonéûÿÿÿF©Úensure_asciiÚ_rawéüÿÿÿrˆ   )r¾   r¢   ÚreplaceÚendswithÚjsonÚdumpsrz   r7   r¿   r   r¤   r   r   r   )r6   ÚnameÚname_headerÚrawÚ
raw_headerÚparsed_addressesÚ
email_addrÚdecoded_names           r   Ú__getattr__ÚMailParser.__getattr__E  s@  € Ø�z‰z˜#‹×$Ñ$Ó&ˆØ—l‘l 3¨Ó,ˆð �=‰=˜×!Ñ!Ø˜˜�9ˆDÜ—:’:œg dÓ1ÀÑFÐFð �]‰]˜6×"Ñ"Ø˜˜�9ˆDØ04··�$—,‘,×&Ñ& tÔ,À$ˆCÜ—:’:˜c°Ñ6Ð6ð Ô-Ó-Ø>B¿l¿l˜Ÿ™×)Ñ)¨+°rÔ:ÐPRˆJô  -¨ZÓ8Ðñ )9ôò )9Ñ$�DÜóô -?¸tÓ,DÐD˜LÓSñ à)àóñ )9òð ô ˜dŸl™l¨KÓ8Ð8ùós   ÄEÄ#Ec                 ó   • U R                   $ )z.
Return a list of all attachments in the mail
)r_   r?   s    r   rÕ   ÚMailParser.attachmentss  ó   € ð
 × Ñ Ð r   c                 ó0   • U R                   n[        U5      $ )z.
Return a list of all received headers parsed
)Úreceived_rawr   )r6   Úoutputs     r   r½   ÚMailParser.receivedz  s   € ð
 ×"Ñ"ˆÜ  Ó(Ð(r   c                 óB   • [         R                  " U R                  SSS9$ )z'
Return a JSON of all received headers
Fé   ©rÝ   Úindent)râ   rã   r½   r?   s    r   Úreceived_jsonÚMailParser.received_json‚  s   € ô
 �zŠz˜$Ÿ-™-°eÀAÑFÐFr   c                 óª   • / nU R                   (       a  U R                   R                  S/ 5      O/  H  nUR                  [        U5      5        M     U$ )z5
Return a list of all received headers in raw format
r½   )r7   r¿   rp   r   )r6   rò   r~   s      r   rñ   ÚMailParser.received_raw‰  sG   € ð
 ˆØ9=¿¿�—‘×%Ñ% j°"Ô5È2ÒMˆAØ�M‰MÔ,¨QÓ/Ö0ñ Nàˆr   c                 ól   • SR                  U R                  U R                  -   U R                  -   5      $ )za
Return all text plain and text html parts of mail delimited from string
"--- mail_boundary ---"
z
--- mail_boundary ---
)r3   Ú
text_plainÚ	text_htmlÚtext_not_managedr?   s    r   ÚbodyÚMailParser.body“  s2   € ð +×/Ñ/Ø�O‰O˜dŸn™nÑ,¨t×/DÑ/DÑDó
ð 	
r   c                 ó¸   • [        U R                  (       a  U R                  R                  5       O/ 5      S1-
  nU Vs0 s H  o"[        X5      _M     sn$ s  snf )z*
Return only the headers as Python object
Úheaders)rd   r7   r4   rz   )r6   Úall_headersr~   s      r   r  ÚMailParser.headers�  sJ   € ô
 °··˜$Ÿ,™,×+Ñ+Ô-À2ÓFÈ)ÈÑTˆÙ-8Ó9ª[¨”7˜4Ó#Ò#©[Ñ9Ð9ùÒ9s   ¿Ac                 óB   • [         R                  " U R                  SSS9$ )z
Return the JSON of headers
Frõ   rö   )râ   rã   r  r?   s    r   Úheaders_jsonÚMailParser.headers_json¥  s   € ô
 �zŠz˜$Ÿ,™,°UÀ1ÑEÐEr   c                 ó   • U R                   $ )z1
Return a list of all text plain parts of email.
)r`   r?   s    r   rý   ÚMailParser.text_plain¬  s   € ð
 ×ÑÐr   c                 ó   • U R                   $ )z0
Return a list of all text html parts of email.
)ra   r?   s    r   rþ   ÚMailParser.text_html³  s   € ð
 �‰Ðr   c                 ó   • U R                   $ )z1
Return a list of all text not managed of email.
)rb   r?   s    r   rÿ   ÚMailParser.text_not_managedº  s   € ð
 ×%Ñ%Ð%r   c                 ó¤   • U R                   (       a  U R                   R                  S5      OSnSn [        U5      u  p#U$ ! [         a     U$ f = f)z;
Return the mail date in datetime.datetime format and UTC.
ÚdateN©r7   r¤   r   r�   )r6   r  ÚconvrV   s       r   r  ÚMailParser.dateÁ  sV   € ð
 ,0¯<¯<ˆt�|‰|×Ñ Ô'¸TˆØˆð	Ü'¨Ó-‰GˆDð ˆøô ó 	ØØˆð	úó   ²A Á
AÁAc                 ó¤   • U R                   (       a  U R                   R                  S5      OSnSn [        U5      u  p2U$ ! [         a     U$ f = f)z#
Return timezone. Offset from UTC.
r  Nr   r  )r6   r  ÚtimezonerV   s       r   r  ÚMailParser.timezoneÏ  sV   € ð
 ,0¯<¯<ˆt�|‰|×Ñ Ô'¸TˆØˆð	Ü+¨DÓ1‰KˆAð ˆøô ó 	ØØˆð	úr  c                 ó€   • U R                   (       a-  [        R                  " U R                   R                  5       SS9$ g)z
Return the JSON of date
FrÜ   N)r  râ   rã   Ú	isoformatr?   s    r   Ú	date_jsonÚMailParser.date_jsonÝ  s.   € ð
 �9�9Ü—:’:˜dŸi™i×1Ñ1Ó3À%ÑHÐHð r   c                 ó   • U R                   $ )z)
Return the Python object of mail parsed
)r­   r?   s    r   r}   ÚMailParser.mailå  s   € ð
 �z‰zÐr   c                 óò   • U R                   R                  S5      (       a8  U R                  (       a'  U R                  R                  5       U R                  S'   [
        R                  " U R                   SSS9$ )z 
Return the JSON of mail parsed
r  Frõ   rö   )r}   r¤   r  r  r­   râ   rã   r?   s    r   Ú	mail_jsonÚMailParser.mail_jsonì  sO   € ð
 �9‰9�=‰=˜× Ñ  T§Y§YØ!%§¡×!4Ñ!4Ó!6ˆD�J‰J�vÑÜ�zŠz˜$Ÿ)™)°%ÀÑBÐBr   c                 ó   • U R                   $ )zE
Return the Python object of mail parsed
with only the mains headers
)r®   r?   s    r   Úmail_partialÚMailParser.mail_partialõ  s   € ð ×!Ñ!Ð!r   c                 óò   • U R                   R                  S5      (       a8  U R                  (       a'  U R                  R                  5       U R                  S'   [
        R                  " U R                   SSS9$ )z(
Return the JSON of mail parsed partial
r  Frõ   rö   )r"  r¤   r  r  r®   râ   rã   r?   s    r   Úmail_partial_jsonÚMailParser.mail_partial_jsoný  sW   € ð
 ×Ñ× Ñ  ×(Ñ(¨T¯Y¯YØ)-¯©×)<Ñ)<Ó)>ˆD×Ñ˜vÑ&Ü�zŠz˜$×+Ñ+¸%ÈÑJÐJr   c                 ó   • U R                   $ )z[
The defects property contains a list of
all the problems found when parsing this message.
)rc   r?   s    r   rj   ÚMailParser.defects  s   € ð �}‰}Ðr   c                 ó   • U R                   $ )z,
Return a set with only defects categories.
)re   r?   s    r   ry   ÚMailParser.defects_categories  s   € ð
 ×'Ñ'Ð'r   c                 ó   • U R                   $ )z-
Return a boolean: True if mail has defects.
)rf   r?   s    r   rx   ÚMailParser.has_defects  rï   r   c                 ó   • U R                   $ )z
email.message.Message class.
)r/   r?   s    r   r7   ÚMailParser.message  s   € ð
 �}‰}Ðr   c                 ó\   • U R                   (       a  U R                   R                  5       $ S$ )z2
Return the entire message flattened as a string.
rˆ   )r7   r¨   r?   s    r   Úmessage_as_stringÚMailParser.message_as_string#  s"   € ð
 ,0¯<¯<ˆt�|‰|×%Ñ%Ó'Ð?¸RÐ?r   c                 óB   • [        U R                  U R                  5      $ )z:
Return all domain of 'to' and 'reply-to' email addresses
)r   ÚtoÚreply_tor?   s    r   Ú
to_domainsÚMailParser.to_domains*  s   € ô
 ˜dŸg™g t§}¡}Ó5Ð5r   )
r_   rc   re   rf   r­   r®   r/   ra   rb   r`   r<   )F)T)0rl   Ú
__module__Ú__qualname__Ú__firstlineno__rm   r8   r=   r@   Úclassmethodr   r   r"   r%   r)   rg   ru   r€   r5   rÃ   rÀ   r   rë   ÚpropertyrÕ   r½   rø   rñ   r   Údictr  r  rý   rþ   rÿ   r  r  r  r}   r  r"  r%  rj   ry   rx   r7   r0  r5  Ú__static_attributes__© r   r   r   r   q   sŠ  † ñôð˜ô ð ñ"ó ð"ð. óó ðð, ñ&ó ð&ðB ñó ðð ñó ðò"ò/ô6ò<m=ò^+"òZò@Mò,9ð\ ñ!ó ð!ð ñ)ó ð)ð ñGó ðGð ñó ðð ñ
ó ð
ð ð:˜ó :ó ð:ð ñFó ðFð ñ ó ð ð ñó ðð ñ&ó ð&ð ñó ðð ñó ðð ñIó ðIð ñó ðð ñCó ðCð ñ"ó ð"ð ñKó ðKð ñó ðð ñ(ó ð(ð ñ!ó ð!ð ñó ðð ñ@ó ð@ð ñ6ó ó6r   r   )&rm   r‹   rI   Úimportlib.utilrR   rÊ   râ   ÚloggingrK   Úmailparser.constr   r   r   r   Úmailparser.utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Ú	getLoggerrl   r0   r   r    r#   r'   r+   r   r>  r   r   Ú<module>rD     sr   ðñó  Û Û Û Û Û Û 	ç QÓ Q÷÷ ÷ ÷ ð" ×Ò˜Ó!€ò
(ò
$ò
(ò
%ò
%÷~
6ò ~
6r   