B
    f_z                 @   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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)Template)cmf_mailbox2c                   s   e Zd ZedZejj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edd Zdd ZeeddddddddZ  ZS ) CmfMailbox2z/opt/eva-app/mailprocess_mailboxesc             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_pathA   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_config)r   r   r   r   _calc_offlineimap_configN   s     z$CmfMailbox2._calc_offlineimap_configc             C   s<   ddddddg}x&|D ]}| | r| | j  | |< qW d S )Nr   r   r   r   Zsmtp_serverZ	smtp_port)valuestrip)r   paramsZparamr   r   r   _strip_paramsd   s    
zCmfMailbox2._strip_paramsc                s   t   ddg S )Nparentz	parent.id)supersave_preload_fields)r   )	__class__r   r   r(   j   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kwargs)r)   r   r   r/   m   s    "zCmfMailbox2.saveT)	recursivec               sB   x*t jjdd| jgdD ]}|j|| qW t j|d|i|S )Nmailboxr*   )r+   r2   )r-   ZCmfMailHandlerlistr   deleter'   )r   r2   r0   r1   Zmail_handler)r)   r   r   r5   x   s    zCmfMailbox2.deletec             C   s   | j d | j d| j d S )N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 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)r3   disabled_folder_namesr6   r   z.offlineimaprc)r   r   r   mkdirr-   CmfMailboxFolderr4   r   Z	read_textZrenderr   r   r   r&   Z
write_text)r   r   r?   templatedataconfig_pathr   r   r   r       s    zCmfMailbox2._write_configc             O   s  t jd|  dddr tjj| ddddd	d
ddgd}td|j  |js`td d S td |	  g }g }td xpt
|jjD ]\}|dkrq|dkrd}t
j|jj d| dsqtjj||dgd}|s,t| }|sd}td|  tj||||d}|  |jj}	|j  || xdD ]}
t
j|jj d| d|
 sxqNxtt|jj d| d|
  D ]P}|	rtjt
j|tjd|	k rƐq|jdrؐq|||d qW qNW qW t|d d!d" d#}xF|D ]<}y|d$ }|d% }td&|  t |}|j!}|j!szd"|j#$d'}d(t%|d)&  }tj'j||d*gd+}d }|sd,}tj'||||j() |jdd|j*|j+|j,|j+|j-d|j.|j/d-}|j0|krd,}td.|j0 d/|  ||_0xt1|j2|j3D ]}tj4j||d0 d1d2gd3}|rd|j5|d4 krd|d4 d5 |d0  |d0< tj4j||d4 d1gd6}|stj4||d0 |d4 d7}|6|d8  |  |j7j8d9|j5 |j9j|_7qW |r|  t:  W nb t;k
rL } zBtjd:| d;| d,d< tjt<= d,d< t >d=|t?| W d d }~X Y nX qW x|D ]}|jd,d> qZW |j  |jd,d> W d Q R X d S )?NzCmfMailbox2.process_mailbox:i  <   )Z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)rG   rF   )Ztz.)folder	mail_fileFc             S   s
   | d j S )NrN   )rK   )xr   r   r   <lambda>       z-CmfMailbox2.process_mailbox.<locals>.<lambda>)reversekeyrM   rN   u-   Обработка нового пиьсма ZReceivedzNO_ID:zutf-8mailbox_folder)r&   
message_idr>   T)r&   rU   rT   Z	mail_fromZmail_from_nameZmail_toZmail_to_jsonrK   text	text_htmlZtext_searchZimap_uidZmail_headersZreferences_rawZin_reply_to_rawu2   Перемещаем письмо из папки u    в папку filenamerK   ext_id)r&   rK   r>   
content_idr   )r&   rY   r>   )r&   rK   rY   payloadzcid:u-   Ошибка обработки письма z: )forceu;   Ошибка обработки входящих писем)	only_data)@cmfutilZCmfLockr-   r   r.   gdebugrK   r   run_offlineimaposlistdirr"   pathexistsrA   r   decodeencoder/   rJ   set_nowappendr   Ziterdirr   Zfromtimestampgetmtimer   Zutc
startswithsortedMessagerU   joinrawZget_allr
   Z	hexdigestZCmfMailr   lowersubject	text_body	html_bodyr   
referencesin_reply_torT   r	   image_attachmentsattachmentsZCmfAttachmentrY   Zupload_filerW   replaceZurlcommit_with_event	Exception	traceback
format_excZadmin_alertr   )Z
mailbox_idZ_argsZ_kwargsr3   Zfolders_to_saveZnew_mail_filesZfolder_name_rawrM   Zfolder_namerJ   suffixr<   Z_new_mail_fileZnew_mail_fileZnew_mailrU   Zmail_recievedZ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}y&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 d 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_outputZcheckrV   z$FATAL. offlineimap: %s error: %s, %su;   CmfMailbox2.run_offlineimap(): Ошибка запуска z:  u5   Запуск offlineimap прошел успешно.)r7   r   r   r   re   r_   r`   r   r   r    
subprocessrunZTimeoutExpiredZCalledProcessErrorcmdstdoutstderrZCmfErrorr#   )r   rD   r0   procr   outputerrr   r   r   ra   0  s     2



