スクリプトのお勉強 セキュリティ 技術

Thunderbird プラグイン WebExtensions版開発方法を調べた

投稿日:

初めに

最近のメールは、中身だけ見てもスパムかどうかわからないぐらい、精巧にできてます。

一方、各プロバイダでは対応ができていることも多いです。
例えば、私はメールはOCNなのですが、OCNは”X-OCN-SPAM-CHECK”ヘッダにスパムメールであれば100.00%と付与してきます。

メールクライアントは、Thunderbirdを使っているので、”X-OCN-SPAM-CHECK”ヘッダをみて、スパムメールであれば、迷惑メールマークを自動で付与するプラグインを作って見ようと思いました。

で、どう作るんだっけ?

そして作ろうと思っては見たもの、よく分かってませんでした。
調べたところ、とりあえずは形になりそうなので、Thunderbird プラグインの作り方をまとめておこうと思います。

ThunderbirdのプラグインはWebExtensionsに変わってる

昔は、ThunderbirdはXUL技術を使用したプラグインでしたが、
近年はWebExtensions APIを使用したプラグインに変っているようです。

googleで検索してしまうと、昔の情報が引っかかってきますが、
昔そうだったんだなぁ、、という程度にした方がいいと思います。

Thunderbirdのプラグインの作り方

では、実際にプラグインを開発する手前までの環境を作ってみようと思います。以下を行います。

  • (1) ツールインストール
  • (2) 開発環境構築
  • (3) プラグイン構成の構築

(1) ツールインストール

以下をインストールします。Thunderbirdは既に入ってるかもしれませんが、
バージョンを78以降にした方がいいと思います。

nodejsは直接的には使いませんが、ビルド(zipにまとめるだけ)に使えます。

以下でビルド用ツールをインストールしておきます。

> npm install -g web-ext

Linuxと違い、Windowsのシェルは壊滅的に使えないので、Power Shellに入れ替えます。

VSCodeはJavaScriptのコードを書くのに使用します。
ただし、補完が嘘(WebExtensionsの仕様に沿ってない)のであまり意味はないかもしれません。

ツールはこれだけで問題ありません。コンパイラとかも不要です。

(2) 開発環境構築

ここのように別プロファイルを生成します。
自分の環境に影響がないようにするためです。一応しておいた方がいいかと思います。

以下でThunderbirdを起動ます。

thunderbird -ProfileManager

以下のように開発プロファイル(PluginTest)を作成しておきます。開発プロファイル名は何でも構いません。

以下のようなショートカットを「Thunderbird 開発用」として作っておくと便利です。

"D:\Program Files\Mozilla Thunderbird\thunderbird.exe" -no-remote -P PluginTest

(3) プラグイン構成の構築

ここから実際のプラグインを開発していきます。プラグインの中心はmanifest.jsonです。
逆に言うとこれだけで、後はJavaScriptを追加していけば作れます。

ディレクトリ構成

昔は、install.rdfとかが必要だったようですが、WebExtensions APIの場合は不要です。それらはすべてmanifest.jsonに記述します。

以下が開発時のディレクトリ構成です。spamcheckerディレクトリの中に、プラグインを追加していきます。

spamchecker/
    manifest.json
    background.js

manifest.json

以下がmanifest.jsonです

{
    "manifest_version": 2,
    "applications": {
        "gecko": {
            // 適当なユニークであればローカルで起動している限り問題ない
            "id": "kenichi-tanino-Thunderbird-addon-ocnspam@a2.mbn.or.jp",
            // Thunderbirdでサポートする最低バージョンを記述します。
            "strict_min_version": "78.0"
        }
    },
    "name": "SPAM Check for OCN", //プラグインの名前と説明です。
    "description": "SPAM Check for OCN(Japanese Internet Provider)",
    "version": "0.0.4",
    "background": { // ここが重要。ここに記述したファイル名のJavaScriptを起動します。
        "scripts": ["background.js"]
    },
    "permissions": [ //プラグインで使用する権限を記述する。
        "messagesRead",
        "accountsRead",
        "accountsFolders",
        "storage"
    ],
    "message_display_action": { //メールの本分を表示している部分の表示
        "default_icon": "icons/spam_mail.png",
        "default_title": "SPAM Check OCNHeader"
    }
}

background.js

真っ当なプラグインは次回以降に作成しますが、以下では、
選択したメールだけチェックする実装だけ行いました。動作確認用にログを出しています。

//メールが選択された時。
browser.mailTabs.onSelectedMessagesChanged.addListener(async (tab, messageList) => {
    console.log(messageList.messages);
    for (let message of messageList.messages) {
        messagePart = await browser.messages.getFull(message.id);
        for (let hcontent of messagePart.headers['x-ocn-spam-check']) {
          console.log(hcontent);
          if (hcontent == '100.00%') {
            console.log("content is junk");
            let update_message = {
              junk: true
            };
            browser.messages.update(message.id, update_message);
          }
      };
    }
});

ビルド

上記のプラグインをビルドします。

> web-ext build --overwrite-dest -s .\spamchecker\
Building web extension from spamchecker
Destination exists, overwriting: .\web-ext-artifacts\spam_check_for_ocn-0.0.4.zip
Your web extension is ready: .\web-ext-artifacts\spam_check_for_ocn-0.0.4.zip

メニュー: ツール->「開発ツール」->「アドオンをデバッグ」でロードする。

以下の画面から上記のspam_check_for_ocn-0.0.4.zipをロードします。

エラーコンソールで内容を確認

では実際にメールを見てみます。

普通のメールを見た場合の、エラーコンソール(「ツール」->「開発ツール」->「エラーコンソール」)は以下になります。

スパムメールをメール表示した場合は以下の通りです。

この時にはメールに「迷惑メール」がマークされています。

終わりに

まずは、Thunderbirdのプラグインの作り方を書いてみました。昔やろうとしたのよりかなり簡単です。
今は、昔のXULによる開発とごっちゃになっていてわかりにくいですが、WebExtensions版は、整理されています。

次回は、ちゃんとしたThunderbirdプラグインの開発について記述しようと思います。permissionsとか、message_display_actionについては次回、説明します。

けど、今回のだけで、用が足りてしまった気もする。。

参考

-スクリプトのお勉強, セキュリティ, 技術

執筆者:

関連記事

@nifty auひかり タイプVからタイプGに変えてみた

家のインターネットはいままで、光回線ではありましたが、昔のVSDLのままでした。auひかりでいう、マンション タイプVというやつです。 それを近年、リモートワークが増えていることや、半導体需要がなんと …

Python3でMongoDBを使ってみる(MongoEngine)

仕事している過程で、ふと疑問に思うことがありました。非同期についてです。 非同期問題を解決する方法はたくさんあると思いますが、MongoDBで解決できるのかが気になったので試してみました。 非同期問題 …

unconstant – perlライブラリ

ちょっとだけperlの機能修正をしたので、そのときに使用したライブラリについて書こうと思います。 perlのunconstant です。 use constantの解除 use constantとは固 …

Ubuntu 20.04のMySQL8.0.22でrootパスワードをリセットする

小ネタです。 休みなので 久しぶりにローカル環境のUbuntuでMySQLにアクセスしようとして、パスワードを見事に忘れたことに気づきました。 ubuntu 20.04なので、以下の手順でパスワードの …

Pythonパッケージ管理の歴史

歴史っても、あまり過去に興味がないので、、 Pythonのパッケージ管理の歴史は、常に流動的で、そもそもからして、とてもじゃないがまとめて説明できるようなものではないです。 はっきり言って昔からよく分 …

google オプトアウト Click here to opt-out.