Ë
    ˆÉði»9  ã                   óÔ   — d Z ddlZddlZddlZddlZddlZddl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 dd	lmZ dd
lmZmZmZmZmZ  e«       Z G d„ de«      Zy)uÖ   
Commande de polling IMAP pour les mails entrants des tenants.

Usage:
  python manage.py poll_mail                    â†’ tous les tenants actifs
  python manage.py poll_mail --tenant-id 5      â†’ un seul tenant
é    N)ÚdatetimeÚtimezoneÚ	timedelta)Úsettings)Úget_user_model)ÚContentFile)Ú	send_mail)ÚBaseCommand)r   )ÚMailInboxConfigÚ
MailSourceÚIncomingMailÚMailAttachmentÚ
Membershipc                   ó†   — e Zd ZdZd„ Zd„ Zd„ Zg d¢Zdedefd„Z	d	„ Z
d
efd„Zdedefd„Zd„ Zdefd„Zdefd„Zdefd„Zy)ÚCommanduC   Poll les boÃ®tes IMAP configurÃ©es et intercepte les mails clients.c                 ó6   — |j                  dt        d d¬«       y )Nú--tenant-idu+   Limiter le poll Ã  un seul tenant (par ID).©ÚtypeÚdefaultÚhelp©Úadd_argumentÚint©ÚselfÚparsers     ú;/var/www/html/acx/accounts/management/commands/poll_mail.pyÚadd_argumentszCommand.add_arguments"   s!   € Ø×ÑØÜØØ>ð	 	õ 	
ó    c                 óŽ   — |j                  dt        d ¬«       |j                  ddd¬«       |j                  dt        d d¬	«       y )
Nr   )r   r   z	--verboseÚ
store_trueu*   Affiche le dÃ©tail de chaque email traitÃ©)Úactionr   z--daysu8   Forcer la fenÃªtre de recherche en jours (ex: --days 30)r   r   r   s     r   r   zCommand.add_arguments*   sE   € Ø×Ñ˜M´¸TÐÔBØ×Ñ˜K°ÐCoÐÔpØ×Ñ˜H¬3¸ÐC}ÐÕ~r    c                 ó`  — |j                  d«      }|j                  dd«      | _        |j                  d«      | _        t        j                  j                  d¬«      j                  d«      }|r|j                  |¬«      }|j                  «       s| j                  j                  d	«       y |D ]Œ  }| j                  j                  d
|j                  j                  › d|j                  › d�«       	 | j                  |«      }| j                  j                  | j                  j                  d|› d�«      «       ŒŽ y # t         $ rd}t#        |«      |_        |j'                  dg¬«       | j(                  j                  | j                  j+                  d|› �«      «       Y d }~Œød }~ww xY w)NÚ	tenant_idÚverboseFÚdaysT)Ú	is_activeÚtenant)r%   z!Aucune configuration IMAP active.u   â†’ Polling [ú] u   â€¦u     âœ“ u#    nouveau(x) mail(s) interceptÃ©(s).Ú
last_error©Úupdate_fieldsu     âœ— Erreur : )Úgetr&   Ú
force_daysr   ÚobjectsÚfilterÚselect_relatedÚexistsÚstdoutÚwriter)   ÚnameÚ	imap_userÚ_poll_tenantÚstyleÚSUCCESSÚ	ExceptionÚstrr+   ÚsaveÚstderrÚERROR)r   ÚargsÚoptionsr%   ÚqsÚcfgÚ	new_countÚexcs           r   ÚhandlezCommand.handle/   se  € Ø—K‘K Ó,ˆ	Ø—{‘{ 9¨eÓ4ˆŒØ!Ÿ+™+ fÓ-ˆŒÜ×$Ñ$×+Ñ+°dÐ+Ó;×JÑJÈ8ÓTˆÙØ—‘ Y�Ó/ˆBà�y‰yŒ{Ø�K‰K×ÑÐAÔBØàò 
	MˆCØ�K‰K×Ñ ¨c¯j©j¯o©oÐ->¸bÀÇÁÀÈsÐSÔTðMØ ×-Ñ-¨cÓ2�	Ø—‘×!Ñ!Ø—J‘J×&Ñ&¨°	¨{Ð:]Ð'^Ó_õñ	
	Møô ò MÜ!$ S£�”Ø—‘¨ ~�Ô6Ø—‘×!Ñ! $§*¡*×"2Ñ"2°_ÀSÀEÐ3JÓ"K×LÑLûðMús   Ã4A	E Å 	F-Å	AF(Æ(F-)
ÚSpamÚJunkÚSPAMÚJUNKz
Junk Emailz	Junk Mailz[Gmail]/Spamz
INBOX.Spamz
INBOX.Junkz	Bulk MailrC   Úreturnc           
      ó¢  — |j                   r+t        j                  |j                  |j                  «      }n*t        j
                  |j                  |j                  «      }|j                  |j                  |j                  «       | j                  r,t        j                  «       t        | j                  ¬«      z
  }nG|j                  r|j                  t        d¬«      z
  }n!t        j                  «       t        d¬«      z
  }|j                  d«      }t        t         j"                  j%                  |j&                  d¬«      «      }| j(                  rE| j*                  j-                  dt/        |«      › d�d	j1                  d
„ |D «       «      xs dz   «       |j                  «       \  }}g }|D ]v  }	t3        |	t4        «      sŒ|	j7                  «       j9                  d«      }
|
d   j;                  «       j;                  d«      j;                  «       }|sŒf|j=                  |«       Œx |j>                  g}| j@                  D ]  }||v sŒ|j=                  |«       Œ d}|D �]"  }	 |jC                  |«      \  }}|dk7  rŒ|jE                  d d|› d�«      \  }}|d   j9                  «       D �cg c]  }|sŒ|‘Œ	 }}|r/| j*                  j-                  d|› dt/        |«      › d|› d�«       n+| j(                  r| j*                  j-                  d|› d�«       |D ]g  }	 | jG                  |||j&                  |«      \  }}|r|dz  }n;| j(                  r/| j*                  j-                  d|j7                  «       › d|› �«       Œi �Œ% |jM                  «        t        j                  «       |_        d|_'        |jQ                  ddg¬«       |S c c}w # tH        $ r+}| jJ                  j-                  d|› d|› �«       Y d }~Œçd }~ww xY w# tH        $ r8}| j(                  r!| j*                  j-                  d|› d|› �«       Y d }~�Œäd }~ww xY w)N)r'   é   é   z%d-%b-%YT)r)   r(   z  Sources actives (z) : z, c              3   ó4   K  — | ]  }|j                   –— Œ y ­w)N)Úemail_or_domain)Ú.0Úss     r   ú	<genexpr>z'Command._poll_tenant.<locals>.<genexpr>d   s   è ø€ Ò(L¸q¨×):Õ):Ñ(Lùs   ‚z(aucune)ú"éÿÿÿÿr   ÚOKzSINCE "z  [r*   z message(s) depuis le ú.z] 0 message.z    UID u    ignorÃ© â€” u    â€” erreur : u   ] inaccessible â€” Ú Úlast_polled_atr+   r,   ))Úuse_sslÚimaplibÚ	IMAP4_SSLÚ	imap_hostÚ	imap_portÚIMAP4Úloginr7   Úimap_passwordr/   r   Únowr   rY   ÚstrftimeÚlistr   r0   r1   r)   r&   r4   r5   ÚlenÚjoinÚ
isinstanceÚbytesÚdecodeÚsplitÚstripÚappendÚmailboxÚSPAM_FOLDERSÚselectÚsearchÚ_process_uidr;   r>   Úlogoutr+   r=   )r   rC   ÚimapÚsince_dtÚ	since_strÚsourcesÚ_Úfolder_listÚavailable_foldersÚfÚpartsÚfolder_nameÚfolders_to_scanÚspam_folderrD   ÚfolderÚstatusÚdataÚuÚuid_listÚuidÚcreatedÚreasonrE   s                           r   r8   zCommand._poll_tenantO   sÁ  € Ø�;Š;Ü×$Ñ$ S§]¡]°C·M±MÓB‰Dä—=‘= §¡°·±Ó>ˆDà�
‰
�3—=‘= #×"3Ñ"3Ô4ð �?Š?Ü—|‘|“~¬	°t·±Ô(GÑG‰HØ×ÒØ×)Ñ)¬I¸1Ô,=Ñ=‰Hä—|‘|“~¬	°rÔ(:Ñ:ˆHØ×%Ñ% jÓ1ˆ	ä”z×)Ñ)×0Ñ0¸¿
¹
ÈdÐ0ÓSÓTˆØ�<Š<Ø�K‰K×ÑÐ 3´C¸³L°>ÀÐFØ#Ÿy™yÑ(LÀGÔ(LÓLÒZÐPZñ\ô ]ð Ÿ™›‰ˆˆ;ØÐØò 	:ˆAÜ˜!œUÕ#ØŸ™›
×(Ñ(¨Ó-�Ø# B™iŸo™oÓ/×5Ñ5°cÓ:×@Ñ@ÓB�ÚØ%×,Ñ,¨[Õ9ð	:ð Ÿ;™;˜-ˆØ×,Ñ,ò 	4ˆKØÐ/Ò/Ø×&Ñ& {Õ3ð	4ð ˆ	Ø%ó 	NˆFðNØ ŸK™K¨Ó/‘	�˜Ø˜T’>ØØŸ+™+ d¨g°i°[ÀÐ,BÓC‘��4Ø'+¨A¡w§}¡}£Ö< !º!šAÐ<�Ð<ÙØ—K‘K×%Ñ%¨¨F¨8°2´c¸(³m°_ÐDZÐ[dÐZeÐefÐ&gÕhØ—\’\Ø—K‘K×%Ñ%¨¨F¨8°<Ð&@ÔAà#ò O�CðOØ*.×*;Ñ*;¸DÀ#ÀsÇzÁzÐSZÓ*[™˜ Ù"Ø%¨™N™IØ!Ÿ\š\Ø ŸK™K×-Ñ-°¸¿¹»¸ÀmÐTZÐS[Ð.\Ô]øòOð	Nð2 	�‰Œä%Ÿ\™\›^ˆÔØˆŒØ�‰Ð 0°,Ð?ˆÔ@àÐùò3 =øô %ò OØŸ™×)Ñ)¨H°S°E¸ÈÀuÐ*M×NÑNûðOûäò NØ—<’<Ø—K‘K×%Ñ%¨¨F¨8Ð3FÀsÀeÐ&LÔMÿùðNúsb   É*PÊ.PÊ2OÊ:OÊ>A#PÌ"A$OÎPÏPÏ	P
Ï!PÐ PÐP
Ð
PÐ	QÐ-Q	Ñ	Qc                 ó   — |j                  |d«      \  }}|d   d   }t        j                  |«      }|j                  d«      xs dj	                  «       }	|	s)dt        j                  |d d «      j                  «       z   }	t        j                  j                  |	¬«      j                  «       ry	|j                  d
d«      }
t        j                  j                  |
«      \  }}| j                  |«      }|j                  «       j	                  «       }|sy| j!                  ||«      }|sdd|› d�fS | j                  |j                  dd«      «      }|j                  dd«      }	 t        j                  j#                  |«      }|j$                  € |j'                  t(        j*                  ¬«      }| j3                  |«      \  }}t        j                  j5                  |||	||||||¬«	      }| j7                  ||«       | j8                  r>| j:                  j=                  | j>                  jA                  d|› d|d d › d�«      «       | jC                  ||«       | jE                  |«       y# t,        $ r t/        j0                  «       }Y ŒÛw xY w)Nz(RFC822)r   rM   z
Message-IDrX   zno-id-i   )Ú
message_id)Fu'   doublon (message_id dÃ©jÃ  enregistrÃ©)ÚFrom)Fu   aucun expÃ©diteur dÃ©tectableFu   expÃ©diteur 'u'   ' ne correspond Ã  aucune source activeÚSubjectÚDate)Útzinfo)	r)   Úmail_sourcerˆ   Ú
from_emailÚ	from_nameÚsubjectÚ	body_textÚ	body_htmlÚreceived_atu       âœ“ InterceptÃ© : u    â€” Â« é<   u    Â»)TÚok)#ÚfetchÚemailÚmessage_from_bytesr.   rk   ÚhashlibÚmd5Ú	hexdigestr   r0   r1   r3   ÚutilsÚ	parseaddrÚ_decode_headerÚlowerÚ_match_sourceÚparsedate_to_datetimerŒ   ÚreplaceÚdt_tzÚutcr;   r   rb   Ú_extract_bodyÚcreateÚ_save_attachmentsr&   r4   r5   r9   r:   Ú_notify_tenant_ownerÚ_notify_superadmin)r   rs   r„   r)   rv   rw   Úmsg_dataÚrawÚmsgrˆ   Úfrom_headerÚfrom_name_rawÚfrom_email_rawr�   rŽ   Úmatched_sourcer�   Údate_strr“   r‘   r’   Úincomings                         r   rq   zCommand._process_uid˜   sj  € Ø—j‘j  jÓ1‰ˆˆ8Ø�q‰k˜!‰nˆÜ×&Ñ& sÓ+ˆð —g‘g˜lÓ+Ò1¨r×8Ñ8Ó:ˆ
ÙØ!¤G§K¡K°°D°S°	Ó$:×$DÑ$DÓ$FÑFˆJä×Ñ×&Ñ&°*Ð&Ó=×DÑDÔFØCð —g‘g˜f bÓ)ˆÜ(-¯©×(=Ñ(=¸kÓ(JÑ%ˆ�~Ø×'Ñ'¨Ó6ˆ	Ø#×)Ñ)Ó+×1Ñ1Ó3ˆ
ÙØ9ð ×+Ñ+¨J¸Ó@ˆÙØ˜M¨*¨Ð5\Ð]Ð]Ð]ð ×%Ñ% c§g¡g¨i¸Ó&<Ó=ˆð —7‘7˜6 2Ó&ˆð	)ÜŸ+™+×;Ñ;¸HÓEˆKØ×!Ñ!Ð)Ø)×1Ñ1¼¿¹Ð1ÓC�ð
  $×1Ñ1°#Ó6Ñˆ	�9ô  ×'Ñ'×.Ñ.ØØ&Ø!Ø!ØØØØØ#ð /ó 

ˆð 	×Ñ˜s HÔ-à�<Š<Ø�K‰K×Ñ˜dŸj™j×0Ñ0Ø(¨¨°H¸WÀSÀb¸\¸NÈ#ÐNóô ð
 	×!Ñ! &¨(Ô3Ø×Ñ Ô)àøô? ò 	)Ü"Ÿ,™,›.ŠKð	)ús   Å&AI- É-JÊJrŽ   c                 ó¨   — d|v r|j                  d«      d   nd}|D ]3  }|j                  j                  «       }d|v r
||k(  sŒ'|c S ||k(  sŒ1|c S  y )Nú@rU   rX   )rj   rP   rŸ   )r   rŽ   rv   ÚdomainÚsourceÚpatterns         r   r    zCommand._match_sourceà   si   € Ø.1°ZÑ.?�×!Ñ! #Ó& rÒ*ÀRˆØò 	"ˆFØ×,Ñ,×2Ñ2Ó4ˆGØ�g‰~Ø Ó(Ø!’Mà˜WÓ$Ø!’Mð	"ð r    Úvaluec                 ó,  — |syt         j                  j                  |«      }g }|D ]M  \  }}t        |t        «      r'|j                  |j                  |xs dd¬«      «       Œ=|j                  |«       ŒO dj                  |«      j                  «       S )NrX   úutf-8r¢   ©ÚerrorsÚ )	r—   ÚheaderÚdecode_headerrg   rh   rl   ri   rf   rk   )r   r¸   r{   ÚdecodedÚpartÚcharsets         r   rž   zCommand._decode_headerð   s‚   € ÙØÜ—‘×*Ñ*¨5Ó1ˆØˆØ"ò 	%‰MˆD�'Ü˜$¤Ô&Ø—‘˜tŸ{™{¨7Ò+=°gÀi˜{ÓPÕQà—‘˜tÕ$ð		%ð
 �x‰x˜Ó ×&Ñ&Ó(Ð(r    c                 óR  — d}d}|j                  «       r©|j                  «       D ]’  }|j                  «       }t        |j	                  dd«      «      }d|v rŒ3|j                  d¬«      }|sŒH|j                  «       xs d}|dk(  r|s|j                  |d¬	«      }Œw|d
k(  sŒ}|rŒ€|j                  |d¬	«      }Œ” ||fS |j                  d¬«      }|rS|j                  «       xs d}|j                  «       }|d
k(  r|j                  |d¬	«      }||fS |j                  |d¬	«      }||fS )NrX   úContent-DispositionÚ
attachmentT©ri   rº   z
text/plainr¢   r»   z	text/html)Úis_multipartÚwalkÚget_content_typer<   r.   Úget_payloadÚget_content_charsetri   )	r   r¬   r‘   r’   rÁ   ÚctÚcdÚpayloadrÂ   s	            r   r¥   zCommand._extract_bodyü   sK  € Øˆ	Øˆ	à×ÑÔØŸ™›
ò J�Ø×*Ñ*Ó,�Ü˜Ÿ™Ð"7¸Ó<Ó=�Ø 2Ñ%ØØ×*Ñ*°$Ð*Ó7�ÙØØ×2Ñ2Ó4Ò?¸�Ø˜Ò%©iØ '§¡¨w¸y Ó I‘IØ˜;Ó&ªyØ '§¡¨w¸y Ó I‘IðJð. ˜)Ð#Ð#ð —o‘o¨T�oÓ2ˆGÙØ×1Ñ1Ó3Ò>°w�Ø×)Ñ)Ó+�Ø˜Ò$Ø '§¡¨w¸y Ó I�Ið ˜)Ð#Ð#ð !(§¡¨w¸y Ó I�Ià˜)Ð#Ð#r    r²   c           	      ó2  — |j                  «       sy |j                  «       D ]ó  }t        |j                  dd«      «      }d|vrd|vrŒ'|j	                  «       }|sŒ:| j                  |«      }|j                  d¬«      }|sŒ`|j                  «       xs d}t        |||t        |«      ¬«      }|j                  d	d
«      j                  dd
«      }	d|j                  › d	|j                  › d	|	› �}
|j                  j                  |
t        |«      d¬«       Œõ y )NrÄ   rX   rÅ   ÚinlineTrÆ   zapplication/octet-stream)ÚmailÚfilenameÚcontent_typeÚsizeú/rw   ú\zmail_attachments/)r=   )rÇ   rÈ   r<   r.   Úget_filenamerž   rÊ   rÉ   r   re   r¢   r%   ÚidÚfiler=   r   )r   r¬   r²   rÁ   rÍ   rÒ   r�   rÌ   rÅ   Úsafe_filenameÚpaths              r   r§   zCommand._save_attachments  s  € Ø×ÑÔ!Øà—H‘H“Jò 	EˆDÜ�T—X‘XÐ3°RÓ8Ó9ˆBØ 2Ñ%¨(¸"Ñ*<Øà×(Ñ(Ó*ˆHÙØØ×*Ñ*¨8Ó4ˆHà×#Ñ#¨4Ð#Ó0ˆDÙØà×&Ñ&Ó(ÒFÐ,FˆBä'ØØ!ØÜ˜“Yô	ˆJð %×,Ñ,¨S°#Ó6×>Ñ>¸tÀSÓIˆMØ& x×'9Ñ'9Ð&:¸!¸H¿K¹K¸=ÈÈ-ÈÐYˆDØ�O‰O× Ñ  ¤{°4Ó'8¸tÐ ÕDñ1	Er    c                 ól  — t         j                  j                  |d¬«      j                  d«      j	                  «       }|r|j
                  j                  sy 	 t        d|j                  d d › �d|j
                  j                  xs |j
                  j                  › d|j                  xs |j                  › d|j                  › d	|j                  › d
|j                  r|j                  j                  nd› d�t        j                   |j
                  j                  gd¬«       y # t"        $ r Y y w xY w)NT)r)   Úis_ownerÚuseru"   [ACX] Nouvelle demande client â€” éP   zBonjour u>   ,

Un nouveau mail client a Ã©tÃ© reÃ§u et interceptÃ©.

De : z <z
>
Objet : z

Client : u   â€”uI   

Connectez-vous Ã  la plateforme ACX pour le consulter et le dispatcher.©r�   ÚmessagerŽ   Úrecipient_listÚfail_silently)r   r0   r1   r2   ÚfirstrÞ   r—   r	   r�   Ú
first_nameÚusernamer�   rŽ   r�   Úclient_namer   ÚDEFAULT_FROM_EMAILr;   )r   r)   r²   Úowner_ms       r   r¨   zCommand._notify_tenant_owner<  s(  € ä×Ñ×%Ñ%¨V¸dÐ%ÓCß‰^˜FÓ#ß‰U‹Wð 	ñ
 ˜gŸl™l×0Ò0Øð	ÜØ<¸X×=MÑ=MÈcÈrÐ=RÐ<SÐTà˜wŸ|™|×6Ñ6ÒO¸'¿,¹,×:OÑ:OÐPð Qà$×.Ñ.ÒE°(×2EÑ2EÐFÀbÈ×I\ÑI\ÐH]ð ^Ø'×/Ñ/Ð0ð 1 ØDL×DXÒDX × 4Ñ 4× @Ò @Ð^cÐdð e^ð	_ô $×6Ñ6Ø '§¡× 2Ñ 2Ð3Ø"öøô ò 	Ùð	ús   ÁCD' Ä'	D3Ä2D3c                 ó¼  — t         j                  j                  dd¬«      j                  d«      j	                  «       }|r|j
                  sy 	 t        d|j                  j                  › �d|j                  j                  › d|j                  › d|j                  › d|j                  › d	�	t        j                  |j
                  gd¬
«       y # t        $ r Y y w xY w)NT)Úis_superuserr(   rØ   u$   [ACX Platform] Mail interceptÃ© â€” u.   Un mail a Ã©tÃ© interceptÃ© pour le tenant Â« u    Â».

ExpÃ©diteur : z	
Objet : z
Date : Ú
rà   )ÚUserr0   r1   Úorder_byrä   r—   r	   r)   r6   rŽ   r�   r“   r   rè   r;   )r   r²   Ú
superadmins      r   r©   zCommand._notify_superadminV  sÛ   € ä�L‰L×Ñ¨T¸TÐÓBß‰X�d‹^ß‰U‹Wð 	ñ
  ×!1Ò!1Øð	ÜØ>¸x¿¹×?SÑ?SÐ>TÐUàDÀXÇ_Á_×EYÑEYÐDZð [%Ø%-×%8Ñ%8Ð$9ð :Ø'×/Ñ/Ð0ð 1Ø&×2Ñ2Ð3°2ð7ô
 $×6Ñ6Ø *× 0Ñ 0Ð1Ø"öøô ò 	Ùð	ús   ÁA?C Ã	CÃCN)Ú__name__Ú
__module__Ú__qualname__r   r   rF   rn   r   r   r8   rq   r<   r    rž   r¥   r   r§   r¨   r©   © r    r   r   r      s‰   „ ØP€Dò
òò
Mò:M€LðG ð G°Có GòRBðP
¨ó 
ð 
) Cð 
)¨Có 
)ò$ð<E¨|ó EðD°\ó ð4¨<ô r    r   )Ú__doc__r—   Úemail.headerÚemail.utilsr™   r[   Úsocketr   r   r£   r   Údjango.confr   Údjango.contrib.authr   Údjango.core.files.baser   Údjango.core.mailr	   Údjango.core.management.baser
   Údjango.utilsÚaccounts.modelsr   r   r   r   r   rí   r   ró   r    r   ú<module>rÿ      sX   ðñó Û Û Û Û Û ß ;Ñ ;å  Ý .Ý .Ý &Ý 3Ý !÷õ ñ Ó€ôMˆkõ Mr    