秋といえば……田舎育ちなもので、アケビやトンボを連想してしまいます。そしてもうひとつ、ここ数年楽しみにしているのが「キウイフルーツ」。実家の土地に適当に植えたところ、順調すぎるくらい育ってしまい、毎年数百個は収穫できるようになりました。そのキウイに欠かせないのが、実は「リンゴ」。リンゴから放出されるエチレンガスが、キウイを追熟してくれるのですよ。このコラムとはリンゴつながりということで。
さて、今回は「Mailのアドレス自動補完機能」について。もっぱらサードパーティ製品を利用している、連絡にはFacebookやTwitterを使うので興味なし、というユーザも少なくないとは思うが、なにぶんOS標準のメーラーのこと、利用する機会は多い。そのMailが誇る便利機能のカユい部分に手を伸ばそう、というのが今回の趣旨だ。
「アドレス自動補完機能」の基本ワザ
Mail(以下、混乱を避けるため「Mail.app」)には、受信したメールのヘッダー部分を自動的に解析し、送信者名やメールアドレスなどの情報をデータベースに保管している。OS X TigerでCore Dataフレームワークが導入されてからの進化であり、その結果我々ユーザはさまざまなメリットを得ている。一度でもメッセージをやり取りしたことのある人物の名前の先頭部分を新規メッセージの「宛先」欄に入力すると、メールアドレスを含めて補完してくれる「アドレス自動補完機能」は、その一例だ。
この機能、環境設定パネルの「作成」タブにある「完全なアドレスを自動的に入力」チェックボックスでON/OFFできる。名前やメールアドレスは編集できないが、ツールバーから「ウインドウ」→「宛先の履歴」を選択すると現れるウィンドウを使えば、検索/削除は可能だ。
補完候補の中身を確認
入力補完に利用されるデータは、直接はAddressBookフレームワーク(Core Dataに依存)の機能で作成されている。Mail.app専用であるにもかかわらず、データベースが「~/Library/Application Support/AddressBook」ディレクトリに存在するのは、それが理由と考えられる。
Core Dataフレームワークには基本技術としてSQLiteが採用されているため、データベースもSQLiteと同じフォーマットだ(参考:「OS X ハッキング! 236回 SQLiteが広げるこれからのアプリケーション」)。ファイル名は「MailRecents-v4.abcdmr」、これをsqlite3コマンドで開けば、その内容を確認できる。
$ sqlite3 MailRecents-v4.abcdmr
SQLite version 3.7.5
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
データベースにあるデータの集合(テーブル)は、内部コマンド「.tables」で確認できる。4つ表示されるテーブルのうち「ZABCDMAILRECENT」が、入力補完に使用されるデータの実体だ。詳しく述べようとするとSQL言語の話になるため、ざっくりとした説明となるが、さらに「.schema」を実行すると、各テーブルがどのようなカラムとデータ型で構成されているかがわかる。
表示されたデータのうち注目してほしいのが、「ZEMAIL」や「ZFIRSTNAME」などテキスト型のカラムだ。結論からいうと、このカラムのうちいくつかを指定してZABCDMAILRECENTテーブルの内容を表示すれば、入力補完に使われるデータを一覧できる。
sqlite> select ZFIRSTNAME,ZLASTNAME,ZEMAIL from ZABCDMAILRECENT;
忍|海上|nantokakantoka@me.com
健一|噂野|kenichi@shiranai.jp
よう子|藤田|youko@dokoka.jp
哲也|藤本|tetsuya@wakaran.com
補完候補を編集する
補完候補を一覧できたところで、本題の「編集」に話を進めよう。補完候補の一覧と削除ならば、Mail.appに備え付けの「宛先の履歴」ウインドウで実行できるが、名前やアドレスの編集には対応していない。それが、sqlite3コマンドを使えば、自由に編集できるようになるのだ。
まずは編集対象の特定から。先ほど例示した「select」コマンドの末尾に「where XXXX like '~'」という条件を加えればいいのだ。ワイルドカード「%」も使用できるので、絞り込みもかんたんだ。たとえば、ドメイン名が「hoge.jp」のアドレスの場合、「where ZEMAIL like '%hoge.jp'」とすればOK。姓名のうち「姓」に「藤」の字を含むアドレスを対象にする場合は、「where ZLASTNAME like '%藤%'」とすればいい。
sqlite> select ZFIRSTNAME,ZLASTNAME,ZEMAIL from ZABCDMAILRECENT where ZLASTNAME like '%藤%';
よう子|藤田|youko@dokoka.jp
哲也|須藤|tetsuya@wakaran.com
sqlite> select ZFIRSTNAME,ZLASTNAME,ZEMAIL from ZABCDMAILRECENT where ZLASTNAME like '藤%';
よう子|藤田|youko@dokoka.jp
最終的に1件のアドレスを特定できるようになれば、いよいよ編集だ。編集には内部コマンド「update」を利用し、「update テーブル名 set カラム名 = 値 where 条件;」が基本的な用法となる。たとえば、前述の例で名(ZFIRSTNAME)が「よう子」だったものを「陽子」に変更するには、以下のとおり実行すればOK。もういちどselectコマンドを実行して変更を確認し、「.quit」を実行してsqlite3コマンドを終了しよう。
sqlite> update ZABCDMAILRECENT set ZFIRSTNAME = '陽子' where ZLASTNAME like '藤%';
sqlite> select ZFIRSTNAME,ZLASTNAME,ZEMAIL from ZABCDMAILRECENT where ZLASTNAME like '藤%';
陽子|藤田|youko@dokoka.jp
sqlite> .quit