« 2010年05月 | メイン | 2011年07月 »

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が本家からリリースされましたので、ファイルは削除しました。
本家からダウンロードされるようお願いします。


2010/07/08
続・サーバメンテナンスのお知らせ(完了しました)

サーバのメンテナンス、というか移設が終わったようです。
PHPのバージョンが4から強制的に5に変わるわ、.htaccessが使えなくなるわで
いろいろトラブルもありましたが、ひとまずブログもリマインダーも動くようになったようです。
先ほどまでPHPがSafeModeで動いていて、メールの送信が出来ていなかったようです。
おそらく7/7 14:00ごろ~7/8 1:00ごろのリマインダーが働いていないと思われます。
ご迷惑おかけしました。
先ほどテストしたところ、正常にメールが送れるようになっていましたので、もう大丈夫だと思います。
なにかお気づきの点がありましたら、info@easy-small-world.comまでご連絡ください。


2010/07/06
サーバーメンテナンスのお知らせ

このブログと、EasyReminderを運用しているレンタルサーバーの移設に伴い、一時EasyReminderが利用できなくなる可能性があります。
移設の完了後にこちらでいろいろ作業が発生するようで、もしかしたらちょっとの間利用できない日が続くかもしれません。
なるべく早く対応するつもりですのでご理解とご協力お願いいたします。

メンテナンス予定日時:
7/7(水) 9:00~18:00