1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 08:00:05 +08:00
SpaceVim/bundle/vim-mail/autoload/mail/client.vim
2021-10-24 16:11:33 +08:00

175 lines
5.1 KiB
VimL
Vendored
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

let s:job_id = 0
let s:job_noop_timer = ''
let s:JOB = SpaceVim#api#import('job')
function! mail#client#connect(ip, port)
if has('nvim')
let s:job_id = sockconnect('tcp', a:ip . ':' . a:port,
\ {
\ 'on_data' : function('s:on_stdout'),
\ }
\ )
call mail#logger#info('mail client job id:' . s:job_id)
else
let s:job_channel = ch_open(a:ip . ':' . a:port,
\ {
\ 'callback' : function('s:data_handle'),
\ }
\ )
call mail#logger#info('mail client job channel:' . s:job_channel)
endif
endfunction
" Wed, 06 Sep 2017 02:55:41 +0000 ===> 2017-09-06
" 一月份JAN.  Jan.=January
" 二月份FEB.  Feb.=February
" 三月份MAR.  Mar.=March
" 四月份APR.  Apr.=April
" 五月份MAY    May=May
" 六月份JUN.  Jun.=June
" 七月份JUL.  Jul.=July
" 八月份AUG.  Aug.=August
" 九月份SEP.  Sept.=September
" 十月份OCT.  Oct.=October
" 十一月份NOV. Nov.=November
" 十二月份DEC. Dec.=December
let s:__months = {
\ 'Jan' : 1,
\ 'Feb' : 2,
\ 'Mar' : 3,
\ 'Apr' : 4,
\ 'May' : 5,
\ 'Jun' : 6,
\ 'Jul' : 7,
\ 'Aug' : 8,
\ 'Sep' : 9,
\ 'Oct' : 10,
\ 'Nov' : 11,
\ 'Dec' : 12,
\ }
let s:__week = {
\ 'Sun' : 7,
\ 'Mon' : 1,
\ 'Tue' : 2,
\ 'Wed' : 3,
\ 'Thu' : 4,
\ 'Fri' : 5,
\ 'Sat' : 6,
\ }
" Date: Sun, 24 Oct 2021 05:56:21 +0000
" Date: 23 Oct 2021 18:55:36 +0800
" Date: Wed, 13 Oct 2021 14:00:24 +0800 (CST)
function! s:convert(date) abort
let week = matchstr(a:date, '^\(Sun\|Mon\|Tue\|Wed\|Thu\|Fri\|Sat\)')
let day = matchstr(a:date, '\d\+')
let mounth = get(s:__months, matchstr(a:date, '\d\+\s\zs\S\+'), '00')
let year = matchstr(a:date, '\d\+\s\S\+\s\zs\d\+')
let time = matchstr(a:date, '\d\+:\d\+:\d\+')
return printf('%04d-%02d-%02d', year, mounth, day) . ' ' . time
endfunction
function! s:noop(id) abort
call mail#client#send(mail#command#noop())
endfunction
let s:_mail_id = -1
let s:_mail_date = ''
let s:_mail_from = ''
let s:_mail_subject = ''
let s:mail_unseen = 0
function! s:data_handle(...) abort
call s:on_stdout(1,1, [a:1])
endfunction
" [ vim-mail ] [15:52:30] [ Info ] Send command: WKHCh FETCH 6:6 BODY[TEXT]
" [ vim-mail ] [15:52:30] [ Info ] STDOUT: * 6 FETCH (BODY[TEXT] {14}
" [ vim-mail ] [15:52:30] [ Info ] STDOUT: Ym9keSAxMjM0
" [ vim-mail ] [15:52:30] [ Info ] STDOUT: )
" [ vim-mail ] [15:52:30] [ Info ] STDOUT: WKHCh OK Fetch completed
" [ vim-mail ] [15:52:30] [ Info ] STDOUT:
let s:stdout_is_context = 0
function! s:on_stdout(id, data, event) abort
for data in a:data
call mail#logger#info('STDOUT: ' . data)
if s:stdout_is_context
if data =~ 'OK Fetch completed'
let s:stdout_is_context = 0
else
endif
else
if data =~ '^\* \d\+ FETCH '
let s:_mail_id = matchstr(data, '\d\+')
elseif data =~ '^\*\s\+\d\+\s\+FETCH\s(BODY[TEXT\]'
let s:stdout_is_context = 1
elseif data =~ '^From: '
let s:_mail_from = substitute(data, '^From: ', '', 'g')
let s:_mail_from .= repeat(' ', 50 - len(s:_mail_from))
elseif data =~ '^Date: '
let s:_mail_date = s:convert(substitute(data, '^Date: ', '', 'g'))
elseif data =~ '^Subject: '
let s:_mail_subject = substitute(data, '^Subject: ', '', 'g')
call mail#client#mailbox#updatedir(s:_mail_id, s:_mail_from, s:_mail_date, s:_mail_subject, mail#client#win#currentDir())
elseif data =~ '* STATUS INBOX'
let s:mail_unseen = matchstr(data, '\d\+')
elseif data =~# '* OK Coremail System IMap Server Ready'
call mail#client#send(mail#command#login(g:mail_imap_login, g:mail_imap_password))
call mail#client#send(mail#command#select(mail#client#win#currentDir()))
call mail#client#send(mail#command#fetch('1:15', 'BODY[HEADER.FIELDS ("DATE" "FROM" "SUBJECT")]'))
call mail#client#send(mail#command#status('INBOX', '["RECENT"]'))
let s:job_noop_timer = timer_start(20000, function('s:noop'), {'repeat' : -1})
endif
endif
endfor
endfunction
function! s:on_stderr(id, data, event) abort
for data in a:data
call mail#logger#error('STDERR: ' . data)
endfor
endfunction
function! s:on_exit(id, data, event) abort
let s:job_id = 0
if !empty(s:job_noop_timer)
call timer_stop(s:job_noop_timer)
let s:job_noop_timer = ''
endif
endfunction
function! mail#client#send(command)
call mail#logger#info('Send command: ' . a:command)
if has('nvim')
if s:job_id >= 0
call chansend(s:job_id, [a:command, ''])
else
call mail#logger#info('skipped!, job id is:' . s:job_id)
endif
else
call ch_sendraw(s:job_channel, a:command . "\n")
endif
endfunction
function! mail#client#open()
if s:job_id == 0
if !empty(g:mail_imap_login) && !empty(g:mail_imap_password)
call mail#client#connect(g:mail_imap_host, g:mail_imap_port)
endif
endif
call mail#client#win#open()
endfunction
function! mail#client#unseen()
return s:mail_unseen
endfunction