LoginSignup
1
0

More than 1 year has passed since last update.

Automatorを使ってMail.appからJSON形式で情報を取り出す

Last updated at Posted at 2022-07-30

(2022.7.31) 追記あり

Automatorを使って、AppleScriptでMail.appアプリから選択されている情報を取り出し、JavaScriptでJSONに変換した後に、他のスクリプト言語(ここではRuby)でファイルに書き出しています。

ワークフローの作成

全体の構成

widow.png

作成方法

  • Automatorを起動し、新規にワークフローを作成します。
  • 一番上にアクション「AppleScriptを実行」を追加します。

以下のスクリプトを書き込みます。

on run {input, parameters}
	tell application "Mail"
		set theSelected to selection
		set theList to {}
		repeat with theMessage in theSelected
			set end of theList to {mail_subject:subject of theMessage, mail_sender:sender of theMessage}
		end repeat
		return theList
	end tell
end run

ここではMail.appで選択したメッセージ(複数でも可)を取り出し、その中の題名と送信人の情報を取得しています。本文や受信日時など必要な情報を追加することもできます。
{mail_subject:subject of message1, mail_sender:sender of message1}
でレコードを作成し、そのリストを次のアクション(JavaScript)に渡します。

(注 レコードのキーを最初はsubjectとsenderとしていましたが、何かの使われている名前と重なるようで、JavaScriptに渡したときにキーが変更されてしまいました。それを避けるためにmail_subject、 mail_senderとしました)

AppleScriptのコマンドの使い方はユーティリティフォルダの中にある「スクリプトエディタ.app」の「用語説明を開く」で調べることができます。

  • 次にアクション「JavaScriptを実行」を追加します。
function run(input, parameters) {
	return JSON.stringify(input);
}

単純にJSONに変換するだけのアクションです。AppleScriptのレコードとリストは、相当するJavaScriptの連想配列と配列に自動的に変換されます。
(逆のJavaScriptからAppleScriptも自動変換されます)
この自動変換はマニュアル化されているかわかりませんでしたので、たまたまこのような機能があるだけかも知れませんので注意してださい。

JSONに変換するのではなく、ここにスクリプトを書いて必要な情報を書き出すこともできます。

  • 最後に、アクション「シェルスクリプトを実行」を追加します。JSON形式のデータを読み込み、必要な情報をファイルに書き出しています。
require "json"
open("mail_list.txt", "a") do |fo|
	ARGF.each do |f|
		JSON.load(f).each do |message|
			fo.puts "#{message['mail_subject']}\t#{message['mail_sender']}"
		end
	end
end

(以下 2022.7.31 追記)

クイックアクションへ変換

Automatorのメニュー ファイル -> 変換... でクイックアクションを選ぶと、Mail.appのサービスメニューから実行できるようになります。

クイックアクション.png

検索対象をメール.appに変更しておきます。(この時起動しているアプリしか選べません)

作成したクイックアクションは ~/Library/Services/ に保存されます。
ショートカットは、システム環境設定のキーボートを開き、その中の ショートカット で設定できます。

AppleScript部分をJavaScriptで書き換え

上のAppleScript+JavaScriptの部分を、JavaScriptだけで書くと次のようになります。

function run(input, parameters) {
	let app = Application("Mail");
	let theSelected = app.selection();
	let theList = theSelected.map(theMessage => 
		({mail_subject: theMessage.subject(), mail_sender: theMessage.sender()})
	);
	return JSON.stringify(theList);
}

MacOS 12.5
MacBook Air (Retina, 13-inch, 2019) Inter CPU

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0