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 にするようにしたほうが良いです。