目の前に僕らの道がある

勉強会とか、技術的にはまったことのメモ

ruby-gmailを使ってみた。

RubyGmailにアクセスしてメールを取得する用途に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=' とか言われていまいちうまくいかなかったです。