Macの受信メールから自動でリマインダーを作成する

何日までに○○しなさいというメールが届いた!けどほったらかしておいたら期限を過ぎていた!そういう経験、あるよね?

library-mailそこで、そういうメールが届いたら自動でMacの「リマインダー」に登録されるようにしよう!という話。

おおまかな流れとしては、

  1. Mail.appの「ルール」機能を使って、特定の条件に当てはまるメールを受信した時に「AppleScript を実行」する。
  2. そのAppleScriptで、メールの本文から期限日時とかを抽出して、リマインダー.appに登録する。

とする。

「AppleScript」と書いたが、最近のMac(10.10 Yosemite以降)ではJavaScript for Automation (JXA)というのが導入された。これを使うと、AppleScriptとかいう謎言語を習得しなくても、プログラマーなら誰でも触れたことがあるだろうJavaScriptを使ってMacの操作を自動化(オートメート)できる(もちろん、JavaScriptを使えば「文法」は新たに覚える必要はないが、JXAのオブジェクトやメソッドなど、「語彙」は勉強したり調べたりするる必要がある)。このJXAで作ったスクリプトはもちろんMail.appの「ルール」でも使える。

AppleScriptやJXAのスクリプトを書くには、OS X標準のスクリプトエディタを使う。「アプリケーション」フォルダの「ユーティリティ」(Launchpadでは「その他」に入っていた)の中から起動しよう。

まずは、スクリプトの書き方。JXAはまだ歴史が浅いせいか、そこまで資料は充実していない印象を持った。とりあえずAppleが出してるリリースノートのリンクを貼っておく。

対象となるアプリケーション側の仕様は、スクリプトエディタから調べられる。まずはメニューの「ウインドウ」から「ライブラリ」を辿ると、アプリケーション一覧が載った「ライブラリ」ウインドウが出てくる。

script-editor-library

そこで「メール」を押せば、Mail.appのオブジェクトとかメソッド一覧が参照できる。ツールバーの「言語」で、スクリプト言語を切り替えられる。今回はJavaScriptで書きたいので「JavaScript」を選ぶ。そうすると、メソッド名とかがJavaScript用になる。

script-editor-library-mail

Mail.appの「ルール」で発動する処理を書きたいときには、スクリプトファイル中で performMailActionWithMessages という名前の関数を定義してやる。ルールの対象となるメッセージは、関数の引数に、配列として渡される。

あとは、ググって得たコード例とかも参考にしながら、ちょろちょろとスクリプトを書いてやれば良い。メール本文の返却期限日を抽出するのにはJavaScriptの正規表現を使う。

スクリプトの保存先は、Mail.appの環境設定→「ルール」で適当にルールを作ってやって、「以下の操作を実行:」→「AppleScript を実行」→「Finder で開く」とするとその場所が開ける。自分の環境だと ホーム/Library/Application Scripts/com.apple.mail だった。

テストするには、Mail.appのルールを作った上で、実際に受信したメールに対して「ルールを適用」してやればよい。リマインダーの登録リスト(上のスクリプトだと「本の返却」)はあらかじめ作っておく必要がある。

本の返却日ぐらいメールを見て覚えておけよ、と思うかもしれないが、こういう自動化(オートメーション)のスキルは知っておいて損はないだろう。

参考にしたページとか:


Macの受信メールから自動でリマインダーを作成する」への2件のフィードバック

  1. 平田

    こんにちは。突然すみません。
    MacのMailから自動でリマインダーへ追加させたくてググっていたら辿り着きました。
    Javaなど、全くの初心者で少し調べながらやってみたのですが、うまくいきません。

    今やりたいことは、ルールが適用されたメールの件名と受信日時をリマインダーのタイトルにできたら十分で、こちらの投稿にあるスクリプトよりも、もう少し簡単なのかな?と思ったりしながらいろいろやっていますが全く理解できませんでした。(ルールを適用すると、なぜか新着メールの音が鳴る)
    ルールが適用された時にリマインダーに登録されるだけでも十分なのですが、アドバイスいただけませんでしょうか…?厚かましく恐縮ですが、よろしくお願いいたします。

    返信
    1. mod_poppo 投稿作成者

      こんにちは。

      この記事に載せたコードではメールの本文しか扱っていませんでしたね。

      メールの本文は message.content() で取得しますが、件名は message.subject() で、受信日時は message.dateReceived() で取得できます。件名は文字列、受信日時はJavaScriptのDateオブジェクトとして得られるようです。

      ですので、例えば、「処理対象のメールについて、件名をタイトルとし、期限が受信から6時間後、通知が受信から3時間後となるようなリマインダーを作る」というスクリプトは次のようになります。

      var Reminders = Application("Reminders");
      
      function performMailActionWithMessages(messages)
      {
          messages.forEach(function (message) {
              var subject = message.subject(); // string
              var dateReceived = message.dateReceived(); // Date
              var remindMeDate = new Date(dateReceived.getTime() + 3 /* hours */ * 60 * 60 * 1000 /* in milliseconds */);
              var dueDate = new Date(dateReceived.getTime() + 6 /* hours */ * 60 * 60 * 1000 /* in milliseconds */);
              var entry = Reminders.Reminder({
                  name: subject,
                /*body: ...,*/
                  remindMeDate: remindMeDate,
                  dueDate: dueDate
              });
              Reminders.lists["受信メール"].reminders.push(entry);
          });
      }
      

      (「受信からn時間後」の部分はコード中の数値を適当にいじれば変えられます)

      ちなみに、「Java」と「JavaScript」は全くの別物なのでご注意ください(メロンとメロンパンくらい違います)。

      返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です