まさ先生 さんが書きました:
あちらの方が大変ご親切にも,なんとも立派なプログラムを実際に作って,期間限定でアップロードしてくださいました。
個人的な興味で私も試してみました。
動作は確認しましたが気になった点がありました。
- 5秒周期でフォルダーの更新を監視して自動処理してるが、Thunderbird起動中に行っても結局手動でフォルダー修復をかけることになるので、気がついたときに手動でバッチを実行するので十分だと思う。
- フォルダーの修正処理時には、Thunderbird を終了しておいて置換先はいったん削除しておくと、Thunderbird 起動時にフォルダーの再構築が行われる。
- やることは multipart/mixed; => multipart/related; なので、文字コードを意識する必要はないはず。
ということで、私だったらこうするというのを作ってみました。
前提として、Windows 10 の Linux 用 Windows サブシステム(WSL)機能の Linux コマンドを使用します。
それ以外ではバッチファイル1つのみとしました。
1. Thunderbird 側の設定
例えば「ローカルフォルダー」アカウントに
ローカルフォルダー
┗ d-point
┗ d-point(prefix)
とフォルダーを作り、メッセージフィルターで受信トレイからdポイントのメールを「d-point(prefix)」フォルダーに移動するように設定しておきます。
そして修復したメールは「d-point」に配置するものとします。
なお、フォルダー名はスクリプト処理する関係上、日本語名を避けて半角英数名にしておくのが無難です。
2. Windows Subsystem for Linux (WSL) の設定
https://lab.sonicmoov.com/development/windows-bash/ を参考に、WSL の有効化して Ubuntu をWindowsストアからインストールを行います。
3. バッチファイルの設定
下記内容のバッチファイル(文字コード:Shift_JIS、改行:CRLF)を作成します。
なお、「-- 以下を環境に合わせて変更 --」の箇所の3つの環境変数は、実際の環境に合わせて設定が必要です。
コード:
@echo off
rem ------------------------------------------------------------------------
rem fix_d-point.bat:
rem Thunderbird を終了させてからdポイントのメールを修正したフォルダーを作成
rem その後Thunderbirdを起動し直す
rem ------------------------------------------------------------------------
rem ■環境変数定義("="の前後に空白入れない)
rem -- 固定 --
set SEDCMD="s/multipart\/mixed;/multipart\/related;/"
set WSL=C:\Windows\System32\wsl.exe
set APP_NAME=thunderbird.exe
rem -- 以下を環境に合わせて変更 --
rem Thunderbird の軌道に使っているショートカットのリンク先の内容そのまま(ダブルクォーテーション付き)
set APP_CMD="C:\Program Files\Mozilla Thunderbird\thunderbird.exe"
rem 置換元のフォルダーファイルのフルパス(ダブルクォーテーションで囲わない)
set INPUT_MBOX=C:\Users\○○\AppData\Roaming\Thunderbird\Profiles\xxxxxxxx.△△\Mail\Local Folders\d-point.sbd\d-point(pre-fix)
rem 置換先のフォルダーファイルのフルパス(ダブルクォーテーションで囲わない)
set OUTPUT_MBOX=C:\Users\○○\AppData\Roaming\Thunderbird\Profiles\xxxxxxxx.△△\Mail\Local Folders\d-point
rem ■WSLのLinuxコマンドを使っているのでセットアップされているか調べる
if not exist %WSL% (
echo ========================================================
echo WSL がセットアップされていません
echo Windows 10 の Linux 用 Windows サブシステムを有効に設定し
echo Windows ストアから Ubuntu をインストールしてください
echo ========================================================
pause
echo " "
exit /b 0
)
rem ■Thunderbird が起動しているか調べる
tasklist /nh | find "%APP_NAME%" > nul
if errorlevel 1 (
set IS_RUN=0
goto END_KILLCHK
) else (
set IS_RUN=1
)
rem ■Thunderbird 終了
:KILL_TB
echo -----------------------------------------------------------------------
echo dポイントからのメールを修正するために Thunderbird をいったん終了します
echo -----------------------------------------------------------------------
rem 任意のキー入力を待つ
pause
rem thunderbird.exe を終了させる(複数の thunderbird.exe が起動していた場合はそのすべてが対象)
taskkill /IM %APP_NAME%
rem 終了を待つ
:LOOP_KILLCHK
tasklist /nh | find "%APP_NAME%" > nul
tasklist /nh /fi "imagename eq %APP_NAME%" | find ":" > nul
if errorlevel 1 goto END_KILLCHK
timeout /t 1
goto LOOP_KILLCHK
:END_KILLCHK
rem ■WSLのsedでメールフォルダーを置換
if exist "%OUTPUT_MBOX%" (
del /f "%OUTPUT_MBOX%"
)
if exist "%OUTPUT_MBOX%.msf" (
del /f "%OUTPUT_MBOX%.msf"
)
echo "%INPUT_MBOX% => %OUTPUT_MBOX%"
wsl sed -e %SEDCMD% < "%INPUT_MBOX%" > "%OUTPUT_MBOX%"
rem ■Thunderbird を起動
if %IS_RUN% equ 1 (
echo Thunderbird を起動します
start " " %APP_CMD%
)
4. バッチファイルの実行
d-point(prefix) フォルダーにdポイントからのメールを振り分けた状態で、デスクトップ等任意の場所に置いたバッチファイルを実行します。
そうしますと、コマンドプロンプト画面で確認した後 Thunderbird を終了、
「d-point(prefix)」フォルダーのファイルを sed コマンドで置換して「d-point」フォルダーとして書き出し、
その後、(最初に起動していた場合)Thunderbird を起動し直します。
とまあこんな感じです。
バッチファイル(コマンドプロンプト)を久しぶりに書きましたが、やっぱり bash のシェルスクリプトみたいにはいかないですね。