U
    &3fTx                     @   s   d dl T d dlmZmZmZ d dlZd dlmZ d dlmZ d dl	Z	d dl
mZ d dlmZ d dlZd dlZd dlZd dlZd dlmZ d d	lmZ G d
d dejZG dd dZdS )    )*)	timedeltadatetimetimezoneN)Path)	imap_utf7)decode_header)chain)Template)cmf_mailbox2c                       s   e Zd ZedZdd Zdd Zdd Z fdd	Z fd
dZ	dd fdd
Z
dd Zdd Zedd Zdd ZeeddddddddZ  ZS )CmfMailbox2z/opt/eva-app/mailc                 C   s>   | j r| jjsd S | jsd S t| j| j d| j  | _ d S )N_)maildir_pathemail
is_changedstr_MAILDIR_BASE_PATHidself r   &./modules/mail2/models/cmf_mailbox2.py_calc_maildir_path=   s    zCmfMailbox2._calc_maildir_pathc                 C   sr   | j jsD| jjsD| jjsD| jjsD| jjsD| jjsD| jjsD| jjsDd S | j rb| jrb| jrb| jrb| jsfd S | 	  d S )N)
r   r   r   imap_server	imap_port
imap_cryptloginpasswordload_from_date_write_configr   r   r   r   _calc_offlineimap_configJ   s:    
z$CmfMailbox2._calc_offlineimap_configc                 C   s8   ddddddg}|D ]}| | r| | j  | |< qd S )Nr   r   r   r   Zsmtp_serverZ	smtp_port)valuestrip)r   paramsZparamr   r   r   _strip_params`   s    zCmfMailbox2._strip_paramsc                    s   t   ddg S )Nparentz	parent.id)supersave_preload_fieldsr   	__class__r   r   r'   f   s    zCmfMailbox2.save_preload_fieldsc                    sb   |    | jjrD| jrDtjjdd| jgdd| jggdrDtddd |   | 	  t
 j||S )	Nr   =r   z!=filteru^   Почтовый ящик для данного email уже заведен в системе!T)abort)r$   r   r   modelsr   getr   Z	cmf_alertr   r    r&   save)r   argskwargsr(   r   r   r0   i   s    "zCmfMailbox2.saveT)	recursivec                   s>   t jjdd| jgdD ]}|j|| qt j|d|i|S )Nmailboxr*   r+   r3   )r.   ZCmfMailHandlerlistr   deleter&   )r   r3   r1   r2   Zmail_handlerr(   r   r   r6   t   s    zCmfMailbox2.deletec                 C   s   | j d | j d| j d S )Nconfigsr   .offlineimaprc)r   r   r   r   r   r   r   _config_pathy   s    zCmfMailbox2._config_pathc                 C   s   t t| j}|jddd dd tjj| ddgdD }tt d }|j	| |d}| j
d	 | j d
| j d }|jjddd || d S )NT)parentsexist_okc                 S   s   g | ]}|j jqS r   )name_rawr!   ).0fr   r   r   
<listcomp>   s    z-CmfMailbox2._write_config.<locals>.<listcomp>r<   )r%   Zdisabledfieldsz9/opt/eva-app/modules/mail2/templates/offlineimaprc.jinja2)r4   disabled_folder_namesr7   r   r8   )r   r   r   mkdirr.   CmfMailboxFolderr5   r
   Z	read_textZrenderr   r   r   r%   Z
write_text)r   r   rA   templatedataconfig_pathr   r   r   r   |   s    zCmfMailbox2._write_configc                 O   sh  t jd|  dddF tjj| ddddd	d
ddgd}td|j  |jsjtd W 5 Q R  d S td |	  g }g }td t
|jjD ]T}|dkrq|dkrd}t
j|jj d| dsqtjj||dgd}|s2t| }|sd}td|  tj||||d}|  |jj}	|j  || dD ]}
t
j|jj d| d|
 s|qRt|jj d| d|
  D ]P}|	rtjt
j|tjd|	k rȐq|jdrڐq|||d qqRqt|d d!d" d#}|D ]}z|d$ }|d% }td&|  t |}|j!sTtd' W q
tj"j||j!d(gd)}d }|sd*}tj"||j!||j#$ |jdd|j%|j&|j'|j&|j(d|j)|j*d+}|j+|krd*}td,|j+ d-|  ||_+t,|j-|j.D ]}tj/j||d. d/d0gd1}|r@|j0|d2 kr@|d2 d3 |d.  |d.< tj/j||d2 d/gd4}|stj/||d. |d2 d5}|1|d6  |  |j2j3d7|j0 |j4j|_2q|r|  t5  W nb t6k
r& } zBtjd8| d9| d*d: tjt78 d*d: t 9d;|t:| W 5 d }~X Y nX q
|D ]}|jd*d< q0|j  |jd*d< W 5 Q R X d S )=NzCmfMailbox2.process_mailbox:i  <   )timeoutZblocking_timeoutr   r   r   r   r   r   r   r   )r   r@   u7   START Обработка почтового ящика z$DEV: ERROR. not mailbox.maildir_pathu   Синхронизация imapu@   Синхронизация структуры каталогов)newZtmpcur /z/cur	last_sync)r%   r<   r@   u   Входящиеu   Создаем каталог )r%   r<   nameZtree_parent)rJ   rI   )Ztz.)folder	mail_fileFc                 S   s
   | d j S )NrQ   )rN   )xr   r   r   <lambda>       z-CmfMailbox2.process_mailbox.<locals>.<lambda>)reversekeyrP   rQ   u-   Обработка нового пиьсма z!DEV: FATAL: No message id, error!mailbox_folder)r%   
message_idr@   T)r%   rX   rW   Z	mail_fromZmail_from_nameZmail_toZmail_to_jsonrN   text	text_htmlZtext_searchZimap_uidZmail_headersZreferences_rawZin_reply_to_rawu2   Перемещаем письмо из папки u    в папку filenamerN   ext_id)r%   rN   r@   
content_idr   )r%   r\   r@   )r%   rN   r\   payloadzcid:u-   Ошибка обработки письма : )forceu;   Ошибка обработки входящих писемZ	only_data);cmfutilZCmfLockr.   r   r/   gdebugrN   r   run_offlineimaposlistdirr!   pathexistsrC   r   decodeencoder0   rM   set_nowappendr   Ziterdirr   Zfromtimestampgetmtimer   Zutc
startswithsortedMessagerX   ZCmfMailr   lowersubject	text_body	html_bodyr   
referencesin_reply_torW   r	   image_attachmentsattachmentsZCmfAttachmentr\   Zupload_filerZ   replaceZurlcommit_with_event	Exception	traceback
format_excZadmin_alertr   )Z
mailbox_id_args_kwargsr4   Zfolders_to_saveZnew_mail_filesZfolder_name_rawrP   Zfolder_namerM   suffixr>   Z_new_mail_fileZnew_mail_fileZnew_mailZmailZ	need_save
attachmentZexistent_attachmentZnew_attachmenter   r   r   process_mailbox   s         


	

"$$

"
 
zCmfMailbox2.process_mailboxc              
   C   s  |   }tt| j r"| sDtd| j d| j  | 	  dddt|g}z&td|  t
j|dddd}W n` t
jt
jfk
r } z:td	|j|j|j td
|j d|j d|j W 5 d }~X Y nX |j }|j }t| t| td d S )Nz?CmfMailbox2.run_offlineimap(): WARNING init config and mailbox z, Zofflineimapz-1z-cu   Запускаем T)Zcapture_outputcheckrY   z$FATAL. offlineimap: %s error: %s, %su;   CmfMailbox2.run_offlineimap(): Ошибка запуска r_    u5   Запуск offlineimap прошел успешно.)r9   r   r   r   ri   rc   rd   r   r   r   
subprocessrunZTimeoutExpiredZCalledProcessErrorcmdstdoutstderrZCmfErrorr"   )r   rF   r1   procr   outputerrr   r   r   re   )  s     2



