ルールで賢く仕事するMacBookにしておく

既に、GrowlMailの最新版をインストールして、メールを受信すれば、お知らせしてくれる環境になって満足満足。...なのだけど、試行錯誤している間は、いざとなったら最後の手段、AppleScriptで何とかしようと考えていて、その方法も探っていた。

Mail.appのルールで駆動するサンプル

  • 以下は、AppleScriptが提供するサンプル(不要なコードは削除した)


using terms from application "Mail"
on perform mail action with messages theMessages for rule theRule
tell application "Mail"

repeat with eachMessage in theMessages
set theSubject to subject of eachMessage
set theRuleName to name of theRule
set theText to "The rule named '" & theRuleName & "' matched this message:"
set theText to theText & return & return & "Subject: " & theSubject
display dialog theText
end repeat

end tell
end perform mail action with messages
end using terms from

  • 上記スクリプトをファイル名:Sample Rule Action Script.scptとして保存した。
  • Mail.appの環境設定 >> ルールで、上記スクリプトを実行するためのルールを追加した。(とりあえず一番上にして、すべてのメールに反応するようにした)

  • 試しに自分宛にメールを送信してみた。受信すると、ルール名と件名が書き込まれたダイアログウィンドウが表示された!

  • repeatブロック内を差し替えれば、お好みの処理が実行できるはず。

Growlで通知する

GrowlHelperAppを制御して通知する方法


--登録する
tell application "GrowlHelperApp"
--Test NotificationAnother Notificationを登録して、Test Notificationを有効にする
register as application "Growl AppleScript Sample" all notifications {"Test Notification", "Another Notification"} default notifications {"Test Notification"} icon of application "Mail"
end tell



--通知する
tell application "GrowlHelperApp"
--この通知は表示される
notify with name "Test Notification" title "タイトル" description "ここはメッセージです。" application name "Growl AppleScript Sample"

--この通知は表示されない
notify with name "Another Notification" title "タイトル" description "この通知は有効にする(チェックを入れる)まで表示されない。" application name "Growl AppleScript Sample"
end tell

  • Growlに登録する
    • all notificationsは、登録する通知の名称リスト。
    • 上記all notificationsのうち、default notificationsで指定した通知が有効になる。



    • application nameは、Growlを呼び出す時に識別するための名称。アプリケーション名と一致していなくてもOK。
  • Growlに通知する
    • 有効にチェックありの通知のみが表示される。


growlnotifyコマンドで通知する方法
  • もし、growlnotifyコマンドがインストールしてあれば、もっとシンプルに書ける。以下のようにシェルコマンドを実行すれば、通知されるのだ。


do shell script "/usr/local/bin/growlnotify タイトル -m メッセージ -a Mail"

Dockを表示する

    • メールを受信したら、地味だけど、普段隠れているDockを一時的に表示するのも良いかもしれない。


using terms from application "Mail"
on perform mail action with messages theMessages for rule theRule
tell application "Mail"
my select_dock()
end tell
end perform mail action with messages
end using terms from

on select_dock()
tell application "System Events"
tell process "Dock"
--ファンクションキー等は、キーコードで指定する
-- F1:122 F2:120 F3:99 F4:118 F5:96 F6:97
-- F7:98 F8:100 F9:101 F10:109 F11:103 F12:111
key code 99 using {control down} --control-F3
end tell
end tell
end select_dock

saykanjiで読み上げる

  • 以前作ったsaykanjiコマンドで読み上げることだってできる。
    • 差出人と件名を読み上げるようにしてみた。
    • 本文については、読み上げ時にエラーとなってしまう場合がある。文字コードの問題か?
      • 以下のスクリプトをコピーした場合、半角を半角に置き換える必要あり。


using terms from application "Mail"
on perform mail action with messages theMessages for rule theRule
tell application "Mail"
repeat with aMessage in theMessages
set growlTitle to aMessage's sender

