U
    7fe4f                     @   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ejej 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 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 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                    s   t   ddg S )Nparentz	parent.id)supersave_preload_fieldsr   	__class__r   r   r#   `   s    zCmfMailbox2.save_preload_fieldsc                    sZ   | j jr<| j r<tjjdd| j gdd| jggdr<tddd |   |   t	 j
||S )	Nr   =r   z!=filteru^   Почтовый ящик для данного email уже заведен в системе!T)abort)r   r   modelsr   getr   Z	cmf_alertr   r    r"   save)r   argskwargsr$   r   r   r,   c   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'   r/   )r*   ZCmfMailHandlerlistr   deleter"   )r   r/   r-   r.   Zmail_handlerr$   r   r   r2   l   s    zCmfMailbox2.deletec                 C   s   | j d | j d| j d S )Nconfigsr   .offlineimaprc)r   r   r   r   r   r   r   _config_pathq   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_rawvalue).0fr   r   r   
<listcomp>x   s    z-CmfMailbox2._write_config.<locals>.<listcomp>r8   )r!   Zdisabledfieldsz9/opt/eva-app/modules/mail2/templates/offlineimaprc.jinja2)r0   disabled_folder_namesr3   r   r4   )r   r   r   mkdirr*   CmfMailboxFolderr1   r
   Z	read_textZrenderr   r   r   r!   Z
write_text)r   r   r>   templatedataconfig_pathr   r   r   r   t   s    zCmfMailbox2._write_configc                 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|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'd|j(|j)d+}|j*|krd*}td,|j* d-|  ||_*t+|j,|j-D ]}tj.j||d. d/d0gd1}|r<|j/|d2 kr<|d2 d3 |d.  |d.< tj.j||d2 d/gd4}|stj.||d. |d2 d5}|0|d6  |  q|r|  t1  W nH t2k
r } z(td7| d8|  tt34  W 5 d }~X Y nX q
|D ]}|jd*d9 q|j  |jd*d9 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!   r8   r=   u   Входящиеu   Создаем каталог )r!   r8   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!DEV: FATAL: No message id, error!mailbox_folder)r!   
message_idr=   T)r!   rU   rT   Z	mail_fromZmail_from_nameZmail_toZmail_to_jsonrK   textZtext_searchZimap_uidZmail_headersZreferences_rawZin_reply_to_rawu2   Перемещаем письмо из папки u    в папку filenamerK   ext_id)r!   rK   r=   
content_idr   )r!   rX   r=   )r!   rK   rX   payloadu-   Ошибка обработки письма : Z	only_data)5cmfutilZCmfLockr*   r   r+   gdebugrK   r   run_offlineimaposlistdirr9   pathexistsr@   r   decodeencoder,   rJ   set_nowappendr   Ziterdirr   Zfromtimestampgetmtimer   Zutc
startswithsortedMessagerU   ZCmfMailr   lowersubject	text_bodyr   
referencesin_reply_torT   r	   image_attachmentsattachmentsZCmfAttachmentrX   Zupload_filecommit_with_event	Exception	traceback
format_exc)Z
mailbox_id_args_kwargsr0   Zfolders_to_saveZnew_mail_filesZfolder_name_rawrM   Zfolder_namerJ   suffixr;   Z_new_mail_fileZnew_mail_fileZnew_mailZmailZ	need_saveZ
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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-cu   Запускаем T)Zcapture_outputcheckrV   z$FATAL. offlineimap: %s error: %s, %su;   CmfMailbox2.run_offlineimap(): Ошибка запуска r[    u5   Запуск offlineimap прошел успешно.)r5   r   r   r   rd   r^   r_   r   r   r   
subprocessrunZTimeoutExpiredZCalledProcessErrorcmdstdoutstderrZCmfErrorstrip)r   rC   r-   procr{   outputerrr   r   r   r`     s     2



zCmfMailbox2.run_offlineimap)Z	only_onceZ
system_jobc                  C   s&  t d tjrt d d S tjjdddgdD ]} | jrr| jjt	| j
jd | j krrt 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: Обработка почтовых ящиков отключена...rJ   r   sync_interval)r=   )Zminutesu&   Обработка пропущена z (sync_interval)u$   Обработка запущена r~   rH   uH   Ошибка обработки входящих писем в Mailbox: uS   DEV: FATAL: Ошибка обработки входящих писем в Mailbox Tr\   u&   Обработка закончена u7   FINISH Обработка почтовых ящиков)r^   r_   ZconfigZDISABLE_INTEGRATIONr*   r   r1   rJ   r9   r   r   ZnowrK   r   Zsync_error_logr|   r   ru   loggingZ	exceptionrg   r,   rt   )r0   r{   r   r   r   process_mailboxes1  s,    

$
zCmfMailbox2.process_mailboxes)__name__
__module____qualname__r   r   r   r    r#   r,   r2   r5   r   staticmethodr|   r`   Zcmf_deferred_jobr   __classcell__r   r   r$   r   r      s   (	
 
r   c                   @   s@   e Zd Zdd Zdd Zedd Zdd Zd	d
 Zdd Z	dS )rl   c                 C   s   || _ t| | _|  \| _| _d | _t	d}|
