| はじめに †前からThunderbirdのアドオンを作ってみたくてしょうがありませんでした。 この年齢になると毎日のメール数が大変なことになります。 自分なりにいろいろと工夫してきたのですが、もっと効率的にできないかなぁと考えるとどうしてもやはり自分独自のアドオンを作りたくなってきます。 JavaScriptで作れるという噂はかねてから聞いていたので簡単に作れるのではないかなと。 そんなわけで作ったのが「Send Counter」です。
c:\data\log\YYYYMMDD.logにその日に送信したメール数を記録していくやつです。
試してみたい人は ファイル構成 †xpiをzipにして解凍すれば分かりますが、以下のようなファイル構成になっています。 ./chrome.manifest ./content ./content/composer.js ./content/messengercompose.xul ./install.rdf 重要なのはcomposer.jsです。 メールを送信するイベントにHookしてファイルからこれまでのカウント数を読み込んで++してファイルに書き戻すということをやってます。 あとはまったのはoverlayするのを初心者サイトに書いてあるmessenger.xulではなくmessengercompose.xulじゃないとダメだったというぐらいでしょうか。 messenger.xulはメイン画面のXML、messengercompose.xulはメール編集画面のXMLで、送信イベントをEventListnerを登録するにはメール編集画面をoverlayしなきゃダメでした。 composer.js解説 †window.addEventListener("compose-send-message", sdlab_send_handler, true);
function sdlab_send_handler(evt){
    update_sent_count();
}
↑はメールを送信したタイミングで呼ばれるイベントハンドラを登録しています。 じゃあupdate_sent_count()は何をやってるのかって話なんですが、少しややこしいので説明は省略します。 ファイルの読み出しと書き込みが少し厄介でした。 Components.utils.import("resource://gre/modules/NetUtil.jsm");
Components.utils.import("resource://gre/modules/FileUtils.jsm");
function update_sent_count(){
    var date = new Date();
    var year = date.getFullYear();
    var month = date.getMonth();
    var day = date.getDate();
    var filename = year + ("0" + month).substr(-2)
                 + ("0" + day).substr(-2) + ".log"
    var file = new FileUtils.File("C:\\data\\log\\sentcounter\\" + filename);
    if(file.exists()){
        NetUtil.asyncFetch(file, function(inputStream, status) {
            if (!Components.isSuccessCode(status)){
                // Handle error!
                return;
            }
            var count = NetUtil.readInputStreamToString(inputStream, inputStream.available());
            var ostream = FileUtils.openSafeFileOutputStream(file);
            var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
            converter.charset = "UTF-8";
            count++;
            var istream = converter.convertToInputStream(count);
            NetUtil.asyncCopy(istream, ostream, function(status){
                if (!Components.isSuccessCode(status)){
                    // Handle error!
                    return;
                }
            });
         });
     }else{
         var ostream = FileUtils.openSafeFileOutputStream(file);
         var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
         converter.charset = "UTF-8";
         count = 1;
         var istream = converter.convertToInputStream(count);
         NetUtil.asyncCopy(istream, ostream, function(status){
             if (!Components.isSuccessCode(status)){
                 // Handle error!
                 return;
             }
         });
     }
}
xpiの作り方 †cygwinのzipコマンドを使いました。 フォルダごとやるとxpiに変えてもだめでした。 コマンドは $ zip -r sendcounter.xpi chrome.manifest install.rdf content/ です。 おわりに †ログの保存先のフォルダとか設定できるようにインタフェース作った方が良いとは思うのですが、面倒くさいので変えたい場合は各自でソースをいじって変えてください。 日本語のドキュメントが皆無でいろいろと面倒でしたが、知ってれば結構簡単に作れます。 調べるのにはウェブで検索するよりも、自分のイメージに近いアドオンのソースコードを見た方が早かったです。 アドオンからはXMLHttpRequestとかも呼べるっぽいので夢は広がります。 これを機にメールの処理が捗るアドオンをいろいろ作ってく予定です(あくまでも予定です)。 参考にしたサイト †
 |