Guest User

Untitled

a guest
Mar 10th, 2018
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.60 KB | None | 0 0
  1. "=============================================================================
  2. " Title: VIMua (VIm Mail User Agent)
  3. " File: vimua.vim
  4. " Author: Yasuhiro Matsumoto <mattn_jp@hotmail.com>
  5. " Version: 0.7
  6. "=============================================================================
  7.  
  8. "-----------------------------------------------------------------------------
  9. " Setting Environments
  10. "-----------------------------------------------------------------------------
  11. if exists("vimua_host")
  12. let s:host = vimua_host
  13. else
  14. let s:host = ""
  15. endif
  16. if exists("vimua_user")
  17. let s:user = vimua_user
  18. else
  19. let s:user = ""
  20. endif
  21. if exists("vimua_pass")
  22. let s:pass = vimua_pass
  23. else
  24. let s:pass = ""
  25. endif
  26. if exists("vimua_name")
  27. let s:name = vimua_name
  28. else
  29. let s:name = ""
  30. endif
  31. if exists("vimua_addr")
  32. let s:addr = vimua_addr
  33. else
  34. let s:addr = ""
  35. endif
  36. if exists("vimua_menc")
  37. let s:menc = vimua_menc
  38. else
  39. let s:menc = ""
  40. endif
  41.  
  42. let s:tiltebar = ""
  43.  
  44. if has("win32")
  45. let s:libn = "vimua.dll"
  46. else
  47. let s:libn = "vimua.so"
  48. endif
  49. let s:slst = 0
  50. let s:nlst = 5
  51.  
  52. "-----------------------------------------------------------------------------
  53. " FocusWin : set focus to window
  54. "-----------------------------------------------------------------------------
  55. function! s:FocusWin(name)
  56. let num = bufwinnr(a:name)
  57. if num >= 0 && num != winnr()
  58. execute 'normal! ' . num . "\<C-W>\<C-W>"
  59. endif
  60. return num
  61. endfunction
  62.  
  63. "-----------------------------------------------------------------------------
  64. " CallBASE64E : base64 encode
  65. "-----------------------------------------------------------------------------
  66. function! s:CallBASE64E(parm)
  67. return libcall(s:libn,"base64_encode",a:parm)
  68. endfunction
  69.  
  70. "-----------------------------------------------------------------------------
  71. " CallBASE64D : base64 decode
  72. "-----------------------------------------------------------------------------
  73. function! s:CallBASE64D(parm)
  74. return libcall(s:libn,"base64_decode",a:parm)
  75. endfunction
  76.  
  77. "-----------------------------------------------------------------------------
  78. " CallQUOTEDD : quoted decode
  79. "-----------------------------------------------------------------------------
  80. function! s:CallQUOTEDD(parm)
  81. return libcall(s:libn,"quoted_decode",a:parm)
  82. endfunction
  83.  
  84. "-----------------------------------------------------------------------------
  85. " MimeDec : mime decode
  86. "-----------------------------------------------------------------------------
  87. function! s:MimeDec(code)
  88. let rcode = a:code
  89. let mbase = '.*=?\([^=]*\)?\([A-Za-z]\)?[A-Za-z0-9+/=]\+?=.*'
  90. while 1
  91. if matchstr(rcode,mbase) == ""
  92. break
  93. endif
  94. let schar = substitute(rcode, mbase, '\1', '')
  95. let sencf = substitute(rcode, mbase, '\2', '')
  96. if sencf == 'B'
  97. let spatt = s:CallBASE64D(rcode)
  98. elseif sencf == 'q'
  99. let spatt = s:CallQUOTEDD(rcode)
  100. endif
  101. let rcode = iconv(spatt, schar, &encoding)
  102. endwhile
  103. return rcode
  104. endfunction
  105.  
  106. "-----------------------------------------------------------------------------
  107. " CallGETBODY : get body from mail
  108. "-----------------------------------------------------------------------------
  109. function! s:CallGETBODY(parm)
  110. return libcall(s:libn,"get_body",a:parm)
  111. endfunction
  112.  
  113. "-----------------------------------------------------------------------------
  114. " CallGETHEAD : get header from mail
  115. "-----------------------------------------------------------------------------
  116. function! s:CallGETHEAD(head,parm)
  117. return libcall(s:libn,"get_header",a:head.",".a:parm)
  118. endfunction
  119.  
  120. "-----------------------------------------------------------------------------
  121. " CallSMTPCMD : call smtp protocol command
  122. "-----------------------------------------------------------------------------
  123. function! s:CallSMTPCMD(mailf,mailt,mails,mailb)
  124. return libcall(s:libn,"smtp_cmd",s:host.",".a:mailf.",".a:mailt.",".a:mails.",".a:mailb)
  125. endfunction
  126.  
  127. "-----------------------------------------------------------------------------
  128. " CallPOP3CMD : call pop3 protocol command
  129. "-----------------------------------------------------------------------------
  130. function! s:CallPOP3CMD(comd)
  131. return libcall(s:libn,"pop3_cmd",s:host.",".s:user.",".s:pass.",".a:comd)
  132. endfunction
  133.  
  134. "-----------------------------------------------------------------------------
  135. " VIMua : main function
  136. "-----------------------------------------------------------------------------
  137. function! s:VIMua()
  138. if &title
  139. let s:titlebar = &titlestring
  140. let &titlestring = "VIMua"
  141. endif
  142. silent edit! MailList
  143. setlocal noswapfile
  144. setlocal buftype=nowrite
  145. setlocal bufhidden=delete
  146. setlocal nonumber
  147. setlocal nowrap
  148. setlocal norightleft
  149. setlocal foldcolumn=0
  150. setlocal nomodifiable
  151. syntax match Title display "^\(\d\+\s.*\)$"
  152. nnoremap <silent> <buffer> <2-LeftMouse> :call <SID>MailShow()<CR>
  153. nnoremap <silent> <buffer> <cr> :call <SID>MailShow()<CR>
  154. nnoremap <silent> <buffer> q :call <SID>MailQuit()<CR>
  155. nnoremap <silent> <buffer> <c-left> :call <SID>MailList("n")<CR>
  156. nnoremap <silent> <buffer> <c-right> :call <SID>MailList("p")<CR>
  157. nnoremap <silent> <buffer> <c-up> :call <SID>MailList("t")<CR>
  158. nnoremap <silent> <buffer> <c-down> :call <SID>MailList("b")<CR>
  159. nnoremap <silent> <buffer> <c-l> :call <SID>MailList("")<CR>
  160. nnoremap <silent> <buffer> <c-r> :call <SID>MailComp("r")<CR>
  161. nnoremap <silent> <buffer> <c-c> :call <SID>MailComp("")<CR>
  162. nnoremap <silent> <buffer> <del> :call <SID>MailDele()<CR>
  163.  
  164. call s:CreateMailBody()
  165.  
  166. redraw!
  167. if s:LoadUser() != 0
  168. call s:MailList("")
  169. else
  170. call s:MailQuit()
  171. endif
  172. endfunction
  173.  
  174. "-----------------------------------------------------------------------------
  175. " MailDele : delete mail of current line
  176. "-----------------------------------------------------------------------------
  177. function! s:MailDele()
  178. let mlist = '^\(\d\+\)\s.*$'
  179. let slist = getline(".")
  180. if slist =~ mlist
  181. let slist = substitute(slist, mlist, '\1', '')
  182. else
  183. if line(".") < 1
  184. return
  185. endif
  186. let slist = getline(line(".")-1)
  187. if slist !~ mlist
  188. return
  189. endif
  190. let slist = substitute(slist, mlist, '\1', '')
  191. endif
  192. if confirm("Delete mail No.".slist."?", "&Yes\n&No",1) != 1
  193. return
  194. endif
  195. let sdown = s:CallPOP3CMD("dele ".slist)
  196. if sdown == ""
  197. call s:MailList("")
  198. return
  199. endif
  200. echo sdown
  201. endfunction
  202.  
  203. "-----------------------------------------------------------------------------
  204. " MailSend : send mail of current line
  205. "-----------------------------------------------------------------------------
  206. function! s:MailSend()
  207. let mailf = getline(1)
  208. let mailt = getline(2)
  209. let mails = getline(3)
  210. let sepa = getline(4)
  211. if mailf !~ '^From:\s*' || mailt !~ '^To:\s*' || mails !~ '^Subject:\s*' || sepa != '------'
  212. echoerr "hogehoge"
  213. return
  214. endif
  215. let mailf = substitute(mailf, '^From:\s*\(.*\)\s*', '\1', '')
  216. let mailt = substitute(mailt, '^To:\s*\(.*\)\s*', '\1', '')
  217. let mails = substitute(mails, '^Subject:\s*\(.*\)\s*', '\1', '')
  218.  
  219. let curline = 5
  220. let lastline = line('$')
  221. let mailb = ""
  222. while curline <= lastline
  223. let mailb = mailb . getline(curline) . "\r\n"
  224. let curline = curline + 1
  225. endwhile
  226.  
  227. if s:menc != ""
  228. let stemp = iconv(s:name,&encoding,s:menc)
  229. if stemp != ""
  230. let mailf = "=?".s:menc."?B?".s:CallBASE64E(stemp)."?= <".mailf.">"
  231. endif
  232. let stemp = iconv(mails,&encoding,s:menc)
  233. if stemp != ""
  234. let mails = "=?".s:menc."?B?".s:CallBASE64E(stemp)."?="
  235. endif
  236. let stemp = iconv(mailb,&encoding,s:menc)
  237. if stemp != ""
  238. let mailb = stemp
  239. endif
  240. endif
  241.  
  242. let sdown = s:CallSMTPCMD(mailf,mailt,mails,mailb)
  243. if sdown == ""
  244. call CreateMailBody()
  245. return
  246. endif
  247. echo sdown
  248. endfunction
  249.  
  250. function! s:CreateMailBody()
  251. if s:FocusWin("MailBody") == -1
  252. exec "rightbelow ".(&lines/6*3)."split MailBody"
  253. setlocal noswapfile
  254. setlocal buftype=nowrite
  255. setlocal bufhidden=delete
  256. setlocal nonumber
  257. setlocal nowrap
  258. setlocal norightleft
  259. setlocal foldcolumn=0
  260. setlocal nomodifiable
  261. setlocal ft=mail
  262. nnoremap <silent> <buffer> q :call <SID>MailQuit()<CR>
  263. endif
  264. endfunction
  265.  
  266. "-----------------------------------------------------------------------------
  267. " MailComp : create mail compose window
  268. "-----------------------------------------------------------------------------
  269. function! s:MailComp(flag)
  270. if a:flag == 'r'
  271. let mlist = '^\(\d\+\)\s.*$'
  272. let slist = getline(".")
  273. if slist =~ mlist
  274. let slist = substitute(slist, mlist, '\1', '')
  275. else
  276. if line(".") < 1
  277. return
  278. endif
  279. let slist = getline(line(".")-1)
  280. if slist !~ mlist
  281. return
  282. endif
  283. let slist = substitute(slist, mlist, '\1', '')
  284. endif
  285. let sdown = s:CallPOP3CMD("+retr ".slist)
  286. if sdown == ""
  287. break
  288. endif
  289.  
  290. let sbody = s:CallGETBODY(sdown)
  291. let sfrom = s:MimeDec(s:CallGETHEAD("from",sdown))
  292. let ssubj = s:MimeDec(s:CallGETHEAD("subject",sdown))
  293.  
  294. let shead = s:MimeDec(s:CallGETHEAD("content-type",sdown))
  295. if shead == ""
  296. let mbase = '.*=?\(.*\)?[A-Za-z0-9+/=]\+?='
  297. let shead = sfrom
  298. if matchstr(shead,mbase) == ""
  299. let shead = ssubj
  300. endif
  301. if matchstr(shead,mbase) != ""
  302. let shead = substitute(shead, mbase, '\1', '')
  303. let shead = substitute(shead, '\([^?]\+\)?.*', '\1', '')
  304. else
  305. let shead = s:menc
  306. endif
  307. else
  308. let mbase = '.*[;]*\s*[e]*charset=["]*\([a-zA-Z0-9_\-]\+\).*'
  309. let shead = substitute(shead, mbase, '\1', '')
  310. endif
  311. if shead != ""
  312. let stemp = iconv(sbody, shead, &encoding)
  313. let g:temp = sbody
  314. if stemp != ""
  315. let sbody = stemp
  316. endif
  317. endif
  318. let stemp = substitute(sbody, '\r', '', 'g')
  319. if stemp != ""
  320. let sbody = stemp
  321. endif
  322. else
  323. let sbody = ""
  324. let sfrom = ""
  325. let ssubj = ""
  326. endif
  327.  
  328. if s:FocusWin("MailBody") != -1
  329. silent edit! MailComp
  330. else
  331. exec "rightbelow ".(&lines/3*2+1)."split MailComp"
  332. endif
  333. setlocal noswapfile
  334. setlocal buftype=nowrite
  335. setlocal bufhidden=delete
  336. setlocal nonumber
  337. setlocal nowrap
  338. setlocal norightleft
  339. setlocal foldcolumn=0
  340. setlocal ft=mail
  341. nnoremap <silent> <buffer> <c-c> :call <SID>MailSend()<CR>
  342. nnoremap <silent> <buffer> q :call <SID>MailQuit()<CR>
  343.  
  344. let oldf = @f
  345. let @f = ""
  346.  
  347. if s:addr != ""
  348. let @f = @f."From: ".s:addr."\n"
  349. else
  350. let @f = @f."From: ".s:user."@".s:host."\n"
  351. endif
  352.  
  353. if sfrom != ""
  354. let @f = @f."To: ".sfrom."\n"
  355. else
  356. let @f = @f."To: \n"
  357. endif
  358.  
  359. if ssubj != ""
  360. let @f = @f."Subject: Re:".ssubj."\n"
  361. else
  362. let @f = @f."Subject: \n"
  363. endif
  364.  
  365. let @f = @f."------\n"
  366.  
  367. if sbody != ""
  368. let @f = @f.">".substitute(sbody,"\n", "\n>", 'g')
  369. endif
  370.  
  371. silent put! f
  372. let @f = oldf
  373. normal G
  374. startinsert
  375. endfunction
  376.  
  377. "-----------------------------------------------------------------------------
  378. " GetCount : get count of mails from server
  379. "-----------------------------------------------------------------------------
  380. function! s:GetCount()
  381. let mlist = '.*\s\+\(\d\+\)\s\+\d\+.*'
  382. let rlist = s:CallPOP3CMD("stat")
  383. if rlist == ""
  384. return 0
  385. endif
  386. if rlist =~ mlist
  387. return substitute(rlist, mlist, '\1', '')
  388. endif
  389. return rlist
  390. endfunction
  391.  
  392. "-----------------------------------------------------------------------------
  393. " LoadUser : load user profile
  394. "-----------------------------------------------------------------------------
  395. function! s:LoadUser()
  396. if s:host == ""
  397. let s:host = input("MailServer:")
  398. if s:host == ""
  399. return 0
  400. endif
  401. endif
  402. if s:user == ""
  403. let s:user = input("Login:")
  404. if s:user == ""
  405. return 0
  406. endif
  407. endif
  408. if s:pass == ""
  409. let s:pass = inputsecret("Password:")
  410. if s:pass == ""
  411. return 0
  412. endif
  413. endif
  414. return 1
  415. endfunction
  416.  
  417. "-----------------------------------------------------------------------------
  418. " MailList : list mail
  419. "-----------------------------------------------------------------------------
  420. function! s:MailList(nstart)
  421. if s:FocusWin("MailList") == -1
  422. return
  423. endif
  424. let ncount = s:GetCount()
  425. if ncount !~ "^[0-9]\\+$"
  426. echo ncount
  427. return
  428. endif
  429. if ncount == 0
  430. return
  431. endif
  432.  
  433. if a:nstart == ""
  434. let s:slst = ncount - s:nlst
  435. elseif a:nstart == "n"
  436. let s:slst = s:slst + s:nlst
  437. elseif a:nstart == "p"
  438. let s:slst = s:slst - s:nlst
  439. elseif a:nstart == "t"
  440. let s:slst = ncount - s:nlst
  441. elseif a:nstart == "b"
  442. let s:slst = 1
  443. else
  444. let s:slst = a:nstart
  445. endif
  446. if s:slst > ncount
  447. let s:slst = ncount - s:nlst
  448. endif
  449. if s:slst <= 0
  450. let s:slst = 1
  451. endif
  452.  
  453. let nlist = s:slst
  454.  
  455. let mlist = '\(\d\+\)\s\+\(\d\+\)'
  456. setlocal modifiable
  457. silent %d _
  458. setlocal nomodifiable
  459. while 1
  460. let sdown = s:CallPOP3CMD("+retr ".nlist)
  461. if sdown =~ "^-"
  462. echo sdown
  463. break
  464. endif
  465. let sfrom = s:MimeDec(s:CallGETHEAD("from",sdown))
  466. if nlist == 1381
  467. let g:hoge1 = s:CallGETHEAD("from",sdown)
  468. endif
  469. let ssubj = s:MimeDec(s:CallGETHEAD("subject",sdown))
  470. if nlist == 723
  471. let g:hoge = s:CallGETHEAD("subject",sdown)
  472. endif
  473. let oldf = @f
  474. let @f = nlist . " " . sfrom . "\n " . ssubj
  475. setlocal modifiable
  476. silent put! f
  477. setlocal nomodifiable
  478. let @f = oldf
  479. redraw!
  480. let nlist = nlist + 1
  481. if nlist >= ncount || (nlist - s:slst) >= s:nlst
  482. break
  483. endif
  484. endwhile
  485. endfunction
  486.  
  487. "-----------------------------------------------------------------------------
  488. " MailShow : show mail from given line
  489. "-----------------------------------------------------------------------------
  490. function! s:MailShow()
  491. let mlist = '^\(\d\+\)\s.*$'
  492. let slist = getline(".")
  493. if slist =~ mlist
  494. let slist = substitute(slist, mlist, '\1', '')
  495. else
  496. if line(".") < 1
  497. return
  498. endif
  499. let slist = getline(line(".")-1)
  500. if slist !~ mlist
  501. return
  502. endif
  503. let slist = substitute(slist, mlist, '\1', '')
  504. endif
  505. let sdown = s:CallPOP3CMD("+retr ".slist)
  506. if sdown == ""
  507. break
  508. endif
  509.  
  510. let sbody = s:CallGETBODY(sdown)
  511. let sfrom = s:MimeDec(s:CallGETHEAD("from",sdown))
  512. let ssubj = s:MimeDec(s:CallGETHEAD("subject",sdown))
  513. let sdate = s:MimeDec(s:CallGETHEAD("date",sdown))
  514.  
  515. let shead = s:MimeDec(s:CallGETHEAD("content-type",sdown))
  516. if shead == ""
  517. let mbase = '.*=?\(.*\)?[A-Za-z0-9+/=]\+?='
  518. let shead = sfrom
  519. if matchstr(shead,mbase) == ""
  520. let shead = ssubj
  521. endif
  522. if matchstr(shead,mbase) != ""
  523. let shead = substitute(shead, mbase, '\1', '')
  524. let shead = substitute(shead, '\([^?]\+\)?.*', '\1', '')
  525. else
  526. let shead = s:menc
  527. endif
  528. else
  529. let mbase = '.*[;]*\s*[e]*charset=["]*\([a-zA-Z0-9_\-]\+\).*'
  530. let shead = substitute(shead, mbase, '\1', '')
  531. endif
  532. if shead != ""
  533. let stemp = iconv(sbody, shead, &encoding)
  534. let g:temp = sbody
  535. if stemp != ""
  536. let sbody = stemp
  537. endif
  538. endif
  539. let stemp = substitute(sbody, '\r', '', 'g')
  540. if stemp != ""
  541. let sbody = stemp
  542. endif
  543.  
  544. call s:CreateMailBody()
  545. let oldf = @f
  546. let @f = ""
  547. let @f = @f."From: ".sfrom."\n"
  548. let @f = @f."Date: ".sdate."\n"
  549. let @f = @f."Subject: ".ssubj."\n"
  550. let @f = @f."------\n"
  551. let @f = @f.sbody
  552. setlocal modifiable
  553. silent %d _
  554. silent put! f
  555. setlocal nomodifiable
  556. let @f = oldf
  557. redraw!
  558. endfunction
  559.  
  560. "-----------------------------------------------------------------------------
  561. " MailQuit : quit VIMua window
  562. "-----------------------------------------------------------------------------
  563. function! s:MailQuit()
  564. silent! bw! MailList
  565. silent! bw! MailBody
  566. silent! bw! MailComp
  567. new!
  568. only!
  569. redraw!
  570. if &title
  571. let &titlestring = s:titlebar
  572. endif
  573. endfunction
  574.  
  575. "-----------------------------------------------------------------------------
  576. " VIMua : VIm Mail User Agent
  577. "-----------------------------------------------------------------------------
  578. command! VIMua call <SID>VIMua()
Add Comment
Please, Sign In to add comment