t|}|rXt|d| _| jd| _| jd| _|  | _d | _d | _g | _g | _d | _g | _|   |   d S )Nz,U=(\d+)   z
Message-IDZDate)rW   r   Zmessage_from_bytesZ
read_bytesraw_parse_senderrK   r   recompilesearchr   intgroupr+   rU   date_parse_subjectrn   ro   	html_bodyrr   rs   rq   rp   _parse_references_parse_body)r   rW   Zre_uidmatchZuidmatchr   r   r   __init__S  s&    

zMessage.__init__c                 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   <>   utf-8u   WARNING: подозрительное письмо, разные значения отправителя в Return-Path и FromzWARNING: Return-PathzFrom:)r   r+   splitr   headerr   lenrsplitr   re   print)r   ZsenderZsender_nameZ_fromZname_with_emailZraw_nameZ	raw_emailZ
email_addrr   r   r   r   k  s4    0zMessage._parse_senderc                 C   s4   |r|  |pd S t| tr(|  S |    S )Nr   )re   r   
isinstancer   )rn   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   ZwarningrW   r   r   r   rh   rl   r   join)r   r   Zdecodedrn   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)rq   rp   r   r+   r   r   rh   )r   rq   rp   rr   r   r   r     s    
zMessage._parse_referencesc              	   C   s  g }| j  D ]}| rq| dkrX|jdd|d }|d|d q| dkr|jdd|d}|d|d q|	 d	krV|
 }|rt|d
 d d k	rt|d
 d
 t|d
 d }|sddtjddd }tdd|}|d}|s|}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stt }d |_|_|| j | _| jsd| j d| _t| j| _t| j| _| js| jstd  d S )!Nz
text/plainT)re   r   rV   )typecontentz	text/htmlhtmlZimager   r   Zinline_attachmentrH   Z0123456789abcdef   )ku   [^-a-zA-Zа-яА-Я0-9._ ]r   z
Content-IDr   r   )rW   rZ   subtyperY   )rW   rZ   Zmaintyper   rY   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<     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<     s      z<plaintext>z</plaintext>z????) r   walkZis_multipartZget_content_typeZget_payloadre   Zget_content_charsetr   rh   Zget_content_maintypeget_filenamer   r   randomchoicesr   subr+   rr   Zget_content_subtypeZget_content_dispositionrs   r   ro   r   	html2textZ	HTML2TextZignore_imagesZignore_linksZhandler]   Z
clean_text)r   Ztext_parts_listpartZ_parsed_contentZ	_filenamerY   hr   r   r   r     sv    "



"


zMessage._parse_bodyN)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   rl   R  s   #
rl   )Zcmf.includer   r   r   r   pathlibr   Z
imapclientr   r   Zemail.headerr   	itertoolsr	   r   r   rv   r   Zjinja2r
   Zmodules.mail2.fieldsr   r   ZAPPZHOOK_CRON_MINUTELYrh   r   rl   r   r   r   r   <module>   s$     =