zCmfMailbox2.run_offlineimapz	@minutely   )Z	only_onceZ
system_jobZschedulepriorityFc                 C   s*  t d tjrt d d S tjjdddgdD ]}| sv|jrv|jjt	|j
jd |j krvt d|j d	 q2t d
|j d|j  d|_ztj|jj W n@ tk
r } z"d| |_td|j  W 5 d }~X Y nX |j  |jdd t  t d|j  q2t d d S )Nu9   START Обработка почтовых ящиков...uY   process_mailboxes: Обработка почтовых ящиков отключена...rM   r   sync_interval)r@   )Zminutesu&   Обработка пропущена z (sync_interval)u$   Обработка запущена r   rK   uH   Ошибка обработки входящих писем в Mailbox: uS   DEV: FATAL: Ошибка обработки входящих писем в Mailbox Tra   u&   Обработка закончена u7   FINISH Обработка почтовых ящиков)rc   rd   ZconfigZDISABLE_INTEGRATIONr.   r   r5   rM   r!   r   r   ZnowrN   r   Zsync_error_logr   r   r|   loggingZ	exceptionrl   r0   r{   )r`   r4   r   r   r   r   process_mailboxesB  s,    


$
zCmfMailbox2.process_mailboxes)F)__name__
__module____qualname__r   r   r   r    r$   r'   r0   r6   r9   r   staticmethodr   re   Zcmf_deferred_jobr   __classcell__r   r   r(   r   r      s    (
 r   c                   @   sT   e Zd Zdd Zdd Zdd Zedd Zd	d
 Zdd Z	edd Z
