メールの件名に日付を入れるThunderbirdアドオンを作ってみた

メールの件名に日付を入れる必要が出てきたため、Thunderbirdでアドオンを作ってみたときのメモを残しておきます。

環境

仕様

  • 新規作成or返信などでメールを作成する際、件名欄にアイコンを表示
  • アイコンをクリックし、「設定」ボタンを押すことで、動作
  • 新規作成時は、件名の頭に日付を設定
  • 返信時は、「Re: 」を取り除いた上で、日付があれば上書きし、日付がなければ追加
  • 転送時は、日付を先頭に追加

動作のサンプル

1. 件名欄にアイコンを表示


2. アイコンをクリック


3. 件名に日付が追加される


拡張の置き場所の用意

D:\ThunderbirdPortable\Data\profile\extensions フォルダの配下に

  1. 実際のソースコードが入ったディレクトリを用意
  2. ポインタファイルを作成し、そのファイル内へ拡張が実際にあるファイルパスを指定

などの方法で置き場所を用意します。
Building a Thunderbird extension 7: Installation - Mozilla | MDN


自分の場合はポータブル版ということもあり、上記1.を採用することにして、extensionsに以下の構造のディレクトリ・ファイルを追加しました。

.\ThunderbirdPortable\Data\profile\extensions
`--thunderbird-subject-rule@thinkami.hatenablog.com
   |--content
   |  |--img
   |  |  `--shinanogold.png
   |  |--overlay.js
   |  |--overlay.xul
   |  |--addon.css
   |  `--addon.xml
   |--chrome.manifest
   `--install.rdf

各種ファイルの編集

以下の記事が参考になりました。ありがとうございました。
Thunderbird の拡張機能(アドオン)を作ってみた - mallowlabsの備忘録


また、ソースコードGitHubに上げておきました。
thinkAmi/thunderbird-subject-rule · GitHub



install.rdf

拡張機能の情報を記載します。

<?xml version="1.0"?>

<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:em="http://www.mozilla.org/2004/em-rdf#">

  <Description about="urn:mozilla:install-manifest">
    <!-- em:idには拡張の含まれるディレクトリと同じ名称をつける -->
    <em:id>thunderbird-subject-rule@thinkami.hatenablog.com</em:id>
    <em:type>2</em:type>
    <!-- 拡張の名前を記載 -->
    <em:name>thunderbird-subject-rule</em:name>
    <em:version>1.0</em:version>
    <em:description>「メールの件名の先頭に日付をつける」ボタンを件名欄に追加し、ルールを適用する</em:description>
    <em:creator>thinkAmi</em:creator>
    <em:homepageURL>https://github.com/thinkAmi/thunderbird-subject-rule</em:homepageURL>
    <em:targetApplication>
      <!-- Thunderbird -->
      <!-- See: https://addons.mozilla.org/en-US/firefox/pages/appversions/ -->
      <Description>
        <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
        <em:minVersion>2.0b1</em:minVersion>
        <em:maxVersion>32.0</em:maxVersion>
      </Description>
    </em:targetApplication>
  </Description>

</RDF>

なお、ファイル内で指定するThunderbirdのIDとmaxVersionは、以下に記載されています。
Application Versions :: Add-ons for Firefox



chrome.manifest の編集

オーバーレイする内容などを記載します。
なお、参考記事と同じくメールの件名をオーバーレイするため、オーバーレイする対象のxulも同じにしておきました。

content  thunderbird-subject-rule  content/
overlay  chrome://messenger/content/messengercompose/messengercompose.xul  chrome://thunderbird-subject-rule/content/overlay.xul
XULドキュメント(content\overlay.xul) の編集

実際の動作を記載します。なお、スクリプトの量が増えたので、実際の動作内容はjsファイルに切り出しました。