if (aMessage's content as text)'s length > 100 then
set body to characters 1 through 100 of aMessage's content & "..." as text
else
set body to aMessage's content
end if
set growlMessage to aMessage's subject & return & body

do shell script "/usr/local/bin/growlnotify " & quoted form of growlTitle & " -m " & quoted form of growlMessage & " -a Mail &"
do shell script ". /usr/local/bin/saykanji.sh; saykanji " & quoted form of (aMessage's sender as text)
do shell script ". /usr/local/bin/saykanji.sh; saykanji " & quoted form of (aMessage's subject as text)
do shell script ". /usr/local/bin/saykanji.sh; saykanji \"以上\""
end repeat
end tell
end perform mail action with messages
end using terms from

  • これでMacBookがメールを読み上げるようになった!
  • しかし、夜中に起動中、勝手にMacBookがしゃべり出すのは結構、不気味...。
  • それに、秘密にしておきたいメールも、お構いなく読み上げてしまう...。
  • メールは、自分で黙読するに限る。

宅配便の照会ページを表示する

  • 以前、宅配便の伝票番号を照会するAutomatorサービスを作った。
  • うまく出来たのだが、宅配便の会社別にサービスを作っておく必要があるので、登録するサービスが増えてしまって、多くの中から選択するのが面倒だと思っていた。
  • Mail.appのルールをうまく利用すれば、メール受信と同時に伝票番号の照会ページを開くこともできるかもしれない。やってみた。
      • 以下のスクリプトをコピーした場合、半角を半角に置き換える必要あり。


property LIB : load script file ((path to scripts folder as text) & "_lib.scpt")
--Mail.appのルールで駆動する
using terms from application "Mail"
on perform mail action with messages theMessages for rule theRule
tell application "Mail"
repeat with aMessage in theMessages
set body to LIB's replace(aMessage's content, "'", "’") try
open location my query_url(my slip_no(body), my delivery_com(body)) end try
end repeat
end tell
end perform mail action with messages
end using terms from

--メール本文から伝票No.を抽出する(ruby正規表現を利用)
--数字が12桁、あるいは4-4-4桁のパターンを抽出する(13桁以上の数字に含まれる場合は除外する)
-- 例:123456781234
-- 例:1234-5678-1234
on slip_no(str) LIB's do_ruby_jcode_u({"/\\D\\d{12}\\D|\\D\\d{4}\\-\\d{4}\\-\\d{4}\\D/ =~ " & quoted form of str, "$~"}) LIB's do_ruby_jcode_u({"/\\d{12}|\\d{4}\\-\\d{4}\\-\\d{4}/ =~ " & quoted form of result, "$~"}) end slip_no

--メール本文から宅配便の会社を調べる
on delivery_com(str) set delivery_names to {"クロネコ", "ヤマト", "JPエクスプレス", "佐川", "ゆうバック"} repeat with a_name in delivery_names
if a_name is in str then
return a_name as text
end if
end repeat
end delivery_com

--伝票No.と宅配便の会社名から検索URLを生成する
on query_url(slip, company) try
"{" & ¬ "|クロネコ|:\"https://jizen.kuronekoyamato.co.jp/jizen/servlet/crjz.b.NQ0010?id=\"," & ¬ "|ヤマト|:\"https://jizen.kuronekoyamato.co.jp/jizen/servlet/crjz.b.NQ0010?id=\"," & ¬ "|西濃|:\"https://track.seino.co.jp/cgi-bin/gnpquery.pgm?GNPNO1=\"," & ¬ "|カンガルー|:\"https://track.seino.co.jp/cgi-bin/gnpquery.pgm?GNPNO1=\"," & ¬ "|佐川|:\"https://k2k.sagawa-exp.co.jp/p/web/okurijosearch.do?okurijoNo=\"," & ¬ "|JPエクスプレス|:\"https://info.jpexpress.jp/confirm/confirmList.html?denpyoNo=\"," & ¬ "|ペリカン|:\"https://info.jpexpress.jp/confirm/confirmList.html?denpyoNo=\"," & ¬ "|ゆうパック|:\"http://tracking.post.japanpost.jp/service/singleSearch.do?searchKind=S002&locale=ja&SVID=023&reqCodeNo1=\"," & ¬ "|福山通運|:\"http://www4.fukutsu.co.jp/inq/INQJS120?toino=&toino=&toino=&toino=&toino=&toino=&toino=&toino=&toino=&toino=\"," & ¬ "|書留|:\"http://tracking.post.japanpost.jp/service/singleSearch.do?searchKind=S002&locale=ja&SVID=023&reqCodeNo1=\"," & ¬ "|翌朝10時郵便|:\"http://tracking.post.japanpost.jp/service/singleSearch.do?searchKind=S003&locale=ja&SVID=023&reqCodeNo1=\"," & ¬ "|EMS|:\"http://tracking.post.japanpost.jp/service/singleSearch.do?searchKind=S004&locale=ja&SVID=023&reqCodeNo1=\"" & ¬ "}'s"
set hash_code to result
run script hash_code & "|" & company & "|"
result & slip
end try
end query_url

  • これで、メール本文から配送伝票No.と宅配便の会社が抽出されると、勝手に配送伝票の照会ページが開く。面白い!
  • 判定する宅配便の会社はまだ限定されるが、自分の利用環境では思った以上に快適に動いた。

所感

  • メールの内容を正規表現で処理すれば、かなり賢く内容を判定して、高度な処理ができそうだ。
  • 但し、AppleScriptには正規表現がないので、Rubyを呼び出して処理している。ちょっと、呼び出す時の書き方に癖がある。