平衡点
2014/07/26
_ Conky用のbiffスクリプト
普段はofflineimapでメールを同期し、localhostでdovecot-imapd上げてメールを読んでいる.
折角手元にIMAPサーバがあるのだから、
- Conkyで未読メール数を表示させる
- IMAP IDLEに対応する
といった事をやりたくなった.
...のででっち上げてみた.
# source: ruby #! /usr/bin/env ruby # -*- coding: utf-8 -*- # Copyright 2014 Youhei SASAKI <uwabami@gfd-dennou.org> # # License: MIT/X11 @see http://opensource.org/licenses/mit-license.php # require 'yaml' require 'net/imap' $config = YAML.load_file(File.expand_path(File.dirname(__FILE__))+ '/config.yaml') def openConnection() imap = Net::IMAP.new($config['server'], $config['port'], $config['ssl'], $config['certs']) imap.login($config['username'], $config['password']) imap.select($config['folder']) return imap end def checkMailbox(imap) status = imap.status($config['folder'], ['UNSEEN','MESSAGES']) num_total = status['MESSAGES'] num_unseen = status['UNSEEN'] File.open($config['notifyfile'], "w+"){|f| f.puts num_unseen.to_s+ "/" + num_total.to_s } end # first connection imap = openConnection() # update notifyFile checkMailbox(imap) # run imap idle imap.idle do |res| begin if res.kind_of?(Net::IMAP::UntaggedResponse) and ['EXISTS', 'EXPUNGE', 'FETCH'].include? res.name # なんか馬鹿らしいけれど. response から UNSEEN, MESSAGES 取れないかなぁ...。 checker = openConnection() checkMailbox(checker) checker.logout checker.disconnect end rescue Exception => err puts err imap.idle_done end end
設定ファイルはこんな感じ
# source: yaml server: SERVERNAME port: PORTNUMBER ssl: TRUE or FALSE certs: LOCATION OF CERTIFICATES FILE username: YOUR USERNAME password: IMAP PASSWORD folder: MAILBOX NAME(e.g. INBOX) notifyfile: OUTPUT FILE FOR CONKY
これを ~/.conky に転がして、パーミッションを適宜調整しておく. あとは ~/.config/autostart あたりに適当なファイル名で
# source: conf [Desktop Entry] Type=Application Exec=/home/uwabami/.conky/mail-checker.rb Hidden=false NoDisplay=false X-GNOME-Autostart-enabled=true Name=Mail checker use IMAP idle for conky Comment=Mail checker use IMAP idle for conky, need Ruby >= 1.9.3
なんてしておいて, conky の設定ファイル内では ファイルの中身を cat しておく.
(2014/07/28) checker が無限増殖していたので, disconnect を追加