Posted at

rubyでの正しいgmailの取得方法を教える

More than 3 years have passed since last update.

rubyさわっていて、gmailの中身を取得して色々したい人がいると思う

「gem gmail 取得」というクエリで調べると下記がたぶん出てくると思う

いずれもmailというメールの送受信をよしなに行ってくれるgemをラッパーしている感じ。

ただし上記を使うには安全性の低いアプリがアカウントにアクセスするのを許可するをしないといけない。

なんか気持ち的にちょっと嫌だ


と思ったらこれは GmailのAPI が公開されるまでの話で2014年夏?移行はAPIある!!

なのでgoogle周りのサービス使うときにはお馴染みの

gem install "google-api-client"

これでいける。嬉しい。安心。

公式にラベルを取得するまでの手順がかいてるので、それを参考に動かしてみる

※ 下記からは上記のサンプルが動いてる前提で!


実際にgmailを取得するサンプルを動かしてみる

メールはココのapiを叩くのだが、それにはmailを識別しているidが必要になる。

それをココから取得する。


メールのidリストを取得


ruby

results = client.execute!(

api_method: gmail_api.users.messages.list,
parameters: {
userId: 'me',
q: 'is:read after:2015/12/20 before:2015/12/30 '
}
)

results.data.messages.each do |message|
p message.id
end

=> "211df4423fb88"
"31fsd4423fb88"


上記のpointはparametersにいれてるqで、ここにはgmailの検索クエリをそのまま入れられる!めっちゃ便利


メールの詳細を取得


ruby

results = client.execute!(

api_method: @gmail_api.users.messages.get,
parameters: { userId: 'me', id: '【さっき取得したmailのid】' },
)
# jsonでかえってくるからパースする
obj = JSON.parse(results.response.body, symbolize_names: true)
enc_base64url = obj[:payload][:parts].first[:body][:data]
headers = obj[:payload][:headers]

{
subject: headers.select { |e| e[:name] == 'Subject'}.try(:first)[:value],
from: headers.select { |e| e[:name] == 'From'}.try(:first)[:value],
date: Time.parse(headers.select { |e| e[:name] == 'Date'}.try(:first)[:value]),
# メール本文だけはBase64ulrでencodeしてあるので、デコードする
body: Base64.urlsafe_decode64(enc_base64url).force_encoding('UTF-8'),
}


上記のポイントになるのは、メール本文の取得。

取得した時はbase64urlでエンコードされておりデコードする。するとASCII-8BITでかえってくる。

表示するとかだけならこれでよいのだが、matchかけたりgsubしたりしたいとなると

utf8にしないといけないので、force_encoding('UTF-8')する


所感

ざっくりだけどこんな感じ

メール本文を取り出す時に結構はまったけどドキュメント読めば難しいことはないので

しっかりドキュメント読む