memo:rubyでimapに接続する

rubyお久しぶり。
classの文法忘れてた。
:symbolはなぜか思い出してた。
yieldを自然に使ってた。
メインはgmailに検索かけれるよ!というのが発見なので
とってきてからについては適当に。
http://www.ruby-lang.org/ja/man/html/net_imap.html
http://youichi-kato.cocolog-nifty.com/blog/2008/03/ruby_gmail_imap_bf37.html
http://mac-memo.blogspot.com/2008/01/rubygmail_30.html
imap.rb
をコピペしました。

#! ruby

require 'rubygems'
require 'net/imap'
require 'yaml'
require 'kconv'

@KCODE = "utf8"

def getInit()
  config       =  YAML.load_file("config.yaml")
  username     =  config["user"]
  password     =  config["pass"]
  return {
    :username => username,
    :password => password,
    :port     => 993,
    :usessl   => true,
    :server   => "imap.gmail.com"
  }
end

def connImap(conf)
    imap = Net::IMAP.new(conf[:server],conf[:port],conf[:usessl])
    imap.login(conf[:username],conf[:password])
    return imap
end

#使ってみたかっただけのyield
def yiel(imap,ids)
   imap.fetch(ids,["ENVELOPE","BODY"]).each {|mail|
       subt = mail.attr["ENVELOPE"]["subject"].toutf8
       ddat = mail.attr["ENVELOPE"]["date"].toutf8
       yield({:subject=>subt,:date=>ddat })
   }
end

###########################################################
###main的な?
def getKakeibo(query)
    mails = Array.new
    imap = connImap(getInit())
    imap.select(Net::IMAP.encode_utf7("[Gmail]/All Mail"))
    ids = imap.search(query,"utf-8")
  #まさにつかってみてるだけですね。
    yiel(imap,ids) { |f|
        mails <<  f
    }
    return mails.reverse
end

#fetch/filter:フィルター文字列ぐらいはしていできるようにした。
mails = getKakeibo(["SUBJECT",('もかね')])

require 'date'
require 'parsedate'

#今月の最初の日の文字列 このへんキモ過ぎて恥ずかしい
day = Time.now
fmday = Date.new(day.year,day.month,1)
fmday = (Date.new(2008,7,1))
fmday = fmday.year.to_s << fmday.month.to_s << fmday.day.to_s

mails2 = Array.new

#filter:今月最初の日より未来のデータをArrayにpush
mails.each{|m|
  mdate = ParseDate::parsedate(m[:date])
  mdate = mdate[0].to_s << mdate[1].to_s << mdate[2].to_s
  if (fmday <= mdate) then
    mails2 << m
  end
}

#map/out:よき形にして出力僕はtsvが好ましい
mails2.each{|e|
  sub  = e[:subject].toutf8
  sub =~ /もかね([0-9]+)?(.*)/u
  puts $1.tosjis << "\t" << $2.tosjis << "\t" << e[:date].to_s
}

__END__
usage:
1.configfileを用意
user: "アカウント@gmail.com"
pass: "パスワード"
なファイル名「config.yaml」を用意してスクリプトと同じフォルダに
2.ruby スクリプト名 > 出力ファイル
でOK。

メモ:
・メールボックス
INBOXの他に
[Gmail]/All Mail=>All Mail
てな具合にINBOX以外にも進めること。
wlの.folderを参考にした。
・検索
ids = imap.search(["SUBJECT",('もかね')],"utf-8")
てな具合に結構うれしい感じに検索が効く。日本語の時はcharset指定が必須っぽい
・クラス化しようかと思ったけど。。
事切れた。

これは何?
Gmailに件名"もかね[金額(半角数字)]使用メモ"というメールを送信しておけば
後からお金の使用状況をそれなりに把握できるlifehack(笑)
どれだけ簡便に書き込めるか、ということでメールを
データ保管の安定性からGmailを選択
かつてはGmailを秀丸メール(データフォルダが生テキスト)
に入れて正規表現でいじってたけどimap直接と成ったので少しは
updateしたのかも。そういや前回はperlでした。

searchの部分をいじればまぁいろいろ使い勝手はあるだろうよ。

See いろんなところをこぴぺしました。ありがとうございました。