U
    Ph2                     @   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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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)md5)
log_config)Template)cmf_mailbox2c                       s   e Zd ZedZdZejjddg 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dd ZeejdddZdd Zedd Zed d!d"d#Zd$d% Zeeddd&d'd(d,d*d+Z  ZS )-CmfMailbox2z/opt/eva-app/mailNprocess_mailboxesget_log_urlc                 C   s<   | j jsd S | j r2t| j| j  d| j  | _nd | _d S )N_)email
is_changedstr_MAILDIR_BASE_PATHidmaildir_pathself r   &./modules/mail2/models/cmf_mailbox2.py_calc_maildir_pathE   s
     zCmfMailbox2._calc_maildir_pathc              	   C   sh   | 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 | 	dddddddg | 
  d S )Nr   r   imap_server	imap_port
imap_cryptloginpassword)r   r   r   r   r   r   r    r!   load_from_dateZload_fields_write_configr   r   r   r   _calc_offlineimap_configQ   s&    
z$CmfMailbox2._calc_offlineimap_configc                 C   s:   ddddddg}|D ] }| | }|j r|r|j }qd S )Nr   r    r   r   Zsmtp_serverZ	smtp_port)r   valuestrip)r   paramsZparamZfieldr   r   r   _strip_paramsa   s
    
zCmfMailbox2._strip_paramsc                    s   t   ddg S )Nparentr"   )supersave_preload_fieldsr   	__class__r   r   r+   h   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   r4   k   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/   r7   )r2   ZCmfMailHandlerlistr   deleter*   )r   r7   r5   r6   Zmail_handlerr,   r   r   r:   v   s    zCmfMailbox2.deletec                 C   s   | j d | j d| j d S )NZconfigsr   z.offlineimaprc)r   r   r   r   r   r   r   _config_path{   s    zCmfMailbox2._config_pathc                 C   s   t t| j}|jddd |  }| jr| jr| jr| jr| jrdd t	j
j| ddgdD }tt d }|j| |d}|jjddd || dS |j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)r8   disabled_folder_names)
missing_ok)r   r   r   mkdirr;   r   r   r    r!   r2   CmfMailboxFolderr9   r   	read_textZrenderr)   
write_textunlink)r   r   config_pathrC   templatedatar   r   r   r#   ~   s    
zCmfMailbox2._write_configc                 O   s,   t jj| tjdgd}|r$t|dS d S d S )Nurlr)   namerB   )r2   CmfAttachmentr3   r   LOG_NAMEgetattr)r   r5   r6   
attachmentr   r   r   r      s    
zCmfMailbox2.get_log_url)returnc                 C   s   | j r| j S tjj| tjd}|sd}tj| tjd}|  |jsT|jdddd ddl	m
}m}m} |tj || td| _ tj| j |jtj|d	 nt|  | _ | j S )
u{    Журнал логирования детектирования петель и срабатывания w/b lists email )r)   rO   zS[%(levelname)s] - %(asctime)s - %(module)s.%(funcName)s(%(lineno)d) - %(message)s 
    FZbackupZmake_previewr   ) set_library_log_activation_levelset_library_log_detail_levelEXTENDEDZloop_detector)level	formatter)_CmfMailbox2__loggerr2   rP   r3   r   rQ   r4   Zfile_existsupload_fileZldap3.utils.logrW   rX   rY   loggingZERRORZ	getLoggerZinit_loggerZfull_path_fileINFOZ
get_loggerZget_files_dir)r   rS   r[   rW   rX   rY   r   r   r   logger   s     
zCmfMailbox2.loggerc                 C   sZ   t jj}|sd S d}tj}d| }||rF|| ||| n|j|d|d d S )N  Zloop_detector_   )ex)	gZglobal_settingsZemail_loop_detector_thresholdZAPPZREDIS_DBexistsZincrZexpireset)r   addressZ	thresholdZttlZredis_dbZloop_keyr   r   r   detect_mail_loops   s    


