Help us understand the problem. What is going on with this article?

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')する

所感

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

hatappi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away