Shoken Startup Blog

KitchHike Founder/CTO

ruby-gmailを使ってRubyからGmailのメールを受信して本文を取得

Rubyのメール操作ライブラリにはmikel/mailがありますが、それをGmailで使いやすいように薄くラップしたruby-gmailというものがあります。今回はこれを使ってRubyからGmailからメール本文を取得します。

環境

OS CentOS 5.4
ruby 1.9.3
gem 1.8.21
ruby-gmail 0.2.1
mail 2.4.4

インストール

ruby-gmailをgemからインストール

[root@xxx xxx]# gem install ruby-gmail

LoadError: cannot load such file -- mime/message

うーん、早速トラブル。

[root@xxx xxx]# irb
irb(main):001:0> require 'gmail'
LoadError: cannot load such file -- mime/message
	from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from /usr/local/lib/ruby/gems/1.9.1/gems/ruby-gmail-0.2.1/lib/gmail/message.rb:1:in `<top (required)>'
	from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from /usr/local/lib/ruby/gems/1.9.1/gems/ruby-gmail-0.2.1/lib/gmail.rb:168:in `<top (required)>'
	from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in `require'
	from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in `rescue in require'
	from /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
	from (irb):1
	from /usr/local/bin/irb:12:in `<main>'

おー、requireでいきなり。。mime/messageが見つからない模様。
Githubのソースとコミット履歴を見てみると、message.rbから「require 'mime/message'」が削除されてる。
`gem_original_require': no such file to load -- mime/message (LoadError) · 530da69 · dcparker/ruby-gmail · GitHub

lib/gmail/message.rb View file @ 530da69
@@ -1,4 +1,3 @@
-require 'mime/message'
 class Gmail
   class Message
     def initialize(gmail, mailbox, uid)

うーん、いらないんかい。
消してみると、requireできるけど、また違うエラー。そんなに最近のコミットではないし、なんでgemに反映されないのかと思いGithubのコメント見てみると、
Pull Request #29: no such file to load -- mime/message by adimircolen · dcparker/ruby-gmail · GitHub

I am sorry, the original gem writer is deceased...

d,deceased...

とりあえず、ソースをGithubから落とした最新に差し替え。ruby-gmailに入っているRubyのソースは4ファイルしかないので簡単。ruby-gmailは私の環境ではここにありました。
/usr/local/lib/ruby/gems/1.9.1/gems/ruby-gmail-0.2.1/lib

ん?gems/1.9.1?rubyは1.9.3なのに。。

気になって調べたら、1.9.1で大丈夫のよう。
インターフェースが1.9.1から変わってないとのこと。
API Only - Stack Exchange

メールの本文取得

ドキュメント読みながらやると簡単にできた。
dcparker/ruby-gmail · GitHub

#coding: utf-8
require 'gmail'

USERNAME='' #gmailのアドレス
PASSWORD='' #gmailのパスワード

gmail = Gmail.new(USERNAME,PASSWORD)

mails =  gmail.inbox.emails(:all).map do |mail| #emailsの引数には:all,:read,:unreadがある
  #件名、日付、From、To
  puts "Subject: #{mail.subject}"
  puts "Date: #{mail.date}"
  puts "From: #{mail.from}"
  puts "To: #{mail.to}"

  #本文処理
  if !mail.text_part && !mail.html_part
    puts "body: " + mail.body.decoded.encode("UTF-8", mail.charset)
  elsif mail.text_part
    puts "text: " + mail.text_part.decoded
  elsif mail.html_part
    puts "html: " + mail.html_part.decoded
  end 
end

gmail.disconnect

できた!

[root@xxx xxx]# ruby gmail-test.rb 
Subject: テストメールタイトル
Date: 2012-03-31T19:34:44+09:00
From: ["xxxx@gmail.com"]
To: ["xxxx@gmail.com"]
body: 取得できる?!

他にも
・ラベルの変更
・未読既読の変更
・メールの削除
ができるみたい。


次回は添付ファイルの扱いに関して書きます。

2012/04/10追記
書きました。
ruby-gmailを使ってRubyからGmailの添付ファイルを取得 - オープンソースよしみ視点

参考にさせていただきました。
403 Forbidden