メイン

2010/07/15
Thunderbirdのアドレス送信前確認プラグイン Confirm-Address のバグを勝手にFixしてみる。

注意:現在、このエントリーで書いた不具合は解消されています。 こちらから最新バージョンをダウンロードされることをおすすめします。


Thunderbirdのプラグインで、メールを送信する前に送信先を確認することができる、
Confirm-Addressというのがあるのですが、Thunderbird2で使っていたときは何も問題なく使えていたのが、Thunderbird3になっていくつか不具合があり、対応されるのを待っていたのですが、半年以上放置されているようなので、それならばと自分で不具合を修正してみました。

Thunderbirdのプラグインは全く作ったことがなかったのですが、xpiファイルがただのzipファイルらしいことと、動作の制御部分は全部javascriptで書かれてあるらしいということがドキュメントを読んでわかったので、ちゃちゃっと挑戦してみました。

※なお、以下の方法でご自分の環境に適用される場合は自己責任でお願いします。
 万が一Thunderbirdが壊れてしまっても責任は負えません。(ないとは思いますが)

■xpiファイルを解凍する

上に書いたように、xpiファイルはただのzipファイルなので、ダウンロードしたconfirm-address-1.2.3-tb.xpiを 適当なファイル圧縮・解凍ソフトで解凍します。 すると、以下のファイルとフォルダが現れます。

chrome
lisense
chrome.manifest
install.rdf

chromeフォルダの下にプラグインを制御するための各種UIのファイルとJavaScriptのファイルがあります。

■組織内へのメールに全部チェックを入れるチェックボックスが効かない不具合の修正

chromeフォルダの下のconfirm-address-dialog.jsの109行目を修正します。

修正前:
var isCheck = !checkAll.checked;

修正後:
var isCheck = checkAll.checked;

チェックボックスのonClickイベントを拾って、チェックされているかを取得しているようなのですが、クリックしたことによってチェック状態が反転しているため、元のコードだと、逆になってしまい、うまく動いていなかったようです。

■Ctrl + Enter でメールを送信しようとした場合に、メールが送信されない不具合を修正

chromeフォルダの下のconfirm-address-overlay.jsを修正します。 普段、Ctrl + Enterのショートカットキーでメールを送信していたので、このショートカットキーが使えないのは結構なストレスでした。

ここでは、既存のメール送信制御をオーバーライドしているようなのですが、Thunderbird2から3に変わったときにここの実装が変わってしまったようで、新しい実装が取り込めていないようなので、オーバーライド元のソースから実装をコピペしました。
confirm-address-overlay.jsのソースを全部載せます。

//overlay
//C:\Program Files\Mozilla Thunderbird\chrome\messenger\content\messenger\messengercompose\MsgComposeCommands.js
function SendMessage()
{
	//add start
	if(!ConfirmAddress.checkAddress()){
		return;
	}
	//add end
/* //ここをコメントアウト
  dump("SendMessage from XUL\n");
  GenericSendMessage(nsIMsgCompDeliverMode.Now);
*/
  //ここから下を追加
  let sendInBackground =
    Components.classes["@mozilla.org/preferences-service;1"]
              .getService(Components.interfaces.nsIPrefBranch)
              .getBoolPref("mailnews.sendInBackground");

GenericSendMessage(sendInBackground ?
nsIMsgCompDeliverMode.Background :
nsIMsgCompDeliverMode.Now);
//追加ここまで
}

//overlay
//C:\Program Files\Mozilla Thunderbird\chrome\messenger\content\messenger\messengercompose\MsgComposeCommands.js
function SendMessageWithCheck()
{
//add start
if(!ConfirmAddress.checkAddress()){
return;
}
//add end
/* //ここをコメントアウト
var warn = sPrefs.getBoolPref("mail.warn_on_send_accel_key");

if (warn) {
var checkValue = {value:false};
var buttonPressed = gPromptService.confirmEx(window,
sComposeMsgsBundle.getString('sendMessageCheckWindowTitle'),
sComposeMsgsBundle.getString('sendMessageCheckLabel'),
(gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) +
(gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1),
sComposeMsgsBundle.getString('sendMessageCheckSendButtonLabel'),
null, null,
sComposeMsgsBundle.getString('CheckMsg'),
checkValue);
if (buttonPressed != 0) {
return;
}
if (checkValue.value) {
sPrefs.setBoolPref("mail.warn_on_send_accel_key", false);
}
}

GenericSendMessage(gIsOffline ? nsIMsgCompDeliverMode.Later
: nsIMsgCompDeliverMode.Now);
*/
//ここから追加
var warn = getPref("mail.warn_on_send_accel_key");

if (warn) {
var checkValue = {value:false};
var bundle = document.getElementById("bundle_composeMsgs");
var buttonPressed = gPromptService.confirmEx(window,
bundle.getString('sendMessageCheckWindowTitle'),
bundle.getString('sendMessageCheckLabel'),
(gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) +
(gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1),
bundle.getString('sendMessageCheckSendButtonLabel'),
null, null,
bundle.getString('CheckMsg'),
checkValue);
if (buttonPressed != 0) {
return;
}
if (checkValue.value) {
var branch = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);

branch.setBoolPref("mail.warn_on_send_accel_key", false);
}
}