<?xml version="1.0"?>

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

  <textbox id="msgSubject">
    <!-- idのスタイルは、addon.cssにて指定できる -->
    <!-- styleで、xml内のどのbindingを使うかを指定 -->
    <button popup="_child"
     type="menu"
     id="addon-button"
     style="-moz-binding: url('chrome://thunderbird-subject-rule/content/addon.xml#addonBinding');">
      <menupopup>
        <!-- スクリプトの量が増えたので、別のjsファイルを指定しておく -->
        <script src="chrome://thunderbird-subject-rule/content/overlay.js"/>
        <!-- oncommandにて、ボタンを押した時に起動するjs内のfunctionを指定する -->
        <menuitem label="設定" accesskey="R" oncommand="addonCommand(this);"/>
      </menupopup>
    </button>
  </textbox>
</overlay>
overlay.js

実際の挙動を記載します。

function addonCommand(event) {
    var msgSubject = document.getElementById("msgSubject");

    var subject = trimSubject(msgSubject.value);
    msgSubject.value = editSubject(subject);

    // ラベルを使う場合には、以下のように記載する
    //msgSubject.value = event.label + ":" + msgSubject.value;
    msgSubject.focus();

    // メール作成画面に、件名が変更されたことを通知する
    gContentChanged=true;
    SetComposeWindowTitle();
}


// Subjectから不要な文字列を削除する
function trimSubject(subject){
    if (subject.substr(0,4) == "Re: ") {
        return subject.substr(4);
    }

    return subject;
}


// Subjectを編集する
function editSubject(subject){

    var date = new Date();
    var yy = String(date.getFullYear()).substr(2,2);
    var mail_subject_rule = yy + padZero((date.getMonth()+1)) + padZero(date.getDate()) + "_";


    // 新規作成
    if (subject == "") {
        return mail_subject_rule;
    }

    // すでにルールが適用されているSubject
    oldPart = subject.substr(0,7);
    if (oldPart.match(new RegExp("[0-9]{6}_", "i"))) {
        return mail_subject_rule + subject.substr(7);
    }

    // 上記以外の場合は、適用する
    return mail_subject_rule + subject;
}



// targetが一桁の場合、先頭にゼロを一つパディングする
function padZero(target){
    if(target < 10){
        return "0" + target;
    }
    else{
        return "" + target;
    }
}
addon.xml

それぞれのファイル間の関連を知るため、idなどを変更してありますが、ほとんど元記事通りです。

<?xml version="1.0"?>
<bindings id="addonBindings"
   xmlns="http://www.mozilla.org/xbl"
   xmlns:html="http://www.w3.org/1999/xhtml"
   xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:xbl="http://www.mozilla.org/xbl">

  <binding id="addonBinding">
    <resources>
      <stylesheet src="chrome://thunderbird-subject-rule/content/addon.css"/>
    </resources>
    <content popup="_child">
      <children/>
      <xul:stack flex="1">
        <xul:hbox align="center">
          <!-- ボタンのスタイルを指定 -->
          <xul:image class="addon-button-image" xbl:inherits="src"/>
        </xul:hbox>
        <xul:hbox align="center">
          <!-- 押せるボタンと分かるよう、もう一つスタイルを指定 -->
          <xul:image class="addon-button-dropmarker"/>
        </xul:hbox>
      </xul:stack>
    </content>  
  </binding>

</bindings>
addon.css

こちらもほぼ元記事通りです。

#addon-button  {
  margin-top: 0px;
  margin-bottom: 0px;
  -moz-margin-start: 0px;
  -moz-margin-end: 2px;
  cursor: default;
}
.addon-button-image {
  margin: 0px;
  /* 自分で用意したボタンの画像を指定 */
  list-style-image: url("chrome://thunderbird-subject-rule/content/img/shinanogold.png");
}
.addon-button-dropmarker {
  /* ボタンの画像が大きいので、先頭からのマージンを広めに取っておく */
  -moz-margin-start: 45px;
  margin-top: 5px;
  /* 標準で用意されているっぽい下向きのボタンの画像を指定 */
  list-style-image: url("chrome://messenger/skin/icons/search-arrow.gif");
}


以上で、望みの動作をするアドオンを作ることができました。