Flex Confirm MailとRedmine連携のThunderbird 78対応版をリリースしました - 2020-11-09 - ククログ

ククログ

株式会社クリアコード > ククログ > Flex Confirm MailとRedmine連携のThunderbird 78対応版をリリースしました

Flex Confirm MailとRedmine連携のThunderbird 78対応版をリリースしました

結城です。以前に書いたアドオンのThunderbird 78対応状況についての記事の続報です。

  • メール送信前に宛先等を再確認するアドオンFlex Confirm Mailの、Tb78対応版をリリースしました。

    • ただし、自動更新を通じてインストールされた場合の予期しないトラブルが懸念されることから、現時点ではThunderbird Add-ons Webサイト上では公開していません。

    • 使用するには、GitHub上のリリースページからパッケージをダウンロードして頂く必要があります。

    • 旧バージョン(バージョン1系、バージョン2系)の設定は自動的には引き継がれません。お手数ですが、手動操作での再設定をお願いします。

  • メールとRedmineのチケットを関連付けるアドオンRedThunderMineBird PlusのTb78対応版をリリースしました。

    • こちらはThunderbird Add-onsで公開済みとなっております。

    • フォーク元の「Redmine連携」、およびTb68以前での設定は自動的には引き継がれません。お手数ですが、手動操作での再設定をお願いします。

現在世に出ているThundebrirdアドオンの中で、従来から人気があったアドオンの「Tb78対応版」は、WebExtensions Experimentsという仕組みを使った暫定的な対応に留まっている例が多いのが現状です。この手法はアドオンを比較的小さな工数でTb78に対応させられますが、Tb78の次のメジャーリリース以降でアドオンが動作しなくなるリスクがあります。

それに対し、この度リリースしたこれらのアドオンのTb78対応版は、前回記事で述べた「WebExtensions APIに基づいて全面的に再実装する」手法で一から作り直した物となっています。APIの互換性が保たれる限りにおいては、今後のバージョンのThunderbirdでも安定して使い続けられる事が期待できます。

以下、Tb78用のアドオンを開発される方向けの参考情報として、それぞれのアドオンのTb78対応版開発における技術的な特記事項を簡単に紹介します。

Flex Confirm MailのTb78対応

本アドオンの技術的な特記事項は以下の2点です。

  • メールの送信直前に割り込んで、許可・不許可の判断を非同期に行い、許可が得られなければ送信を中断する。

  • 送信しようとしているメールがどういう文脈に属するかを判断する。

1点目の動作は、Tb78から使用可能となった新APIのcompose.onBeforeSendに依存しています。そのため、WebExtensionsベースのFlex Confirm MailはTb68以前のバージョンでは動作しません。

compose.onBeforeSendは、登録したリスナーが返すwebRequest.BlockingResponseと同形式のオブジェクトによって、処理の継続の可否を指定することができます。このとき、リスナーから通常のObjectを返す代わりにPromiseを返すか、同様の効果を得られる物として非同期関数をリスナーにすると、Promiseが解決されるまで(非同期関数が結果をreturnするまで)送信が待機されます。本アドオンではこの仕様を利用し、非同期関数のリスナー非同期的に開いた独自の確認ダイアログでの確認結果が得られてから結果を返すことで、期待される動作を実現しています。

2点目の特記事項の「文脈」とは、ここでは「新規作成」「返信」「転送」「テンプレートからの作成」「下書きの編集」「既存メールの編集」のうちのどの方法で作成されたメールかという意味です。

本アドオンのように「事前に警告するUI」は、あまりに頻繁に警告されすぎると、そのうち警告を読まずに盲目的に許可するようになってしまうジレンマがあります。その一方で、筆者の経験上は、メールの誤送信が発生しやすい場面は「新規にメールを書いた場合や、手動操作で宛先を記入・変更した場合」であるのに対し、実際の運用上では「受信したメールにそのまま返信し、宛先は編集しない」という、宛先内に無関係のアドレスが混入している可能性が低いケースが大半である、という印象がありました。そのため、本アドオンには「安全である可能性が高いケース=既存メールへの返信で宛先が編集されていない場面では警告を行わないようにする」設定があります。

