平衡点
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 を追加
[ツッコミを入れる]