zCmfMailbox2.detect_mail_loopsc                 O   s  t jd| ddd 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}z|d$ }|d% }td&|  t |}|j!}|j!srd"|j#$d'}d(t%|d)&  }tj'j||d*gd+}d }|sd,}| (| tj'||||j)* |j|j)|j+|j,|j-|j.|j/|j.|j0d|j1|j2d-}|3|j4j |j5|kr d,}td.|j5 d/|  ||_5t6|j7|j8D ]}|d0 }tj9j||d1d2gd3}|rz|j:|d4 krz|d4 d5 |d0  }tj9j||d4 d1gd6}|s.tj9|||d4 d7}|j;|d8 d d d9 |  |j<j=d:|j: |j>j|_<q.|r|  t?  W nb t@k
rb } zBtjd;| d<| d,d= tjtAB d,d= t Cd>|tD| W 5 d }~X Y nX q
|D ]}|jd,d? ql|j  |jd,d? W 5 Q R X d S )@NzCmfMailbox2.process_mailbox:ra   <   )timeoutZblocking_timeoutr   r   r"   r   r   r   r    r!   )r   rB   u7   START Обработка почтового ящика z$DEV: ERROR. not mailbox.maildir_pathu   Синхронизация imapu@   Синхронизация структуры каталогов)newZtmpcur /z/cur	last_sync)r)   r>   rB   u   Входящиеu   Создаем каталог )r)   r>   rO   Ztree_parent)rl   rk   )Ztz.)folder	mail_fileFc                 S   s
   | d j S )Nrr   )rO   )xr   r   r   <lambda>  rU   z-CmfMailbox2.process_mailbox.<locals>.<lambda>)reversekeyrq   rr   u-   Обработка нового пиьсма ZReceivedzNO_ID:utf-8mailbox_folder)r)   
message_idrB   T)r)   ry   rx   	mail_fromZmail_from_nameZmail_tomail_to_jsoncc_jsonrO   text	text_htmlZtext_searchZimap_uidZmail_headersZreferences_rawZin_reply_to_rawu2   Перемещаем письмо из папки u    в папку filenamerO   ext_idrN   
content_idr   )r)   r   rB   )r)   rO   r   payloadrV   zcid:u-   Ошибка обработки письма : )forceu;   Ошибка обработки входящих писемZ	only_data)EcmfutilZCmfLockr2   r   r3   rd   debugrO   r   run_offlineimaposlistdirr%   pathre   rF   r   decodeencoder4   ro   set_nowappendr   iterdirr   Zfromtimestampgetmtimer   Zutc
startswithsortedMessagery   joinrawZget_allr
   Z	hexdigestZCmfMailnormalize_subjectr   lowerr{   r|   subject	text_body	html_bodyr   
referencesin_reply_torh   rz   rx   r	   image_attachmentsattachmentsrP   r   r]   r~   replacerM   commit_with_event	Exception	traceback
format_excZadmin_alertr   )clsZ
mailbox_id_args_kwargsr8   Zfolders_to_saveZnew_mail_filesZfolder_name_rawrq   Zfolder_namero   suffixr@   Z_new_mail_fileZnew_mail_filenew_mailry   Zmail_recievedZmailZ	need_saverS   Zattach_filenameZexistent_attachmentZnew_attachmenter   r   r   process_mailbox   s         


	

"$$

"
 
zCmfMailbox2.process_mailboxr   r   c                 C   sN   t | jdkrJ| j d| j | _| j d| j | _| jd d d | _d S )N   

z<br><br>   z...)lenr   r   r   r   r   r   r   r   k  s    zCmfMailbox2.normalize_subjectc              
   C   s"  |   }tt| j r"| sRtd| j d| j  | 	 sRt