dd ZdS )rq   c              
   C   s  ddl m}m}m} z| t| W d S  |||fk
rL   td Y nX || _t	
| | _|  \| _	| _d | _td}|t|}|rt|d| _| jd| _| jd| _|  | _d | _d | _g | _g | _d | _g | _|    | !  d S )Nr   )UnrecognizedMSGTypeErrorUnsupportedMSGTypeErrorInvalidFileFormatErroru    Это не Outlook письмо,U=(\d+)   z
Message-IDZDate)"Zextract_msg.utilsr   r   r   _parse_outlook_msgr   r   warningr[   r   Zmessage_from_bytesZ
read_bytesraw_parse_senderrN   r   recompilesearchintgroupr/   rX   date_parse_subjectrs   rt   ru   rx   ry   rw   rv   _parse_references_parse_body)r   r[   r   r   r   re_uidmatchuidmatchr   r   r   __init__a  s2    

zMessage.__init__c              	   C   s  dd l }|| _||}|  \| _| _d | _td}|	t
|}|r^t|d| _|j| _|j| _|j| _d | _d | _g | _t|jD ]F\}}|j}d| }	|jr|j}	|s|	}| j|	|j||jd qg | _|j| _g | _|jD ]}
| j|
j q|j| _|j  | _W 5 Q R X | jsTt!" }d |_#|_$|%| j& | _| jsld| j d| _t'(| j| _t)*| j| _d S )	Nr   r   r   attach)r[   r^   r]   mimetypeT<plaintext></plaintext>)+extract_msgr[   ZopenMsgr   r   rN   r   r   r   r   r   r   r   Z	messageIdrX   r   rs   rt   ru   ry   	enumerateZ	contendIdrm   rE   r   rx   Z	inReplyTorw   rv   Z
recipientsZbodyZhtmlBodyrj   	html2text	HTML2Textignore_imagesignore_linkshandler"   rq   prepare_wiki_syntaxrb   
html_strip)r   r[   r   msgr   r   ir   r]   Zattach_namerefhr   r   r   r     sV    



