U
    $-d1\                     @   s   d dl T d dlZd dlmZ d dlmZ d dlZd dlmZmZm	Z	 d dl
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mZ d dlmZ d dlmZ d dlZd dlmZ G dd dejZej !ej" G dd dZ#dS )    )*N)Path)rmtree)	timedeltadatetimetimezone)	imap_utf7)decode_header)OrderedDict)chain)decodebytes)Template)cmf_mailbox2c                       s   e Zd ZdZdd Zdd Z fddZ fdd	Zee	j
d
d
ddd Zdd Zee	j
d
d
ddd Zedd Z  ZS )CmfMailbox2z/opt/var/mail/c                 C   sD   | j r| jjsd S | jsd S | j d| j }| j | d| _ d S )N_/)maildir_pathemail
is_changedidMAILDIR_BASE_PATH)selffolder_name r   &./modules/mail2/models/cmf_mailbox2.py_calc_maildir_pathC   s    zCmfMailbox2._calc_maildir_pathc              	   C   s   | 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 t	d}t
| }W 5 Q R X t| j j}dd tjj| ddgdD }|j| |d}|jddd t| jd	 }|jddd || j d
| j d 	d}|| W 5 Q R X d S )Nz5/opt/crm/modules/mail2/templates/offlineimaprc.jinja2c                 S   s   g | ]}|j jqS r   )name_rawvalue).0fr   r   r   
<listcomp>g   s    z8CmfMailbox2._calc_offlineimap_config.<locals>.<listcomp>Tr   )parentZdisabledfields)mailboxdisabled_folder_names)parentsexist_okconfigsr   .offlineimaprcw)r   r   r   Zimap_serverZ	imap_portZ
imap_cryptZloginZpasswordZload_from_dateopenr   readr   r   modelsCmfMailboxFolderlistZrendermkdirr   r   write)r   Ztmplttemplater   r$   dataconfigs_pathfdr   r   r   _calc_offlineimap_configP   sP    

 z$CmfMailbox2._calc_offlineimap_configc                    s   t   ddg S )Nr!   z	parent.id)supersave_preload_fields)r   	__class__r   r   r7   q   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   r,   r   getr   Z	cmf_alertr   r5   r6   save)r   argskwargsr8   r   r   r>   t   s    "zCmfMailbox2.saveT)Z	only_onceZsystem_taskc                 O   s  t jj| ddgd}td|j  |js:td d S td |  g }g }td t	|jj
D ]J}|dkr|ql|d	krd
}tj|jj
 | dsqlt jj||dgd}|st| }|sd}td|  t j||||d}|  |jj
}	|j  || dD ]}
tj|jj
 | d|
 sDqt|jj
 | d|
  D ]P}|	rtjtj|tjd|	k rqb|jdrqb|||d qbqqlt|ddd d}|D ]}|d }|d }td|  t|}|jstd qt j j||jdgd}d}|spd }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%d&gd'}|r|j,|d( kr|d( d) |d$  |d$< t j+j||d( d%gd*}|st j+||d$ |d( d+}|-|d,  |  q|rV|  t.  q|D ]}|jd d- qd|j  |jd d- d S ).Nr   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)rB   rA   r   )Ztz.)folder	mail_fileFc                 S   s
   | d j S )NrH   )rE   )xr   r   r   <lambda>       z-CmfMailbox2.process_mailbox.<locals>.<lambda>)reversekeyrG   rH   u-   Обработка нового пиьсма z!DEV: FATAL: No message id, error!mailbox_folder)r!   
message_idr"   T)r!   rO   rN   Z	mail_fromZmail_from_nameZmail_toZmail_to_jsonrE   textZtext_searchZimap_uidZmail_headersZreferences_rawZin_reply_to_rawu2   Перемещаем письмо из папки u    в папку filenamerE   ext_id)r!   rE   r"   
content_idr   )r!   rR   r"   )r!   rE   rR   payloadZ	only_data)/r,   r   r=   gdebugrE   r   run_offlineimaposlistdirr   pathexistsr-   r   decodeencoder>   rD   set_nowappendr   Ziterdirr   Zfromtimestampgetmtimer   Zutc
startswithsortedMessagerO   ZCmfMailr   subject	text_bodyr   
referencesin_reply_torN   r   image_attachmentsattachmentsZCmfAttachmentrR   Zupload_fileZcommit_with_event)Z
mailbox_id_args_kwargsr#   Zfolders_to_saveZnew_mail_filesZfolder_name_rawrG   r   rD   suffixr   Z_new_mail_fileZnew_mail_fileZnew_mailZmailZ	need_saveZ
attachmentZexistent_attachmentZnew_attachmentr   r   r   process_mailbox}   s    


	

 "$



