ClawsMail をどうにかしてPortableで使いたい

Portable 版が Portable.apps にあるけれど……古いままで、 Developer 版で止まってる。 

すでに Portable 版があるなら、最新版でも Portable 化できるやろ、と、簡単に考えていたら、酷い目にあった。

動かすまで、クッソ手間かかった。まさか、UTF-8 の BOM 有り無しで詰まるとは思わんかった。Excel じゃねーんだぞ!

しゃーなし。これもGmail対策……。

1. フォルダ構成の作成

USB メモリ(または任意のポータブルフォルダ)内に、次の階層構造を作成。

ClawsMail/                   ← ポータブルルートフォルダ
│
├── ClawsMail_Launcher.bat   ← 2-1. 起動用バッチファイル
├── ClawsMail_Launcher.ps1   ← 2-2. 内部処理用 PowerShell スクリプト
├── App/                     ← 3-3. Claws Mail 実行ファイル一式(claws-mail.exe 等)
└── data/
    ├── profile/             ← アカウント設定・プロファイル保存先
    ├── mail/                ← メールデータ保存先
    └── tmp/                 ← 一時ファイル・キャッシュ隔離先(自動生成)

2. 実行ファイルの配置

2-1. ClawsMail_Launcher.bat(起動用バッチファイル)

ポータブルルートに作成し、以下の内容で保存。

@echo off
setlocal
cd /d "%~dp0"

:: 1. ポータブル環境用のフォルダ定義
set "PORTABLE_DATA=%~dp0data"
set "CONFIG_DIR=%PORTABLE_DATA%\profile"
set "TMP_DIR=%PORTABLE_DATA%\tmp"

:: tmpフォルダが存在しなければ作成
if not exist "%TMP_DIR%" mkdir "%TMP_DIR%"

:: 2. システム変数を tmp 内に隔離
set "HOME=%TMP_DIR%"
set "USERPROFILE=%TMP_DIR%"
set "APPDATA=%TMP_DIR%\AppData"
set "LOCALAPPDATA=%TMP_DIR%\LocalAppData"
set "TEMP=%TMP_DIR%\Temp"
set "TMP=%TMP_DIR%\Temp"

:: 3. path の自動書き換え
powershell -NoProfile -ExecutionPolicy Bypass -File ".\ClawsMail_Launcher.ps1"

:: 4. Claws Mail を起動
start "" ".\App\claws-mail.exe" --alternate-config-dir "%CONFIG_DIR%"

endlocal
exit

2-2. ClawsMail_Launcher.ps1(処理本体スクリプト)

ポータブルルートに作成し、以下の内容を保存。

$ErrorActionPreference = "Stop"