let sendInBackground =
Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch)
.getBoolPref("mailnews.sendInBackground");

GenericSendMessage(gIsOffline ? nsIMsgCompDeliverMode.Later :
(sendInBackground ?
nsIMsgCompDeliverMode.Background :
nsIMsgCompDeliverMode.Now));
//追加ここまで
}


■ついでにThunderbird3.1でも使えるようにする


最初に解凍して出てきた、install.rdfを修正します。

Confirm-Addressプラグインは3.0までの対応だったので、3.1でも使えるように互換情報を書き換えました。
互換情報を書き換えただけで、3.1に合わせてプログラムを変更したわけではないので、使えない可能性もありますが、今のところうまく動いているので良しとします。

13行目の、em:maxVersionのタグの3.0.*の部分を、3.1.*に変更します。

修正前:
<em:maxVersion>3.0.*</em:maxVersion>

修正後:
<em:maxVersion>3.1.*</em:maxVersion>


また、このプラグインのバージョンが1.2.3の改造版であることがわかるようにするため、
7行目の、em:versionのタグの1.2.3の部分を、1.2.3-altとしました。

修正前:
<em:version>1.2.3</em:version>

修正後:
<em:version>1.2.3-alt</em:version>


最後にもういちどzipファイルに圧縮する


プラグインの改造はこれで終了です。
修正したファイルをプラグインとして使用できるように、もう一度zipファイルに圧縮しなおします。
フォルダを作らずに、最初に解凍された構成のまま圧縮されるように注意してください。
圧縮ファイルをリネームして、confirm-address-1.2.3-alt-tb.xpiとでもすれば完成です。


confirm-address-1.2.3-alt-tb.xpi
配布してしまって良いものか若干迷いましたが、とりあえずファイルを置いておきます。
不適切な場合はinfo@easy-small-world.comまでご連絡ください。

不具合対応版のVersion1.2.4が本家からリリースされましたので、ファイルは削除しました。
本家からダウンロードされるようお願いします。


2008/01/20
夢をかなえるゾウ TVドラマ化決定!

「ウケる技術」の水野敬也さんの最新作? 夢をかなえるゾウ が30万部を突破してTVドラマ化決定したようですね。
最近本屋に行った時に、去年出た本なのにランキング1位で売り出されてて、
変だな(というかすごいな)と思って帯を見てみると、TVドラマ化決定の文字が。
まだ詳しいことは決まってなさげな感じですね。

http://yumezou.jp/index.html

この本は、idea*ideaでプレゼント付き書評をやってて知ったんですが、
プレゼントは外れてしまって自分ですぐに買って読んだんです。
間違いなく2007年に読んだ本の中で一番自分のモチベーションを回復させられた本でした。
書評のほうは僕のへたな文章より、百式田口さんのほうが100倍すばらしいので、リンクだけして割愛(笑) 

http://www.ideaxidea.com/archives/2007/08/post_234.html

とにかくおすすめです。


2007/03/08
危なかった・・・

しばらく、というかかなりの間放置してしまいました。。

EasyReminderをリリースしてから、リマインダー自体は使っていたのですが、
このブログを忘れ去っていました(^^;

そして、油断してるとうっかりドメインの契約更新を忘れてて、1日だけですが、
サイトが利用不能な状態になってしまいました。

EasyReminderの利用者の皆様にはご心配をおかけしました。すみませんm(__)m
ブログのほうは、これからも更新はぼちぼちで。
なにか有益な情報発信ができれば良いのですけど。