そのような動作を実現するには「返信かどうか」および「宛先が編集されているかどうか」を判別する必要がありますが、compose.onBeforeSendのリスナーにはそのような情報は渡されません。そのため、何らかの方法でこれらを把握する工夫が必要となります。本アドオンでは、メール編集画面で自動実行されるコンテントスクリプトを登録しておき、その中でメッセージを送出して、そのメッセージを受け取ったタイミングで現在開かれているウィンドウを走査したり、メール編集画面にその時点で入力されている宛先を収集したりすることによって、その後のcompose.onBeforeSendのリスナーで必要な判断を行えるようにしています。

RedThunderMineBird PlusのTb78対応

本アドオンの技術的な特記事項は以下の2点です。

  • メールのスレッドとチケットを関連付けて、その情報を保存する。

  • 受信メールの本文を確実に抽出する。

1点目は、そもそもThunderbirdのWebExtensions APIは存在しない「スレッド」という概念をどのように把握するかと、個々のメールに対する任意のメタ情報の紐付けをどのように保存するかという話です。

従来型のアドオンが参照できるThunderbird内部のAPIには、そのものズバリ「スレッドに対して任意の情報を紐付けて保存する」機能があり、従来はこれによって、スレッドの親のメールがチケットに関連付け済みであれば、返信メールについていちいち「チケットに関連付ける」操作をしなくても良いようになっていました。現時点のWebExtensions APIには相当する機能が無いので、すでにある機能の組み合わせで代替しなくてはいけません。

スレッドは、ヘッダの情報から推測できます。messages.getFull()で得られるmessages.MessagePartを参照すると、headersというプロパティですべての生のヘッダを参照できます。その中のreferencesヘッダにスレッドの祖先のメールの'message-id'ヘッダの値が含まれているので、本アドオンではそれを取得してmessage-idをキーとしてチケットのidをIndexedDBに保存しています。こうしておけば、まだチケットに直接関連付けられていないメールでも、スレッドの祖先のmessage-idに関連付けられたチケットのidを取得できる、という具合です。

2点目の受信メールの本文の抽出は、従来アドオンで使用できた「指定されたメールの本文として適切な内容を収集して返す」Thunderbird内部のユーティリティを何らかの方法で代替するという事です。

WebExtensions APIでは、messages.MessagePartpartsとしてマルチパートの各パートを再帰的に辿ることができます。本アドオンでは、その全パートを再帰的に走査して、本文と思われるパートを抽出するようにしました。HTMLメールの本文をプレーンテキストの本文に変換する方法としては、DOMParserでDOMツリーを作り、そのツリーの各ノードを再帰的に走査して、テキスト形式の戻り値を組み立てるようにしました。

2点目の処理は他のアドオンでも必要になる可能性があり、そうなった時にはライブラリとして独立してメンテナンスするようになるかもしれません。

まとめ

以上、Tb78以降のバージョン向けにWebExtensions APIベースで作り直した2つのアドオンのリリースをお知らせし、併せて実装上の工夫もご紹介しました。

今回リリースした2つのアドオンは、どちらも元々は、confirm-mailおよびRedmine連携という、第三者の開発者の方々によって作成されたアドオンでした。既存ソフトウェアに対してお客さまから機能追加の要望を頂いた際、当社では基本的にはその改善をそのソフトウェアの開発プロジェクトにフィードバックする方針としています。ですが、これらについては業務で必要とされる更新頻度がアドオン側の元々の更新頻度と大きく乖離してしまっていたことから、プロジェクトをフォークし、独自の改修版として当社でメンテナンスを行っている状況となっています。

当社ではThunderbirdの法人向けサポートサービスの一環として、ご要望に応じたアドオンの開発や既存アドオンの改修も承っております。今回リリースした2件については、ある程度のニーズが見込まれたことや、社内でも業務上で必要としていたことから、現時点で最も大きな工数がかかるものの将来的なメンテナンスコストを抑えられると考えられる、「Tb78用に完全に再設計する」やり方で対応を行いました。しかしながら、ご要望の要件次第では、多くのアドオンが暫定的な方法として採用しているWebExtensions Experimentsに基づく対応を行うことも可能です。業務上の必要で採用しているアドオンが最新のThunderbirdに対応していないために、脆弱性を抱えている古いバージョンのThundebrirdを使わざるを得ない、という状況でお困りの企業ご担当者の方は、お問い合わせフォームからご連絡を頂けましたら幸いです。