Ruby1.9.2 で mail を使って Gmail から添付ファイルやメール本文を受信する方法のメモです。

かなり力技的なところがあるので、もっといいプログラムになると思いいますが、メモということで。

バージョン

Ruby
1.9.2
Rails
3.0.4
mail
2.2

必要なライブラリ

mikel / mail

mail

Ruby1.8 までは、TMail というライブラリを使うとメール処理を簡易に書けるようですが、Ruby1.9から文字エンコーディング周りの問題でこのライブラリを使うと良いことを知りました。

gem install mail

Rails で使う場合は次のようにします。

rails plugin install https://github.com/mikel/mail

サンプルソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
require "mail"

Mail.defaults do
  retriever_method :imap, {:address => "imap.gmail.com",
                           :port => 993,
                           :user_name => "<[email protected]>",
                           :password => "<password>",
                           :enable_ssl => true}
end

Mail.all(:delete_after_find => true).each do |email|
  begin
    if !email.attachments.blank?
      subject = email.subject   # => 件名(日本語可OK) UTF-8 で取得できる
      body = email.parts[0].body.to_s.encode("UTF-8", "ISO-2022-JP")    # => 本文は UTF-8 に変換する必要がある
      from = email[:from]       # => "\"濱田 章吾\" [email protected]"
      sent_at = email.date
      email.attachments.each do |attachment|
        tmp = File.new("tmp/photos/#{attachment.filename}", "wb")
        tmp << attachment.read.force_encoding("UTF-8")
        tmp.close
      end
    end
  rescue => ignore
    p "[error]:" + ignore.to_s
  end
end

ここでは、マルチパートの場合メールのパートの最初に本文があることを決め打ちしています。また、メールのエンコーディングが ISO-2022-JP であることも決め打ちしています。

メール本文のエンコーディングを調べて、それを UTF-8 にするようにしたほうが良いです。