d d S dddt|g}z(td|  tj|d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, zBCmfMailbox2.run_offlineimap(): mailbox is not configured, skip runZofflineimapz-1z-cu   Запускаем Ti  )Zcapture_outputcheckr}   rj   z$FATAL. offlineimap: %s error: %s, %su;   CmfMailbox2.run_offlineimap(): Ошибка запуска r    u5   Запуск offlineimap прошел успешно.)r;   r   r   r   re   rd   r   r   r   r#   r^   warning
subprocessrunZTimeoutExpiredZCalledProcessErrorcmdstdoutstderrZCmfErrorr&   )r   rJ   r5   procr   outputerrr   r   r   r   r  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: Обработка почтовых ящиков отключена...ro   r   sync_interval)rB   )Zminutesu&   Обработка пропущена z (sync_interval)u$   Обработка запущена r   rm   uH   Ошибка обработки входящих писем в Mailbox: uS   DEV: FATAL: Ошибка обработки входящих писем в Mailbox Tr   u&   Обработка закончена u7   FINISH Обработка почтовых ящиков)rd   r   ZconfigZDISABLE_INTEGRATIONr2   r   r9   ro   r%   r   r   ZnowrO   r   Zsync_error_logr   r   r   r^   	exceptionr   r4   r   )r   r8   r   r   r   r   r     s,    


$
zCmfMailbox2.process_mailboxes)F)__name__
__module____qualname__r   r   r\   r   r   Zapi_methodsr   r$   r(   r+   r4   r:   r;   r#   r   propertyr^   ZLoggerr`   rh   classmethodr   staticmethodr   r   Zcmf_deferred_jobr   __classcell__r   r   r,   r   r      s6   +	
 +r   c                   @   s|   e Zd Zd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d Zdd Zdd Zdd ZdS )r   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 | _g | _ g | _!| "  | #  | $  d S )Nr   )UnrecognizedMSGTypeErrorUnsupportedMSGTypeErrorInvalidFileFormatErroru    Это не Outlook письмо,U=(\d+)rb   z
Message-IDZDate)%Zextract_msg.utilsr   r   r   _parse_outlook_msgr   r^   r   r   r   Zmessage_from_bytes
read_bytesr   _parse_senderrO   r   recompilesearchintgroupr3   ry   date_parse_subjectr   r   r   r   r   r   r   r|   r{   _parse_references_parse_body_parse_recipients)r   r   r   r   r   re_uidmatchuidmatchr   r   r   __init__  s8    

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   rb   attach)r   r   r   mimetypeT<plaintext></plaintext>)+extract_msgr   ZopenMsgr   r   rO   r   r   r   r   r   r   r   Z	messageIdry   r   r   r   r   r   	enumerateZ	contendIdr   rL   r   r   Z	inReplyTor   r   
recipientsZbodyZhtmlBodyr   	html2text	HTML2Textignore_imagesignore_linkshandler&   r   prepare_wiki_syntaxr   
html_clean)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 d	d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 pTd}|r|	 	d	d|	 	d	dkrtd td|d| |	 	d	d}||fS )NzReturn-PathZFromr   rb   r   <>
	r   rw   u   WARNING: подозрительное письмо, разные значения отправителя в Return-Path и FromzWARNING: Return-PathzFrom:)r   r3   splitr   headerr   r   r   rsplitr&   r   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                    s<    fdd} j dr"|d _ j dr8|d _d S )Nc                    s|   g }t j j|  g}|D ]Z}|\}}|rZ||krZt j|d \}}|d k	rZ||}||krfd}|||d q|S )Nr   rm   )r   rO   )r   ZutilsZgetaddressesr   r   r   r   r   )r   Zto_jsonr   Z	recipientZrecipient_nameZrecipient_emailencodingr   r   r   header_to_json$  s    
z1Message._parse_recipients.<locals>.header_to_jsonZCcZTo)r   r3   r|   r{   )r   r   r   r   r   r   #  s
    