zCmfMailbox2.process_mailboxc              
   C   s  t | jd }|| j d| j d }| sDtd| d d S dd|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 )Nr'   r   r(   u   ERROR. Конфиг u    не создан!Zofflineimapz-cu   Запускаем T)Zcapture_outputcheckrP   z$FATAL. offlineimap: %s error: %s, %su   Ошибка запуска z:  u5   Запуск offlineimap прошел успешно.)r   r   r   r   r\   rV   rW   
subprocessrunZTimeoutExpiredZCalledProcessErrorcmdstdoutstderr	Exceptionstrip)r   r3   Zconfigr?   proceoutputerrr   r   r   rX     s"    
2



zCmfMailbox2.run_offlineimapc                  O   s  t d tjjdddgdD ]}|jr^|jjt|jjd |j	 kr^t d|j
 d qt 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 d|j
  qt d d S )Nu9   START Обработка почтовых ящиков...rD   r   sync_interval)r"   )Zminutesu&   Обработка пропущена z (sync_interval)u$   Обработка запущена rp   rC   uH   Ошибка обработки входящих писем в Mailbox: uS   DEV: FATAL: Ошибка обработки входящих писем в Mailbox TrU   u&   Обработка закончена u7   FINISH Обработка почтовых ящиков)rV   rW   r,   r   r.   rD   r   r   r|   ZnowrE   r   Zsync_error_logrn   r   rv   loggingZ	exceptionr_   r>   )rk   rl   r#   ry   r   r   r   process_mailboxes  s$    
$
zCmfMailbox2.process_mailboxesc                 C   s   t | j d S )N)Zcmf_deferred_taskr~   )clsr   r   r   minutely_hook7  s    zCmfMailbox2.minutely_hook)__name__
__module____qualname__r   r   r5   r7   r>   staticmethodZ
celery_appZtaskrn   rX   r~   classmethodr   __classcell__r   r   r8   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 )rd   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)rQ   r   Zmessage_from_bytesZ
read_bytesraw_parse_senderrE   r   recompilesearchstrintgroupr=   rO   date_parse_subjectre   rf   	html_bodyri   rj   rh   rg   _parse_references_parse_body)r   rQ   Zre_uidmatchZuidmatchr   r   r   __init__?  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Fromrp   r   r   <>   utf-8u   WARNING: подозрительное письмо, разные значения отправителя в Return-Path и FromzWARNING: Return-PathzFrom:)r   r=   splitr   headerr	   lenrsplitrw   r]   print)r   ZsenderZsender_nameZ_fromZname_with_emailZraw_nameZ	raw_emailZ
email_addrr   r   r   r   W  s4    0zMessage._parse_senderc                 C   s4   |r|  |pd S t| tr(|  S |    S )Nr   )r]   rw   
isinstancer   )re   encodingr   r   r   _decode_subject_partz  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   rp   )r   r=   r}   ZwarningrQ   r   r   r	   r`   rd   r   join)r   r   Zdecodedre   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)rh   rg   r   r=   rw   r   r`   )r   rh   rg   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r&|
 }t|d
 d d k	rt|d
 d
 t|d
 d }|d}|s|}n| dd}| j||jdd| |d q| r|
 }t|d
 d d k	rpt|d
 d
 t|d
 d }|d}|s|}n| dd}| j||jdd|	 | |d q| dkrqqtd|   qddd |D | _ddd |D | _| jsDt }d |_|_|| j | _| js\d| j d| _t| j| _t| j| _| js| jstd d S )Nz
text/plainT)r]   r   rP   )typecontentz	text/htmlhtmlZimager   r   z
Content-IDr   r   )rQ   rT   subtyperS   )rQ   rT   Zmaintyper   rS   zapplication/pgp-signaturez!!! UNKNOWN TYPE z

c                 S   s    g | ]}|d  dkr|d qS )r   rP   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_payloadr]   Zget_content_charsetrw   r`   Zget_content_maintypeget_filenamer	   r=   ri   Zget_content_subtypeZget_content_dispositionrj   r   r   rf   r   	html2textZ	HTML2TextZignore_imagesZignore_linksZhandleZcmfutilZ
clean_text)r   Ztext_parts_listpartZ_parsed_contentZ	_filenamerS   hr   r   r   r     sn    "



"


zMessage._parse_bodyN)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   rd   >  s   #
rd   )$Zcmf.includetimepathlibr   shutilr   Zshlexr   r   r   rq   Z
imapclientr   r   Zemail.headerr	   collectionsr
   	itertoolsr   r   quopribase64r   Zd64Zjinja2r   ZceleryZmodules.mail2.fieldsr   r   ZAPPZHOOK_CRON_MINUTELYr`   r   rd   r   r   r   r   <module>   s.     #