何日までに○○しなさいというメールが届いた!けどほったらかしておいたら期限を過ぎていた!そういう経験、あるよね?
そこで、そういうメールが届いたら自動でMacの「リマインダー」に登録されるようにしよう!という話。
おおまかな流れとしては、
- Mail.appの「ルール」機能を使って、特定の条件に当てはまるメールを受信した時に「AppleScript を実行」する。
- そのAppleScriptで、メールの本文から期限日時とかを抽出して、リマインダー.appに登録する。
とする。
「AppleScript」と書いたが、最近のMac(10.10 Yosemite以降)ではJavaScript for Automation (JXA)というのが導入された。これを使うと、AppleScriptとかいう謎言語を習得しなくても、プログラマーなら誰でも触れたことがあるだろうJavaScriptを使ってMacの操作を
AppleScriptやJXAのスクリプトを書くには、OS X標準のスクリプトエディタを使う。「アプリケーション」フォルダの「ユーティリティ」(Launchpadでは「その他」に入っていた)の中から起動しよう。
まずは、スクリプトの書き方。JXAはまだ歴史が浅いせいか、そこまで資料は充実していない印象を持った。とりあえずAppleが出してるリリースノートのリンクを貼っておく。
対象となるアプリケーション側の仕様は、スクリプトエディタから調べられる。まずはメニューの「ウインドウ」から「ライブラリ」を辿ると、アプリケーション一覧が載った「ライブラリ」ウインドウが出てくる。
そこで「メール」を押せば、Mail.appのオブジェクトとかメソッド一覧が参照できる。ツールバーの「言語」で、スクリプト言語を切り替えられる。今回はJavaScriptで書きたいので「JavaScript」を選ぶ。そうすると、メソッド名とかがJavaScript用になる。
Mail.appの「ルール」で発動する処理を書きたいときには、スクリプトファイル中で performMailActionWithMessages
という名前の関数を定義してやる。ルールの対象となるメッセージは、関数の引数に、配列として渡される。
あとは、ググって得たコード例とかも参考にしながら、ちょろちょろとスクリプトを書いてやれば良い。メール本文の返却期限日を抽出するのにはJavaScriptの正規表現を使う。
スクリプトの保存先は、Mail.appの環境設定→「ルール」で適当にルールを作ってやって、「以下の操作を実行:」→「AppleScript を実行」→「Finder で開く」とするとその場所が開ける。自分の環境だと ホーム/Library/Application Scripts/com.apple.mail
だった。
テストするには、Mail.appのルールを作った上で、実際に受信したメールに対して「ルールを適用」してやればよい。リマインダーの登録リスト(上のスクリプトだと「本の返却」)はあらかじめ作っておく必要がある。
本の返却日ぐらいメールを見て覚えておけよ、と思うかもしれないが、こういう
参考にしたページとか:
- JavaScript for Automation Release Notes – Mac Developer Library
- email – Mail Rules using JavaScript for Automation instead of AppleScript – Stack Overflow
- AppleScript のJavaScript版 JXAで、リマインダを登録する – それマグで!
- osx – Automator / AppleScript to process incoming emails in Mac Mail – Stack Overflow
- Automatically save Mail attachments using AppleScript | AppleScript, Mail | Mac OS X Tips
- AppleScript Essentials Introduction to Scripting Mail — MacTech | The journal of Apple technology.
- Getting Started with JavaScript for Automation on Yosemite – MacStories
- dtinth/JXA-Cookbook (GitHub)
こんにちは。突然すみません。
MacのMailから自動でリマインダーへ追加させたくてググっていたら辿り着きました。
Javaなど、全くの初心者で少し調べながらやってみたのですが、うまくいきません。
今やりたいことは、ルールが適用されたメールの件名と受信日時をリマインダーのタイトルにできたら十分で、こちらの投稿にあるスクリプトよりも、もう少し簡単なのかな?と思ったりしながらいろいろやっていますが全く理解できませんでした。(ルールを適用すると、なぜか新着メールの音が鳴る)
ルールが適用された時にリマインダーに登録されるだけでも十分なのですが、アドバイスいただけませんでしょうか…?厚かましく恐縮ですが、よろしくお願いいたします。
こんにちは。
この記事に載せたコードではメールの本文しか扱っていませんでしたね。
メールの本文は
message.content()
で取得しますが、件名はmessage.subject()
で、受信日時はmessage.dateReceived()
で取得できます。件名は文字列、受信日時はJavaScriptのDateオブジェクトとして得られるようです。ですので、例えば、「処理対象のメールについて、件名をタイトルとし、期限が受信から6時間後、通知が受信から3時間後となるようなリマインダーを作る」というスクリプトは次のようになります。
(「受信からn時間後」の部分はコード中の数値を適当にいじれば変えられます)
ちなみに、「Java」と「JavaScript」は全くの別物なのでご注意ください(メロンとメロンパンくらい違います)。