IMAP(Gmail)の新着メールをcronでまわしてgrowlでお知らせするrubyスクリプト




一度記事失っちゃいました・・・・。

面倒臭いので、スクリプトと概要とライセンスだけです。

概要

単にIMAPサーバー(Gmail)から新着メールを確認して、Growlに出力するだけです。

Gmailで使う場合は設定からIMAPを有効にしてください。

必要な物

gemsでruby-growlをインストールしてください。

macportでnkfもインストールしてください。

Growlも必要です。

Macで動作します。

ライセンス



Creative Commons License

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 * * * * ruby スクリプトまでの絶対パス

と入力。10のところを変えれば実行する間隔が変わります。単位は分です。

5分以下には設定しない方がいいでしょう。(サーバーの負荷的な意味で)

終わったら保存してください。これでインストールは終了です。

おつかれさまでした。