RubyでGmailにアクセスしてメールを取得する用途にnet/imapを使っていたんですが、どうもIMAPの仕様を理解していないと使えない、低レイヤーなモジュールだったので、ちょっとruby-gmailを試してみました。ちなみにruby1.9.2です。
#coding: utf-8 require 'kconv' require 'gmail' require 'pit' require 'pp' config = Pit.get( 'gmail', :requre => { 'address' => 'your gmail address', 'pass' => 'your gmail password' } ); gmail = Gmail.new(config['address'], config['pass']) #未読メール取得。 XXX: 制限書けていないので、未読がたくさんあると酷いことになる。 mails = gmail.inbox.mails(:unseen).map do |mail| body ='' # マルチパートならtextメールだけ見るよ。XXX:この書き方、ちょっとバグ含んでいる if mail.multipart? mail.parts.each do |part| body = part.decoded.toutf8 if /^text\/plain;/ =~ part.content_type end else body = mail.body.decoded.toutf8 end # XXX: 既読フラグを落とす mail.mark(:unread) { :message_id => mail.message_id, :subject => mail.subject ? mail.subject.toutf8 : 'no subject', :body => body, } end pp mails
素のnet/imapを使うよりはだいぶ書きやすいです。特にマルチパートメールの扱いが楽になった感じです。
gmail.peek = trueとか入れるとメール取得時に既読フラグを立てないとドキュメントには書いてあるんですが、undefined method `peek=' とか言われていまいちうまくいかなかったです。