A Day in the Life

2008-06-25

ruby で unix mbox 形式のメールの処理

mbox に溜まったメールを処理したい時、基本的に逐一処理してって、意図しないときだけ mbox に残しておきたい。そんなときは TMail を使って処理するのが一般的?検索してもでてこないや。

TMail::UNIXMbox.create_from_line がバグっていてうまく new_port できないのでオーバーライドして処理。

あれれ、明示的に port#remove されないと消えないよなぁ。何だったんだろ…。

require 'tmail'

module TMail
  module TextUtils
    module_function :time2str
  end

  class UNIXMbox
    def UNIXMbox.create_from_line( port )
      # bug fix
      sprintf 'From %s %s',
              fromaddr(port), TextUtils::time2str(File.mtime(port.filename))
    end

  end
end

include TMail
mbox = UNIXMbox.new('/var/spool/mail/gorou')

mbox.each do |port|
  begin
    mail = Mail.new(port)
    if %w(hotchpotch@example.com).include? mail.to
      # メールをよしなに処理する
    else
      # 処理をしない
      puts mail.to
      port.move_to mbox.new_port
    end
  rescue Exception
    # 例外時はメールを保持したまま
    port.move_to mbox.new_port
  end
end
mbox.close

なんかもっとうまい方法がある気がするんだけど。この方法だと mbox が巨大すぎると時間がかかりすぎる。

rails.vim のソースで良いところ

  • 関数名が解りやすい
  • コピペで機能実装が可能

何にも知らなくても軽く読んですぐ機能追加できる。抽象化具合も、無理矢理 OOP してなくて、vimscript っぽく関数べた書き、しかしながら解ほとんどの機能は関数に分離されているのでわかりやすい。

rails.vim で :Rconfig

:Rconfig env[tab]
:Rconfig rout[tab]

とかで移動したいな、と数十回は思ったので作成。そろそろ本家にパッチ送りたい。あああ github ならば…(ギッハブ厨オツ)

diff --git a/autoload/rails.vim b/autoload/rails.vim
index df01f96..e046f6f 100644
--- a/autoload/rails.vim
+++ b/autoload/rails.vim
@@ -1784,6 +1784,7 @@ function! s:BufFinderCommands()
   call s:addfilecmds("javascript")
   call s:addfilecmds("task")
   call s:addfilecmds("lib")
+  call s:addfilecmds("config")
   call s:addfilecmds("plugin")
 endfunction

@@ -1976,6 +1977,15 @@ function! s:libList(A,L,P)
   return s:autocamelize(all,a:A)
 endfunction

+function! s:configList(A,L,P)
+  let all = s:relglob('config/',s:recurse)
+  if RailsFilePath() =~ '\
+    let path = s:sub(RailsFilePath(),'
+    let all = s:relglob(path,s:recurse) . "\n" . all
+  endif
+  return s:autocamelize(all,a:A)
+endfunction
+
 function! s:Command(bang,...)
   if a:bang
     let str = ""
@@ -2399,6 +2409,16 @@ function! s:libEdit(bang,cmd,...)
   endif
 endfunction

+function! s:configEdit(bang,cmd,...)
+  let extra = ""
+  if RailsFilePath() =~ '\
+    let extra = s:sub(RailsFilePath(),'
+  endif
+  if a:0
+    call s:EditSimpleRb(a:bang,a:cmd,"task",a:0? a:1 : "",extra."config/","")
+  endif
+endfunction
+
 " }}}1
 " Alternate/Related {{{1

github ieize

javascript:document.body.innerHTML=document.body.innerHTML.split(/\d+/).join('NaN');focus();
記事の一覧 >