Hatena::Groupbugrammer

蟲!虫!蟲!

Esehara Profile Site (by Heroku) / Github / bookable.jp (My Service)
過去の記事一覧はこちら

なにかあったら「えせはら あっと Gmail」まで送って頂ければ幸いです。
株式会社マリーチでは、Pythonやdjango、また自然言語処理を使ったお仕事を探しています

 | 

2011-11-01

[]Gmailで新着メールが来たら、CDドライブをウィーンガッシャンと吐き出すコードを書いた 22:57

 たぶん、E-mailのお知らせは、何かしらのポップアップ等で知る方が多いとは思います。確かにポップアップは慎ましくて邪魔にならないという意味ではとてもいいんですけど、慎ましすぎて、気がついたら、メールを返さなきゃいけないのに返していない……ということになることが多いのではないかと。例えば、メールが新着できたら、「ESCキー」がびよーんと飛び出したりしたら、便利だし、かわいいのではないか。

 で、そういうリマインダーに使えそうなハードの機能を考えたところ、実はCDトレイがいいのではないか?ということに気がついた。最近のネットブックだったりすると、CDトレイがないハードもあり、何かと追い風が吹いてるCDトレイですが、ここでちょっと便利に使うことで、「あってよかったCDトレイ」という復権を図るのもいいのではないか、と思ったのでそうすることにした。

 他のOSはどうかわからないですけど、Ubuntuだと、おもむろにコンソール画面に「eject」と叩くと、「ぴょこん」とCDトレイがかわいらしく飛び出してきます。この機能を使って、今回はE-mailの新着をお知らせするシステムを作ろうかなと思います。

 f:id:nisemono_san:20111101224034j:image

 かわいいですね。

PythonからGmailの新着情報を読み込む

 まず、普段使っているGmailの新着情報をどのようにして受けとるか。Gmailなら受信にIMAPを使う。で、Pythonにはimaplibというのがついています。imaplibの使い方は下のような感じです。

mail = imaplib.IMAP4_SSL("imap.gmail.com")
mail.login(user,passw)
mail.list()
mail.select("Inbox")
status,maillist = mail.search(None,"(UNSEEN)")

 ソースがわかるなら簡単なんですけど、要するに"select"メソッドで、どのフォルダを読み込むか、という感じになっている。Gmailだと、Inboxが実質の受信トレイなので、そこを選択する。そこから、searchのメソッドを使う。ちなみに未読のフラグは"(UNSEEN)"を選択してやればいいので、それを使う。そうすると、タプルが渡される。例えば

('OK',[''])

 なにも無いときは上記のように表示される。したがって、未読があるかどうかの判定には、次のような実装を使う。

    if status == "OK":
        if maillist[0] is not '':
            print "New Mail"
        else:
            print "Not Mail"
この項の参考

Python — imaplib IMAP example with Gmail – Yuji Tomita @ Department NYC

Google グループ

CDトレイを吐き出す

 さて、次にPrintの"New Mail"のところを、CDを吐き出すようにしてあげないといけないわけだけど、Pythonでやるためにはどうするのか、というと、Pygameを使う(!!)という方法があるようす。本当になんだってやってくれるな、Pygame。(Pygameを読み込むよりは、Bashというか、コンソールに命令を渡してあげほうがいいのかなーとも思うんだけど、それはまたあとで)

    pygame.cdrom.init()
    cd = pygame.cdrom.CD(0)
    cd.init()
    cd.eject()

この項の参考

残高照会メモ: pythonでCDをイジェクト

あとはcrontabに設定してあげれば完成

 というわけで、今回はサクッと出来てうれしい限り。あとは書き込みに失敗したCD-Rでも入れておけば、ちょっとかわいいメールチェッカーになるんじゃないかと。あとは、リマインダーの代わりにも使えるし、いろいろとアイデアはあるんじゃないのかなと思います。

 あと、この方法はPassを生で保存しているので、外部ファイルを使ったりするほうがいいのかな、とも思います。ではでは。

 f:id:nisemono_san:20111101224117j:image

実際のコード

 Gmail -> Eject CD ? GitHub

 |