gmail に送ったURL付きメールのURLをブラウザから開く

# 前提
* Mac OS を利用している


# 概要
Twitter にiPhoneからアクセスしていて、気になった情報をメモ代わりにgmailに送ってはPCであとから開く、といったことをしていた。

今回、PCで開く作業を簡単にだが自動化してみる。

# 手順

おおまかな手順としては
1. gmailにアクセスし、自分が送った未読メールを取得
2. メールの中からURL(t.coで短縮されたもの)を抜き出す
3. URLをWebブラウザ(Google Chrome)に渡す

## ターミナルからアプリケーションを起動

### open コマンドを使う
-aオプションで関連付けられていないアプリケーションを指定してファイルやディレクトリ、URIを開くことが出来る。

```
open -a '/Applications/Google Chrome.app' http://google.com/
```

### RubyからGoogle Chromeを起動
systemメソッドを利用する。

```ruby:open_chrome.rb
URI = 'http://google.com/'
APPLICATION = '/Applications/Google\ Chrome.app' # バックスラッシュはスペースのエスケープ

system "open -a #{APPLICATION} #{URI}"

```


## Ruby でメールチェック
ruby を使ってメール機能を扱うにはいくつか方法があるが、gemを利用するのが楽でいいです。

### POP通信
標準ライブラリnet/popを利用する。

```ruby:mail_check.rb
require 'net/pop'

SERVER = 'mail.example.com'
ACCOUNT = 'example@example.com'
PASSWORD = 'password'
PORT = Net::POP3.default_port
# PORT = Net::POP3.default_pop3s_port

pop = Net::POP3.new SERVER
pop.start ACCOUNT, PASSWORD

# save to file
i = 0
if pop.mails.empty?
  puts 'No mail.'
else
  puts "You have #{pop.mail.size} new messages."
  pop.mails.each do |m|
    File.open('/Users/JohnDoe/Desktop/inbox/#{i}.eml', 'w'){ |f|
      m.pop f
    }
    i += 1
  end
end
```

## IMAP 通信
標準ライブラリnet/imapを利用する。

### ログインあれこれ

```ruby:imap_mailChecker.rb
require 'net/imap'

SERVER   = 'imap.example.com'
ACCOUNT  = 'example@example.com'
PASSWORD = 'password'
PORT     = 993
USE_SSL  = true

# Net::IMAP.new(host, port = 143, usessl = false, certs = nil, verify = false)
imap = Net::IMAP.new SERVER, PORT, USE_SSL

imap.authenticate 'LOGIN', ACCOUNT, PASSWORD
=begin
imap.authenticate(auth_type, user, password)
auth_type:
  'LOGIN'
  'PLAIN'
  'CRAM-MD5'
  'DIGEST-MD5'
=end

=begin
暗号化とか使わない：
imap = Net::IMAP.new SERVER
imap.login(ACCOUNT, PASSWORD)
=end
```

ただ、接続先がGmail の場合、Rubyの標準ライブラリで用意されている認証方式はGmailが対応している認証方式と一致しない。

---

Gem Gmail を利用してGmailにアクセスする。

```ruby:gmail-imap_mailChecker.rb
require 'gmail'

ACCOUNT  = 'example@example.com'
PASSWORD = 'password'

gmail = Gmail.connect(ACCOUNT, PASSWORD)
```


## 取得メールからURIを解析
### URI を正規表現で取り出す
自分のケータイから送られてきたTwitterのツイートからURI(t.co から始まるアドレス)を抜き出す。

```ruby:
regexp = /http:\/\/t\.co\/\w+/
text = 'i lov it! pls check it out: http://t.co/example'

regexp.match text #=> http://t.co/example
```

## 解析したアドレスを勝手に開く
先ほどのsystem メソッドを使って、Google Chrome にURL(t.co)を渡してあげる

メールの操作とWebブラウザの起動を組み合わせて

```ruby:mailUriOpener.rb
require 'gmail'

APPLICATION = '/Applications/Google\ Chrome.app'

ACCOUNT  = 'example@example.com'
PASSWORD = 'password'

MAIL_FROM = 'example2@example.com'

regexp = /http:\/\/t\.co\/\w+/

gmail = Gmail.connect ACCOUNT, PASSWORD

gmail.inbox.emails(:unread, from: MAIL_FROM).map do |mail|
  text = mail.body
  uri = regexp.match(text.to_s) if text =~ regexp
  unless uri.nil?
    mail.delete!
    system "open -a #{APPLICATION} #{uri}"
  end
  sleep 6
end
```


---

## リンク
* [Macのターミナルからアプリを起動する方法](http://staku.designbits.jp/terminal-run-app/)
* [Rubyで外部コマンドを実行して結果を受け取る方法あれこれ #Ruby - Qiita](http://qiita.com/items/56c9fa81ca89088c5627)
* [How to Check Email with Ruby on Rails](http://ruby.about.com/od/tasks/a/pop3.htm)
* [Programing about Mailer - メールのプログラムについて](hp.vector.co.jp/authors/VA032790/program/mail/programh0.html)