メールの件名に日付を入れる必要が出てきたため、Thunderbirdでアドオンを作ってみたときのメモを残しておきます。
環境
- Windows7 x64 SP1
- Thunderbird Portable 24.4.0
- Thunderbird Portableのパス:D:\ThunderbirdPortable
- アドオン名: thunderbird-subject-rule
仕様
- 新規作成or返信などでメールを作成する際、件名欄にアイコンを表示
- アイコンをクリックし、「設定」ボタンを押すことで、動作
- 新規作成時は、件名の頭に日付を設定
- 返信時は、「Re: 」を取り除いた上で、日付があれば上書きし、日付がなければ追加
- 転送時は、日付を先頭に追加
拡張の置き場所の用意
D:\ThunderbirdPortable\Data\profile\extensions フォルダの配下に
- 実際のソースコードが入ったディレクトリを用意
- ポインタファイルを作成し、そのファイル内へ拡張が実際にあるファイルパスを指定
などの方法で置き場所を用意します。
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"); }
以上で、望みの動作をするアドオンを作ることができました。