zMessage._parse_outlook_msgc                 C   s  | j ds| j dsd S d }| j drj| j d ddd }|d dkrf|d dkrf|dd }|}|r~|| j d krtj| j d }t|dkr|d d }t|ddd	kr|dd\}}n| }}| dd}| dd}nt|d	kr|\}}|d 	|d p,d
}|d 	|d pDd
}|rx| dd| ddkrt
d t
d|d| | dd}||fS )NzReturn-PathZFromr   r   r   <>r   utf-8u   WARNING: подозрительное письмо, разные значения отправителя в Return-Path и FromzWARNING: Return-PathzFrom:)r   r/   splitr   headerr   lenrsplitr"   rj   print)r   ZsenderZsender_nameZ_fromZname_with_emailZraw_nameZ	raw_emailZ
email_addrr   r   r   r     s4    0zMessage._parse_senderc                 C   s4   |r|  |pd S t| tr(|  S |    S )Nr   )rj   r"   
isinstancer   )rs   encodingr   r   r   _decode_subject_part  s
    
zMessage._decode_subject_partc                 C   sj   | j dstd| j d S tj| j d }g }|D ]&\}}|dkrLd}|t	
|| q8d|S )NZSubjectu7   В письме %s нет поля subject вообщеzunknown-8bitr   r   )r   r/   r   r   r[   r   r   r   rm   rq   r   join)r   r   Zdecodedrs   r   r   r   r   r     s    zMessage._parse_subjectc                 C   sX   d | _ g | _| jd}|r&| | _ | jd}|rT| D ]}| j|  q>d S )NzIn-Reply-ToZ
References)rw   rv   r   r/   r"   r   rm   )r   rw   rv   rr   r   r   r     s    
zMessage._parse_referencesc                 C   s0   |  dd dd} tj| ddddd	gd
gdS )Nz<div>z<p>z</div>z</p>tablethZtdtrZdivZcid)Ztags_extendZprotocols_extend)rz   rb   r   )rY   r   r   r   r     s    zMessage.prepare_wiki_syntaxc              	   C   s  g }| j  D ]B}| rq| dkrr|drD|ddsr|jdd|d	 }|
d|d q| d	kr|dr|dds|jdd|d}|
d
|d q| dkr| }|rt|d d d k	rt|d d t|d d }|s4ddtjddd }tdd|}|d}|sX|}n|	 	d	d}| j
||jdd| |d q| r.| }t|d d d k	rt|d d t|d d }|d}|s|}n|	 	d	d}| j
||jdd| | |d q| dkr@qqtd|   qddd |D | _ddd |D | _| jst }d |_|_|| j	 | _| jsd | j d!| _t | j| _t!"| j| _| js| jstd" d S )#Nz
text/plainzContent-Dispositionr   T)rj   r   rY   )typecontentz	text/htmlhtmlZimager   r   Zinline_attachmentrK   Z0123456789abcdef   )ku   [^-a-zA-Zа-яА-Я0-9._ ]r   z
Content-IDr   r   )r[   r^   subtyper]   )r[   r^   Zmaintyper   r]   zapplication/pgp-signaturez!!! UNKNOWN TYPE z

c                 S   s    g | ]}|d  dkr|d qS )r   rY   r   r   r=   cr   r   r   r?   E  s      z'Message._parse_body.<locals>.<listcomp>c                 S   s    g | ]}|d  dkr|d qS )r   r   r   r   r   r   r   r   r?   F  s      r   r   z????)#r   walkZis_multipartZget_content_typer/   ro   Zget_payloadrj   Zget_content_charsetr"   rm   Zget_content_maintypeget_filenamer   r   randomchoicesr   subrx   Zget_content_subtypeZget_content_dispositionry   r   rt   ru   r   r   r   r   r   rq   r   rb   r   )r   Ztext_parts_listpartZ_parsed_contentZ	_filenamer]   r   r   r   r   r     s    "



"


zMessage._parse_bodyN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rq   `  s   2#

rq   )Zcmf.includer   r   r   r   pathlibr   Z
imapclientr   r   Zemail.headerr   	itertoolsr	   r   r   r}   r   Zjinja2r
   Zmodules.mail2.fieldsr   r   rq   r   r   r   r   <module>   s"     N