zMessage._parse_recipientsc                 C   s4   |r|  |pd S t| tr(|  S |    S )Nrw   )r   r&   
isinstancer   )r   r   r   r   r   _decode_subject_part9  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-8bitrw   r   )r   r3   r^   r   r   r   r   r   r   r   r   r   )r   r   Zdecodedr   r   r   r   r   r   A  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)r   r   r   r3   r&   r   r   )r   r   r   rr   r   r   r   M  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)r   r   r   )r}   r   r   r   r   _  s    zMessage.prepare_wiki_syntaxc                 C   s  g }| j  D ]}| rq| }|d}| |rD| | q|dkr|rZ|ds|jdd	|
d }|d|d q|d	kr|r|ds|jdd	|
d}|d
|d q| dkr| | q|r| | q|dkrqqtd|  qddd |D | _ddd |D | _| jsft }d |_|_|| j | _| js~d| j d| _t| j| _t| j| _| js| jstd d S )NzContent-Dispositionz
text/plainrS   Tr   rw   r}   )typecontentz	text/htmlhtmlZimagezapplication/pgp-signaturez!!! UNKNOWN TYPE r   c                 S   s    g | ]}|d  dkr|d qS )r   r}   r   r   r?   cr   r   r   rA     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   rA     s      r   r   z????)r   walkZis_multipartget_content_typer3   _is_embedded_message_handle_embedded_messager   get_payloadr   Zget_content_charsetr&   r   get_content_maintype_handle_image_attachment_handle_regular_attachmentr   r   r   r   r   r   r   r   r   r   r   r   r   )r   Ztext_parts_listpartcontent_typeZcontent_dispositionZ_parsed_contentr   r   r   r   r   k  sV    


zMessage._parse_bodyc                 C   sB   |  }| }ddddg}||kr(dS |r>| dr>dS dS )uV   Проверяет, является ли часть вложенным письмомmessage/rfc822zapplication/ms-tnefzapplication/vnd.ms-outlookzapplication/octet-streamT).msg.emlF)r  get_filenamer   endswith)r   r  r  r   Zembedded_message_typesr   r   r   r    s    zMessage._is_embedded_messagec              	   C   s   |  }|rBt|d d dk	rBt|d d t|d d }|s| dkrjdtjddd d	}ndtjddd d
}tdd|}|d}|s|}n|	 	d	d}| j
||jdd| | |dd dS )uP   Обрабатывает вложенные письма как вложенияr   rb   Nr  Zembedded_message_0123456789abcdef   kr  r     [^-a-zA-Zа-яА-Я0-9._ ]r   
Content-IDr   r   Tr   )r   r   maintypesubtyper   Zis_embedded_message)r  r   r   r  randomchoicesr   subr3   r&   r   r   r  r	  get_content_subtyper   r  Z	_filenamer   r   r   r   r    s(    "

z Message._handle_embedded_messagec                 C   s   |  }|rBt|d d dk	rBt|d d t|d d }|s^ddtjddd }td	d
|}|d}|s|}n|	 	d	d}| j
||jdd| |d dS )u/   Обрабатывает изображенияr   rb   NZinline_attachmentrm   r  r  r  r  r   r  r   r   Tr   )r   r   r  r   )r  r   r   r   r  r  r   r  r3   r&   r   r   r  r  r  r   r   r   r
    s"    "

z Message._handle_image_attachmentc                 C   s   |  }|rBt|d d dk	rBt|d d t|d d }|d}|sV|}n| dd}| j||jdd| |	 |d	 dS )
u8   Обрабатывает обычные вложенияr   rb   Nr  r   r   Tr   )r   r   r  r  r   )
r  r   r   r3   r&   r   r   r  r	  r  r  r   r   r   r    s    "

z"Message._handle_regular_attachmentN)r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r   r   r   r   r     s   "2#

7 r   )Zcmf.includer   r   r   r   pathlibr   Z
imapclientr   r   Zemail.headerr   	itertoolsr	   Zhashlibr
   r  r   r   r^   Zcmf.modules.logsr   r   Zjinja2r   Zmodules.mail2.fieldsr   r   r   r   r   r   r   <module>   s*      