IMAP(Gmail)の新着メールをcronでまわしてgrowlでお知らせするrubyスクリプト
一度記事失っちゃいました・・・・。
面倒臭いので、スクリプトと概要とライセンスだけです。
概要
単にIMAPサーバー(Gmail)から新着メールを確認して、Growlに出力するだけです。
Gmailで使う場合は設定からIMAPを有効にしてください。
必要な物
macportでnkfもインストールしてください。
Growlも必要です。
Macで動作します。
ライセンス
Cron Mail checker is licensed under a Creative Commons 表示-非営利-継承 2.1 License.
スクリプト
require "rubygems"
require "ruby-growl"
require "net/imap"
require "nkf"
require "pstore"
$KCODE = "u"
#Config
gr_pass = ""#Growl password
im_addr = "imap.gmail.com"#Imap server address
im_ussl = true#Use SSL (true/false)
im_user = ""#Imap username
im_pass = ""#Imap password
#Config End.
if im_ussl
im_port = 993
else
im_port = 143
end
begin
imap = Net::IMAP.new(im_addr,993,im_ussl)#Make IMAP Object
g = Growl.new('localhost','Cron Mail Checker',['newmail'],nil,gr_pass)#Make Growl Object
imap.login(im_user,im_pass)#Login to IMAP Server
imap.examine('inbox')#select inbox
#p imap.fetch(-1, "ENVELOPE")
k = imap.fetch(-1, "ENVELOPE")[0]
db = PStore.new("last_seqno")
db.transaction{
if k.seqno == db["subj"]
#imap.disconnect
#exit 0
puts "新着なし"
puts "----"
imap.logout
imap.disconnect
exit 0
else
db["subj"] = k.seqno
puts "新着あり"
puts "----"
end
}
imap.fetch(k.seqno..-1,"ENVELOPE").each { |f|
#imap.search(['NOT','SEEN']).each { |x|
#f = imap.fetch(x,'ENVELOPE')[0]
#p f
puts "Date:"+f.attr["ENVELOPE"].date
if f.attr["ENVELOPE"].from[0].name != nil
puts "From:"+NKF.nkf("-m -w",f.attr["ENVELOPE"].from[0].name)+"<"+f.attr["ENVELOPE"].from[0].mailbox+"@"+f.attr["ENVELOPE"].from[0].host+">"
grt_from = NKF.nkf("-m -w",f.attr["ENVELOPE"].from[0].name)+"<"+f.attr["ENVELOPE"].from[0].mailbox+"@"+f.attr["ENVELOPE"].from[0].host+">"
else
puts "From:"+f.attr["ENVELOPE"].from[0].mailbox+"@"+f.attr["ENVELOPE"].from[0].host
grt_from = f.attr["ENVELOPE"].from[0].mailbox+"@"+f.attr["ENVELOPE"].from[0].host
end
if f.attr["ENVELOPE"].subject != nil
puts "Subject:"+NKF.nkf("-m -w",f.attr["ENVELOPE"].subject)
grt_subj = NKF.nkf("-m -w",f.attr["ENVELOPE"].subject)
else
puts "No Subject"
grt_subj = "No Subject"
end
g.notify('newmail',grt_from,grt_subj)
puts "----"
}
#p f.attr["ENVELOPE"].from[0].name
imap.logout
imap.disconnect
rescue
puts "$!
imap.logout
imap.disconnect
end
UTF-8で保存してください。この記事では/rsc/crmchk.rbで保存したと仮定します。
crmchk.rbで保存するとわかりやすいと思います。
Growlの設定
システム環境設定でGrowlを開いて
「ネットワーク」タブから
「受信される通知を聞く」と「リモートアプリケーション登録を許可」にチェックをいれて
「サーバーパスワード」に好きなパスワードを入力してください。
終わったら「一般」タブを開いて
「Growlを終了」をクリックして、「Growlを開始」になったら「Growlを開始」をクリックしてください。
これで完了です。(Growlの設定は)
スクリプトの設定
あとは、スクリプト側の設定です。
保存したスクリプトを開いて、
Rubyの変数に書き込んでいきます。
8行目〜12行目です。
gr_passは、Growlに入力したサーバーパスワードを入力。
im_addrは、IMAPサーバーのアドレス。標準ではGmailです。
im_usslは、IMAPサーバーでSSLを使うか選択します。true/falseで指定してください。Gmailはtrueです。標準ではtrueです。
im_userは、IMAPサーバーのユーザー名。Gmailはユーザー名@gmail.comでOKです。
im_passは、IMAPサーバーのパスワード。
これを入力したら完了です。
動作テストとりあえず、保存したディレクトリまでcdして、
ruby crmchk.rb
を実行してください。うまくいけば最新メールが表示されると思います。
こんな感じ?
cronへ登録
crontabに登録します。
環境変数EDITORに登録したエディタが起動します。emacsが起動しちゃうので(標準だと)
あらかじめ
export EDITOR=/usr/bin/pico
とやっておきましょう。
crontab -e
でエディタが起動するので、
一番下に
と入力。10のところを変えれば実行する間隔が変わります。単位は分です。
5分以下には設定しない方がいいでしょう。(サーバーの負荷的な意味で)
終わったら保存してください。これでインストールは終了です。
おつかれさまでした。