HOME Tech Memo FastCopy IP Messenger

Thunderbird カスタマイズ・メモ

リスト 白水啓章
作成 2024/04/12

概要

メーラThunderbird (115.9.0) のカスタマイズいくつか(Windows用)

1. userChrome.css を使ったカスタマイズ

・スレッドのSubject字下げを固定するカスタマイズ例。
(=同一スレッド・メールが多い時、Subject字下げが異様に深くなるのを防ぐ)

1.C:/Users/[user等]/AppData/Roaming/Thunderbird/Profiles/[xxx.default等]/chrome/userChrome.css を作成。

2.内容を設定(要Thunderbird再起動)

tr[is="thread-row"] .subject-line { /* ネスト深さを一定に */
    margin-inline-start: calc(20px * min(var(--thread-level), 1)) !important;
}

2. userChrome.js を使ったカスタマイズ

・新着メールがスレッドに隠れないようにするカスタマイズ例。

1.Thunderbirdインストールフォルダ下に、下記 config.js をコピー
 https://github.com/alice0775/userChrome.js/blob/master/117/install_folder/config.js

2.Thunderbirdインストールフォルダ/defaults/pref/下に、下記 config-prefs.js をコピー
 https://github.com/alice0775/userChrome.js/blob/master/117/install_folder/defaults/pref/config-prefs.js

3.C:/Users/[user等]/AppData/Roaming/Thunderbird/Profiles/[xxx.default等]/chrome/userChrome.js を作成。

4.内容を設定(要Thunderbird再起動)

(function () {
  if (location == "chrome://messenger/content/messenger.xhtml") {
    // 新着メールでもスレッドを開くように
    try {
      var mailListener = {
        msgAdded: function(msgHdr) {
          if (!msgHdr.isRead) {
            expandThread(msgHdr);
          }
        }
      };
      var notificationService = Components.classes["@mozilla.org/messenger/msgnotificationservice;1"]
                                          .getService(Components.interfaces.nsIMsgFolderNotificationService);
      notificationService.addListener(mailListener, notificationService.msgAdded);

      function expandThread(msgHdr) {
        let refSet = new Set();
        for (let i=0; i < msgHdr.numReferences; i++) {
          refSet.add(msgHdr.getStringReference(i));
        }

        let br = document.getElementById("mail3PaneTabBrowser1");
        let dbView = br.contentDocument.getElementById("threadTree").view;

        for (let i = 0; i < dbView.rowCount && i < 30; i++) { // 最大でも30行で探索打ち切り
          let thHdr = dbView.getMsgHdrAt(i);
          if (refSet.has(thHdr.messageId) && dbView.isContainer(i) && !dbView.isContainerOpen(i)) {
            dbView.toggleOpenState(i);
            break;
          }
        }
      }
    } catch (aError) {
      Components.utils.reportError(aError);
    }
  }
})();

3. その他

・JS開発中は良くエラーが出るので、Ctrl + Shift + I で、デバッガを開いてコンソールを眺めると良いかも。
・上記デバッガで、左端の矢印マーク(ページから要素を選択)で、DOMのidを取得するのも良く使うかも。
 (DOM経路に、mail3PaneTabBrowser1等の browserタグが介入している場合の対処は上記jsの通り)
・userChrome.js について、userChromeJSというアドオンを入れれば、1&2の手順は不要に。
 参考)https://ohaohaoha.cocolog-nifty.com/blog/2023/07/post-9576a1.html

Thunderbird周りは、あまり慣れないジャンルなので、見当違いがあるかも。
(その場合は Twitter の @shirouzu まで、ご一報ください)