Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- "=============================================================================
- " Title: VIMua (VIm Mail User Agent)
- " File: vimua.vim
- " Author: Yasuhiro Matsumoto <mattn_jp@hotmail.com>
- " Version: 0.7
- "=============================================================================
- "-----------------------------------------------------------------------------
- " Setting Environments
- "-----------------------------------------------------------------------------
- if exists("vimua_host")
- let s:host = vimua_host
- else
- let s:host = ""
- endif
- if exists("vimua_user")
- let s:user = vimua_user
- else
- let s:user = ""
- endif
- if exists("vimua_pass")
- let s:pass = vimua_pass
- else
- let s:pass = ""
- endif
- if exists("vimua_name")
- let s:name = vimua_name
- else
- let s:name = ""
- endif
- if exists("vimua_addr")
- let s:addr = vimua_addr
- else
- let s:addr = ""
- endif
- if exists("vimua_menc")
- let s:menc = vimua_menc
- else
- let s:menc = ""
- endif
- let s:tiltebar = ""
- if has("win32")
- let s:libn = "vimua.dll"
- else
- let s:libn = "vimua.so"
- endif
- let s:slst = 0
- let s:nlst = 5
- "-----------------------------------------------------------------------------
- " FocusWin : set focus to window
- "-----------------------------------------------------------------------------
- function! s:FocusWin(name)
- let num = bufwinnr(a:name)
- if num >= 0 && num != winnr()
- execute 'normal! ' . num . "\<C-W>\<C-W>"
- endif
- return num
- endfunction
- "-----------------------------------------------------------------------------
- " CallBASE64E : base64 encode
- "-----------------------------------------------------------------------------
- function! s:CallBASE64E(parm)
- return libcall(s:libn,"base64_encode",a:parm)
- endfunction
- "-----------------------------------------------------------------------------
- " CallBASE64D : base64 decode
- "-----------------------------------------------------------------------------
- function! s:CallBASE64D(parm)
- return libcall(s:libn,"base64_decode",a:parm)
- endfunction
- "-----------------------------------------------------------------------------
- " CallQUOTEDD : quoted decode
- "-----------------------------------------------------------------------------
- function! s:CallQUOTEDD(parm)
- return libcall(s:libn,"quoted_decode",a:parm)
- endfunction
- "-----------------------------------------------------------------------------
- " MimeDec : mime decode
- "-----------------------------------------------------------------------------
- function! s:MimeDec(code)
- let rcode = a:code
- let mbase = '.*=?\([^=]*\)?\([A-Za-z]\)?[A-Za-z0-9+/=]\+?=.*'
- while 1
- if matchstr(rcode,mbase) == ""
- break
- endif
- let schar = substitute(rcode, mbase, '\1', '')
- let sencf = substitute(rcode, mbase, '\2', '')
- if sencf == 'B'
- let spatt = s:CallBASE64D(rcode)
- elseif sencf == 'q'
- let spatt = s:CallQUOTEDD(rcode)
- endif
- let rcode = iconv(spatt, schar, &encoding)
- endwhile
- return rcode
- endfunction
- "-----------------------------------------------------------------------------
- " CallGETBODY : get body from mail
- "-----------------------------------------------------------------------------
- function! s:CallGETBODY(parm)
- return libcall(s:libn,"get_body",a:parm)
- endfunction
- "-----------------------------------------------------------------------------
- " CallGETHEAD : get header from mail
- "-----------------------------------------------------------------------------
- function! s:CallGETHEAD(head,parm)
- return libcall(s:libn,"get_header",a:head.",".a:parm)
- endfunction
- "-----------------------------------------------------------------------------
- " CallSMTPCMD : call smtp protocol command
- "-----------------------------------------------------------------------------
- function! s:CallSMTPCMD(mailf,mailt,mails,mailb)
- return libcall(s:libn,"smtp_cmd",s:host.",".a:mailf.",".a:mailt.",".a:mails.",".a:mailb)
- endfunction
- "-----------------------------------------------------------------------------
- " CallPOP3CMD : call pop3 protocol command
- "-----------------------------------------------------------------------------
- function! s:CallPOP3CMD(comd)
- return libcall(s:libn,"pop3_cmd",s:host.",".s:user.",".s:pass.",".a:comd)
- endfunction
- "-----------------------------------------------------------------------------
- " VIMua : main function
- "-----------------------------------------------------------------------------
- function! s:VIMua()
- if &title
- let s:titlebar = &titlestring
- let &titlestring = "VIMua"
- endif
- silent edit! MailList
- setlocal noswapfile
- setlocal buftype=nowrite
- setlocal bufhidden=delete
- setlocal nonumber
- setlocal nowrap
- setlocal norightleft
- setlocal foldcolumn=0
- setlocal nomodifiable
- syntax match Title display "^\(\d\+\s.*\)$"
- nnoremap <silent> <buffer> <2-LeftMouse> :call <SID>MailShow()<CR>
- nnoremap <silent> <buffer> <cr> :call <SID>MailShow()<CR>
- nnoremap <silent> <buffer> q :call <SID>MailQuit()<CR>
- nnoremap <silent> <buffer> <c-left> :call <SID>MailList("n")<CR>
- nnoremap <silent> <buffer> <c-right> :call <SID>MailList("p")<CR>
- nnoremap <silent> <buffer> <c-up> :call <SID>MailList("t")<CR>
- nnoremap <silent> <buffer> <c-down> :call <SID>MailList("b")<CR>
- nnoremap <silent> <buffer> <c-l> :call <SID>MailList("")<CR>
- nnoremap <silent> <buffer> <c-r> :call <SID>MailComp("r")<CR>
- nnoremap <silent> <buffer> <c-c> :call <SID>MailComp("")<CR>
- nnoremap <silent> <buffer> <del> :call <SID>MailDele()<CR>
- call s:CreateMailBody()
- redraw!
- if s:LoadUser() != 0
- call s:MailList("")
- else
- call s:MailQuit()
- endif
- endfunction
- "-----------------------------------------------------------------------------
- " MailDele : delete mail of current line
- "-----------------------------------------------------------------------------
- function! s:MailDele()
- let mlist = '^\(\d\+\)\s.*$'
- let slist = getline(".")
- if slist =~ mlist
- let slist = substitute(slist, mlist, '\1', '')
- else
- if line(".") < 1
- return
- endif
- let slist = getline(line(".")-1)
- if slist !~ mlist
- return
- endif
- let slist = substitute(slist, mlist, '\1', '')
- endif
- if confirm("Delete mail No.".slist."?", "&Yes\n&No",1) != 1
- return
- endif
- let sdown = s:CallPOP3CMD("dele ".slist)
- if sdown == ""
- call s:MailList("")
- return
- endif
- echo sdown
- endfunction
- "-----------------------------------------------------------------------------
- " MailSend : send mail of current line
- "-----------------------------------------------------------------------------
- function! s:MailSend()
- let mailf = getline(1)
- let mailt = getline(2)
- let mails = getline(3)
- let sepa = getline(4)
- if mailf !~ '^From:\s*' || mailt !~ '^To:\s*' || mails !~ '^Subject:\s*' || sepa != '------'
- echoerr "hogehoge"
- return
- endif
- let mailf = substitute(mailf, '^From:\s*\(.*\)\s*', '\1', '')
- let mailt = substitute(mailt, '^To:\s*\(.*\)\s*', '\1', '')
- let mails = substitute(mails, '^Subject:\s*\(.*\)\s*', '\1', '')
- let curline = 5
- let lastline = line('$')
- let mailb = ""
- while curline <= lastline
- let mailb = mailb . getline(curline) . "\r\n"
- let curline = curline + 1
- endwhile
- if s:menc != ""
- let stemp = iconv(s:name,&encoding,s:menc)
- if stemp != ""
- let mailf = "=?".s:menc."?B?".s:CallBASE64E(stemp)."?= <".mailf.">"
- endif
- let stemp = iconv(mails,&encoding,s:menc)
- if stemp != ""
- let mails = "=?".s:menc."?B?".s:CallBASE64E(stemp)."?="
- endif
- let stemp = iconv(mailb,&encoding,s:menc)
- if stemp != ""
- let mailb = stemp
- endif
- endif
- let sdown = s:CallSMTPCMD(mailf,mailt,mails,mailb)
- if sdown == ""
- call CreateMailBody()
- return
- endif
- echo sdown
- endfunction
- function! s:CreateMailBody()
- if s:FocusWin("MailBody") == -1
- exec "rightbelow ".(&lines/6*3)."split MailBody"
- setlocal noswapfile
- setlocal buftype=nowrite
- setlocal bufhidden=delete
- setlocal nonumber
- setlocal nowrap
- setlocal norightleft
- setlocal foldcolumn=0
- setlocal nomodifiable
- setlocal ft=mail
- nnoremap <silent> <buffer> q :call <SID>MailQuit()<CR>
- endif
- endfunction
- "-----------------------------------------------------------------------------
- " MailComp : create mail compose window
- "-----------------------------------------------------------------------------
- function! s:MailComp(flag)
- if a:flag == 'r'
- let mlist = '^\(\d\+\)\s.*$'
- let slist = getline(".")
- if slist =~ mlist
- let slist = substitute(slist, mlist, '\1', '')
- else
- if line(".") < 1
- return
- endif
- let slist = getline(line(".")-1)
- if slist !~ mlist
- return
- endif
- let slist = substitute(slist, mlist, '\1', '')
- endif
- let sdown = s:CallPOP3CMD("+retr ".slist)
- if sdown == ""
- break
- endif
- let sbody = s:CallGETBODY(sdown)
- let sfrom = s:MimeDec(s:CallGETHEAD("from",sdown))
- let ssubj = s:MimeDec(s:CallGETHEAD("subject",sdown))
- let shead = s:MimeDec(s:CallGETHEAD("content-type",sdown))
- if shead == ""
- let mbase = '.*=?\(.*\)?[A-Za-z0-9+/=]\+?='
- let shead = sfrom
- if matchstr(shead,mbase) == ""
- let shead = ssubj
- endif
- if matchstr(shead,mbase) != ""
- let shead = substitute(shead, mbase, '\1', '')
- let shead = substitute(shead, '\([^?]\+\)?.*', '\1', '')
- else
- let shead = s:menc
- endif
- else
- let mbase = '.*[;]*\s*[e]*charset=["]*\([a-zA-Z0-9_\-]\+\).*'
- let shead = substitute(shead, mbase, '\1', '')
- endif
- if shead != ""
- let stemp = iconv(sbody, shead, &encoding)
- let g:temp = sbody
- if stemp != ""
- let sbody = stemp
- endif
- endif
- let stemp = substitute(sbody, '\r', '', 'g')
- if stemp != ""
- let sbody = stemp
- endif
- else
- let sbody = ""
- let sfrom = ""
- let ssubj = ""
- endif
- if s:FocusWin("MailBody") != -1
- silent edit! MailComp
- else
- exec "rightbelow ".(&lines/3*2+1)."split MailComp"
- endif
- setlocal noswapfile
- setlocal buftype=nowrite
- setlocal bufhidden=delete
- setlocal nonumber
- setlocal nowrap
- setlocal norightleft
- setlocal foldcolumn=0
- setlocal ft=mail
- nnoremap <silent> <buffer> <c-c> :call <SID>MailSend()<CR>
- nnoremap <silent> <buffer> q :call <SID>MailQuit()<CR>
- let oldf = @f
- let @f = ""
- if s:addr != ""
- let @f = @f."From: ".s:addr."\n"
- else
- let @f = @f."From: ".s:user."@".s:host."\n"
- endif
- if sfrom != ""
- let @f = @f."To: ".sfrom."\n"
- else
- let @f = @f."To: \n"
- endif
- if ssubj != ""
- let @f = @f."Subject: Re:".ssubj."\n"
- else
- let @f = @f."Subject: \n"
- endif
- let @f = @f."------\n"
- if sbody != ""
- let @f = @f.">".substitute(sbody,"\n", "\n>", 'g')
- endif
- silent put! f
- let @f = oldf
- normal G
- startinsert
- endfunction
- "-----------------------------------------------------------------------------
- " GetCount : get count of mails from server
- "-----------------------------------------------------------------------------
- function! s:GetCount()
- let mlist = '.*\s\+\(\d\+\)\s\+\d\+.*'
- let rlist = s:CallPOP3CMD("stat")
- if rlist == ""
- return 0
- endif
- if rlist =~ mlist
- return substitute(rlist, mlist, '\1', '')
- endif
- return rlist
- endfunction
- "-----------------------------------------------------------------------------
- " LoadUser : load user profile
- "-----------------------------------------------------------------------------
- function! s:LoadUser()
- if s:host == ""
- let s:host = input("MailServer:")
- if s:host == ""
- return 0
- endif
- endif
- if s:user == ""
- let s:user = input("Login:")
- if s:user == ""
- return 0
- endif
- endif
- if s:pass == ""
- let s:pass = inputsecret("Password:")
- if s:pass == ""
- return 0
- endif
- endif
- return 1
- endfunction
- "-----------------------------------------------------------------------------
- " MailList : list mail
- "-----------------------------------------------------------------------------
- function! s:MailList(nstart)
- if s:FocusWin("MailList") == -1
- return
- endif
- let ncount = s:GetCount()
- if ncount !~ "^[0-9]\\+$"
- echo ncount
- return
- endif
- if ncount == 0
- return
- endif
- if a:nstart == ""
- let s:slst = ncount - s:nlst
- elseif a:nstart == "n"
- let s:slst = s:slst + s:nlst
- elseif a:nstart == "p"
- let s:slst = s:slst - s:nlst
- elseif a:nstart == "t"
- let s:slst = ncount - s:nlst
- elseif a:nstart == "b"
- let s:slst = 1
- else
- let s:slst = a:nstart
- endif
- if s:slst > ncount
- let s:slst = ncount - s:nlst
- endif
- if s:slst <= 0
- let s:slst = 1
- endif
- let nlist = s:slst
- let mlist = '\(\d\+\)\s\+\(\d\+\)'
- setlocal modifiable
- silent %d _
- setlocal nomodifiable
- while 1
- let sdown = s:CallPOP3CMD("+retr ".nlist)
- if sdown =~ "^-"
- echo sdown
- break
- endif
- let sfrom = s:MimeDec(s:CallGETHEAD("from",sdown))
- if nlist == 1381
- let g:hoge1 = s:CallGETHEAD("from",sdown)
- endif
- let ssubj = s:MimeDec(s:CallGETHEAD("subject",sdown))
- if nlist == 723
- let g:hoge = s:CallGETHEAD("subject",sdown)
- endif
- let oldf = @f
- let @f = nlist . " " . sfrom . "\n " . ssubj
- setlocal modifiable
- silent put! f
- setlocal nomodifiable
- let @f = oldf
- redraw!
- let nlist = nlist + 1
- if nlist >= ncount || (nlist - s:slst) >= s:nlst
- break
- endif
- endwhile
- endfunction
- "-----------------------------------------------------------------------------
- " MailShow : show mail from given line
- "-----------------------------------------------------------------------------
- function! s:MailShow()
- let mlist = '^\(\d\+\)\s.*$'
- let slist = getline(".")
- if slist =~ mlist
- let slist = substitute(slist, mlist, '\1', '')
- else
- if line(".") < 1
- return
- endif
- let slist = getline(line(".")-1)
- if slist !~ mlist
- return
- endif
- let slist = substitute(slist, mlist, '\1', '')
- endif
- let sdown = s:CallPOP3CMD("+retr ".slist)
- if sdown == ""
- break
- endif
- let sbody = s:CallGETBODY(sdown)
- let sfrom = s:MimeDec(s:CallGETHEAD("from",sdown))
- let ssubj = s:MimeDec(s:CallGETHEAD("subject",sdown))
- let sdate = s:MimeDec(s:CallGETHEAD("date",sdown))
- let shead = s:MimeDec(s:CallGETHEAD("content-type",sdown))
- if shead == ""
- let mbase = '.*=?\(.*\)?[A-Za-z0-9+/=]\+?='
- let shead = sfrom
- if matchstr(shead,mbase) == ""
- let shead = ssubj
- endif
- if matchstr(shead,mbase) != ""
- let shead = substitute(shead, mbase, '\1', '')
- let shead = substitute(shead, '\([^?]\+\)?.*', '\1', '')
- else
- let shead = s:menc
- endif
- else
- let mbase = '.*[;]*\s*[e]*charset=["]*\([a-zA-Z0-9_\-]\+\).*'
- let shead = substitute(shead, mbase, '\1', '')
- endif
- if shead != ""
- let stemp = iconv(sbody, shead, &encoding)
- let g:temp = sbody
- if stemp != ""
- let sbody = stemp
- endif
- endif
- let stemp = substitute(sbody, '\r', '', 'g')
- if stemp != ""
- let sbody = stemp
- endif
- call s:CreateMailBody()
- let oldf = @f
- let @f = ""
- let @f = @f."From: ".sfrom."\n"
- let @f = @f."Date: ".sdate."\n"
- let @f = @f."Subject: ".ssubj."\n"
- let @f = @f."------\n"
- let @f = @f.sbody
- setlocal modifiable
- silent %d _
- silent put! f
- setlocal nomodifiable
- let @f = oldf
- redraw!
- endfunction
- "-----------------------------------------------------------------------------
- " MailQuit : quit VIMua window
- "-----------------------------------------------------------------------------
- function! s:MailQuit()
- silent! bw! MailList
- silent! bw! MailBody
- silent! bw! MailComp
- new!
- only!
- redraw!
- if &title
- let &titlestring = s:titlebar
- endif
- endfunction
- "-----------------------------------------------------------------------------
- " VIMua : VIm Mail User Agent
- "-----------------------------------------------------------------------------
- command! VIMua call <SID>VIMua()
Add Comment
Please, Sign In to add comment