try {
    $baseDir = $PSScriptRoot
    $configDir = Join-Path $baseDir "data\profile"
    
    # 1. 隔離環境用の一時フォルダ・Windows標準ダミーフォルダの作成
    $tmpDir = Join-Path $baseDir "data\tmp"
    $desktopDir = Join-Path $tmpDir "Desktop"
    $docsDir = Join-Path $tmpDir "Documents"
    $dlDir = Join-Path $tmpDir "Downloads"

    foreach ($d in @($configDir, $tmpDir, $desktopDir, $docsDir, $dlDir)) {
        if (-not (Test-Path $d)) {
            New-Item -ItemType Directory -Path $d | Out-Null
        }
    }

    # BOMなし UTF-8 設定
    $utf8NoBom = New-Object System.Text.UTF8Encoding $False

    # 2. 以前のベースパスの検出
    $oldBaseWin = ""
    $files = Get-ChildItem -Path $configDir -Recurse -Force -File | Where-Object {
        $n = $_.Name.ToLower()
        $e = $_.Extension.ToLower()
        return ($n -match 'rc$' -or $e -eq ".xml" -or $e -eq ".conf" -or $e -eq ".ini" -or $e -eq ".txt")
    }

    foreach ($f in $files) {
        $content = [System.IO.File]::ReadAllText($f.FullName, $utf8NoBom)
        if ($content -match '(?i)([a-z]:[^\n\r"<>\|]*?)[\\/]data[\\/](profile|mail|tmp)') {
            $oldBaseWin = $matches[1].Replace('/', '\')
            break
        }
    }

    $updatedCount = 0

    # 3. パス一括置換 & BOM自動除去
    foreach ($f in $files) {
        $content = [System.IO.File]::ReadAllText($f.FullName, $utf8NoBom)
        $newContent = $content

        if ($oldBaseWin -ne "" -and $oldBaseWin.ToLower() -ne $baseDir.ToLower()) {
            $oldBaseUnix = $oldBaseWin.Replace('\', '/')
            $newBaseWin = $baseDir
            $newBaseUnix = $baseDir.Replace('\', '/')

            $escOldWin = [System.Text.RegularExpressions.Regex]::Escape($oldBaseWin)
            $escOldUnix = [System.Text.RegularExpressions.Regex]::Escape($oldBaseUnix)

            $newContent = [System.Text.RegularExpressions.Regex]::Replace($newContent, $escOldWin, $newBaseWin, [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
            $newContent = [System.Text.RegularExpressions.Regex]::Replace($newContent, $escOldUnix, $newBaseUnix, [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
        }

        # 既存ファイルのBOM有無を判定
        $bytes = [System.IO.File]::ReadAllBytes($f.FullName)
        $hasBom = ($bytes.Length -ge 3 -and $bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF)

        if ($content -ne $newContent -or $hasBom) {
            [System.IO.File]::WriteAllText($f.FullName, $newContent, $utf8NoBom)
            if ($hasBom) {
                Write-Host ("FIXED (BOM Removed): " + $f.Name)
            } else {
                Write-Host ("UPDATED: " + $f.Name)
            }
            $updatedCount++
        }
    }

    if ($updatedCount -eq 0) {
        Write-Host "CHECK OK: All paths and encodings are clean."
    }

    Start-Sleep -Seconds 1

} catch {
    Write-Host "--- ERROR OCCURRED ---"
    Write-Host $_.Exception.Message
    Pause
}

3. セットアップファイルの展開

3-1. 公式サイトから、ダウンロード。

動作確認したのは、claws-mail-4.4.0-1-64bit.exe

3-2. 7-zip 等で展開。

別にインストーラを実行して、セットアップをしても良い。その場合は、インストール先のフォルダに展開されたファイルを使う。
7-zip で展開する場合は、$PLUGINSDIR\ 以外のファイルとフォルダを利用。

3-3. Claws Mail 実行ファイル一式へ配置

3-2. で展開したファイルやフォルダをそのまま配置。

4. 初回セットアップ手順

  • 4-1. 起動:

    • ClawsMail_Launcher.bat をダブルクリックして実行。

  • 4-2. 初回ウィザード設定:

    • メールアカウントの設定を進める。

    • ウィザードの一番最後。メールボックス(Mailbox)の保存先指定画面で、初期値のまま進めず、ポータブルルートフォルダ配下の data\mail のフルパスを指定。E:\ClawsMail\data\mail など、手入力やパスのコピーで。

  • 4-3. 署名ファイル等の配置:

    • 署名ファイル(signature.txt)や添付ファイル用の一時保存先を設定する場合は、PC本体側ではなく必ずポータブルルートフォルダ配下の data\profiledata\ 配下 に配置して指定。

5. 日常の運用

  • 起動方法:

    • 常に ClawsMail_Launcher.bat から起動。

  • 別PCへの移動・ドライブレター変更時:

    • 何もしなくて良い。
      ドライブレター(D:E: など)が変わったり、親フォルダ名を変更して移動した場合でも、起動時にスクリプトが設定ファイル内の旧パスを自動検出し、現在の絶対パスへ全置換(BOMなしUTF-8)してから起動する。

  • PC本体への痕跡遮断:

    • APPDATAUSERPROFILE 等の一時環境変数が data\tmp に設定されているため、ホストPC側の %appdata% やレジストリに影響しない。

コメント

このブログの人気の投稿

ドコモマーケットからdメニューへ

ナンバープレートのボルト交換