zCmfMailbox2.run_offlineimapz	@minutely   )Z	only_onceZ
system_jobZschedulepriorityFc             C   s0  t d tjrt d d S x tjjdddgdD ]}| sz|jrz|jjt	|j
jd |j krzt d|j d	 q6t d
|j d|j  d|_ytj|jj W n@ tk
r } z"d| |_td|j  W d d }~X Y nX |j  |jdd t  t d|j  q6W t d d S )Nu9   START Обработка почтовых ящиков...uY   process_mailboxes: Обработка почтовых ящиков отключена...rJ   r   sync_interval)r>   )Zminutesu&   Обработка пропущена z (sync_interval)u$   Обработка запущена r   rH   uH   Ошибка обработки входящих писем в Mailbox: uS   DEV: FATAL: Ошибка обработки входящих писем в Mailbox T)r]   u&   Обработка закончена u7   FINISH Обработка почтовых ящиков)r_   r`   ZconfigZDISABLE_INTEGRATIONr-   r   r4   rJ   r"   r   r   ZnowrK   r   Zsync_error_logr   r   rz   loggingZ	exceptionrh   r/   ry   )r\   r3   r   r   r   r   r   I  s*    


 $
zCmfMailbox2.process_mailboxes)F)__name__
__module____qualname__r   r   r   r   Zapi_methodsr   r!   r%   r(   r/   r5   r7   r    staticmethodr   ra   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 )rm   c          
   C   s  ddl m}m}m} y| t| d S  |||fk
rJ   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 письмоz,U=(\d+)   z
Message-IDZDate)"Zextract_msg.utilsr   r   r   _parse_outlook_msgr   r   warningrX   r   Zmessage_from_bytesZ
read_bytesro   _parse_senderrK   r   recompilesearchintgroupr.   rU   date_parse_subjectrq   rr   rs   rv   rw   ru   rt   _parse_references_parse_body)r   rX   r   r   r   re_uidmatchuidmatchr   r   r   __init__h  s2    

zMessage.__init__c          	   C   s  dd l }|| _||}|  \| _| _d | _td}|	t
|}|r^t|d| _|j| _|j| _|j| _d | _d | _g | _xTt|jD ]F\}}|j}d| }	|jr|j}	|s|	}| j|	|j||jd qW g | _|j| _g | _x|jD ]}
| j|
j qW |j| _|j  | _W d Q R X | js\t!" }d |_#|_$|%| j& | _| jstd| j d| _t'(| j| _t)*| j| _d S )	Nr   z,U=(\d+)r   attach)rX   r[   rZ   mimetypeTz<plaintext>z</plaintext>)+extract_msgrX   ZopenMsgr   r   rK   r   r   r   r   r   r   r   Z	messageIdrU   r   rq   rr   rs   rw   	enumerateZ	contendIdri   rC   r   rv   Z	inReplyToru   rt   Z
recipientsZbodyZhtmlBodyrf   	html2text	HTML2Textignore_imagesignore_linkshandler#   rm   prepare_wiki_syntaxr^   
html_clean)r   rX   r   msgr   r   ir   rZ   Zattach_namerefhr   r   r   r     sT    

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   zutf-8u   WARNING: подозрительное письмо, разные значения отправителя в Return-Path и FromzWARNING: Return-PathzFrom:)ro   r.   splitr   headerr   lenrsplitr#   rf   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 )Nzutf-8)rf   r#   
isinstancer   )rq   encodingr   r   r   _decode_subject_part  s
    
zMessage._decode_subject_partc             C   sn   | j dstd| j d S tj| j d }g }x.|D ]&\}}|dkrNd}|t	
|| q:W d|S )NZSubjectu7   В письме %s нет поля subject вообщеzunknown-8bitzutf-8r   )ro   r.   r   r   rX   r   r   r   ri   rm   r   rn   )r   r   Zdecodedrq   r   r   r   r   r     s    zMessage._parse_subjectc             C   s\   d | _ g | _| jd}|r&| | _ | jd}|rXx | D ]}| j|  q@W d S )NzIn-Reply-ToZ
References)ru   rt   ro   r.   r#   r   ri   )r   ru   rt   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)rx   r^   r   )rV   r   r   r   r     s    zMessage.prepare_wiki_syntaxc          	   C   s  g }xR| j  D ]B}| r"q| dkrv|drH|ddsv|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 }|s8ddtjddd }tdd|}|d}|s\|}n|	 	d	d}| j
||jdd| |d q| r2| }t|d d d k	rt|d d t|d d }|d}|s|}n|	 	d	d}| j
||jdd| | |d q| dkrDqqtd|   qW ddd |D | _ddd |D | _| jst }d |_|_|| j	 | _| jsd | j d!| _t | j| _t!"| j| _| js | js td" d S )#Nz
text/plainzContent-Dispositionr~   T)rf   zutf-8rV   )typecontentz	text/htmlhtmlZimager   r   Zinline_attachmentrH   Z0123456789abcdef   )ku   [^-a-zA-Zа-яА-Я0-9._ ]r   z
Content-IDr   r   )rX   r[   subtyperZ   )rX   r[   Zmaintyper   rZ   zapplication/pgp-signaturez!!! UNKNOWN TYPE z

c             S   s    g | ]}|d  dkr|d qS )r   rV   r   r   )r;   cr   r   r   r=   L  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   r=   M  s    z<plaintext>z</plaintext>z????)#ro   walkZis_multipartZget_content_typer.   rk   Zget_payloadrf   Zget_content_charsetr#   ri   Zget_content_maintypeget_filenamer   rn   randomchoicesr   subrv   Zget_content_subtypeZget_content_dispositionrw   r   rr   rs   r   r   r   r   r   rm   r   r^   r   )r   Ztext_parts_listpartZ_parsed_contentZ	_filenamerZ   r   r   r   r   r     sv    "


"

zMessage._parse_bodyN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rm   g  s   2#rm   )Zcmf.includer   r   r   r   Zpathlibr   Z
imapclientr   r   Zemail.headerr   	itertoolsr	   Zhashlibr
   r   r   r{   r   Zjinja2r   Zmodules.mail2.fieldsr   r   rm   r   r   r   r   <module>   s$     T