クフでダローバルな日記

タフでもグローバルもない

メーリングリスト(freeml)に投稿があったらTwitterで通知するためにgmailと連携 with ruby

まさかはてなapiの記事があんなに伸びるとは…ありがたい限りです。参考にさせていただいたサイトへの感謝の意をあの記事では示し忘れていたので、代わりにここでお礼させていただきます。ありがとうございました。
何個かお褒めの言葉とかアドバイス的なことも頂いたので近い内に修正してみようと思います。
(しかしせっかく作ったbotのフォロワーがあんなに増えないとは……笑 やはり僕には人にウケるものをつくる才能が欠如しているようで、だれかアイディアの豊富なパートナーを持つべきなんでしょうね)

で、今回はgem ruby-gmailを使ってみました。これはどちらかと言うとgmailapiを使ったものではなく、僕が一晩かけてこれを作った翌日に、Google I/Ogmailapiが公開された(Gmail API — Google Developers)のは正直ショックでしたが、まぁメールについても少し知ることができたのでそれもいいかと思っています。
むしろ、今回やったのと同じことをGmail APIを使ってやってみるという次の目標もできたと前向きに捉えてみようと思います。

動機

僕の所属しているサークルではfreeml by GMOメーリングリストとして使用しているのですが、最近どうも届かない人が居るようだと判明。そこで、メールが投稿されるごとにTwitterで告知して届いていない人がいないか確認しようということになったのですが、正直手動だと忘れそう。→そうだ、自動化しよう。ということに一人で勝手に結論づけちゃいました。

作業記録

仕組み自体は簡単で、
1.メーリスに適当なgmailアドレスを登録しておく。
2.そのgmailにメールがfreemlから届いたら(送信先が***@freeml.com であることから判定)、ツイート
というだけです。
更に詳しく言うと、メーリスの投稿チェックは3分ごとにして、その日届いた未読メールに該当メールがあれば、それを全て既読にした上で、その最新のものについてツイートしています。

今回一番お世話になったのがこちらのサイト
ruby-gmailを使ってRubyからGmailのメールを受信して本文を取得 - Shoken
で、とりあえずこれを参考にさせていただけば、何をrequireして何をどうすればメールの情報が取得できるか分かる…はずでした。とりあえず適当に書いてみて、実際に実行してみると、いくつかエラーや不具合が発生。仕組みについての説明はいつも通り初心者でもできることしかやっていないので、少しでも社会に還元するためにエラー解決までの道のりを振り返ってみます。

1 .LoadError: cannot load such file -- mime/message

最初にrequire 'gmail'をした段階で現れました。最初は簡単にruby-gmail中のソースを書き換えていたのですが、そうしてしまうとHerokuに送信した時にもとのソースを使ってしまうのでどうしようもない。

というわけで、ruby-gmailをちゃんとアップデート(v 0.3.1)して、もちろんGemfileでもそれを指定。
これで出来るかとおもいきや、どうやらruby-gmailではなくgmailというgemと競合してしまっていてrequire 'gmail'をするとエラー。
なので、 gem uninstall gmailruby-gmailだけにします。
そしたら自分の環境でもHerokuでもLoadError: cannot load such file -- mime/messageは出なくなり、どうにかなったようです。

2.Net::IMAP::NoResponseError: Invalid credentials k5nb85405163ipo(最後の文字列は毎回変わります。これもじつは適当な文字列です。)

このエラーは二回出てきました。
一回目は、自分の環境でやっている時。何が違うんだ…と30分位迷いながらソースを見なおしてみると、なんとメールアドレスが間違っていましたorz タイポには気をつけねましょうという話です。

二回目は、Herokuで動かしてみた時。自分の環境で動くのに……と思い、このエラーコードでぐぐっても全然わからない…むしろいろいろな人が悩んでいるの解決していない……。
そこで、そもそもHerokuとgmailの関係性なのでは?と思い、Heroku gmailで検索してみるとこちらの記事に行き当たりました。
Ruby - HerokuからGmailを送ろうとして「不正なログインがブロックされました」という警告メールが届いた場合の対処法 - Qiita
なるほど…って感じですね。たしかにHerokuからのアクセスなんてどう見ても不正なログインっぽいですよね。こちらの記事はかなり詳細に手順を書いてくださっているのですぐに解決。ありがたい限りです。

3.mail.toなどででる物がアドレスの文字列ではない。

これはどうやらgem gmailを使った時のもののようで、gem ruby-gmailを使っていればこのサイトのとおりに出来るようです。

以上で機能にも反してあるにもかかわらず、色々調べていたらなんだかんだ5時間くらいはかかってしまいました。

感想と反省

まだメーリスが実際に投稿されていないので本当に動くのか少し心配なところはありますが、どうにかなってくれると信じて待ってます。
(今朝実際に動いているのが確認されました!)
あと、サークルのTwitterアカウントをこんな私的利用っぽいことしているのが本当にいいのか不安ではありますが、とりあえず今年自分が執行の間はいいのかなと考えて放置してみます笑

今回の記事も前回の記事もアドバイスとかいただけるのならお待ちしています!
あ、ちなみにGithubに一応公開しています。mazamachi/ml_check