スキップしてメイン コンテンツに移動

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(起動用バッチファイル)

ポータブルルートに作成し、以下の内容で保存。バッチファイルの文字コードは、S-JIS(ANSI)。


@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(処理本体スクリプト)

ポータブルルートに作成し、以下の内容を保存。Powershell の文字コードは、BOM有りUTF-8 もしくは、UTF-16 ね。


$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. で展開したファイルやフォルダを ClawsMail/App へ、そのまま配置。

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

  • 4-1. 起動:

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

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

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

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

    • パスを指定しなかった場合は、%appdata%に、Claws Mail が作成したメール保存用のディレクトリがあるはずなので探し出す。探し出してClaws Mailを終了し、 data/mail へ移動した後、data/profile/folderlist.xml の folder type="mh" path= を、現在の環境に合わせてフルパスで変更する。

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

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

5. 日常の運用

  • 起動方法:

    • 常に ClawsMail_Launcher.bat から起動。

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

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

  • PC本体への痕跡遮断:

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

動くけど……

 GTK3 を開発に利用しているためか、%USERPROFILE%を使って Desktop を見に行ってエラーが出たり、 %APPDATA% から一時ファイルを作成するディレクトリを作ったりと、プロファイルやメール保存先以上にアプリの挙動による対応が、ちょうめんどい。
特に初回起動時の保存先設定ウィザードは……。参照ボタン無いし。コミットしたら?それがオープンソースの良さでしょ?と言われると何も言えんが。

コメント

人気の投稿

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

何処に何があるのかさっぱりで、ユーザから好評だったドコモマーケットがdメニューへリニューアルされました。 自分が見つけることが出来なかったのかもしれませんが、 お客様サポートからspモード決済や月額課金状況のページへ辿ることが出来なくなってませんか? どうしてこういう事をするのかなぁ? spモード決済の履歴をたどるメニューは、マイメニューから入っていくようになっています。 dメニュートップページ 「マイメニュー」を選択すると このページへ飛んで、継続課金一覧や履歴を確認できるリンクがでる マイメニューに、何が表示されるのか知らされていないのに、こんな項目を置かれても。役割や名称を見ても、普通はお客様サポートへアクセスするでしょうに。 ……ただ理解できないのが、継続課金一覧等からログインして表示されるページから、用意されている「戻る」をタップすると、お客様サポートのページに戻るんですよね。なぜこのページをお客様サポートから確認できるページにしなかったのだろう?コンテンツ作るのに、失敗してるのかしらん? わかりやすくしたつもりなのかもしれません。 ただ、エンドユーザが迷うようなサポートページを提供してどうする。 身も蓋もないことですが、そもそもspモードで接続している場合はマイメニューこそトップページにすべきでしょう。dメニューはマイメニューから見たい人だけ行けばいい。

Edge 入れたくないでござる

PowerShell によるアンインストールも塞がれ、遂に消す方法がなくなってしまった。勝手に入るし。だから要らんのだ。 Windows10 22H2 に、Edge を入れたくないでござる、絶対に Edge を入れたくないでござる! なので。昔ながらの古典的な方法で、二度と勝手に入らないようにした。 まず削除だが、C:\Program Files (x86)\Microsoft にある、Edge、EdgeCore、EdgeWebView の3つのフォルダを削除。 アンインストーラが機能しないんだから、フォルダごとバッサリやってもいいよね? Microsoft365Apps で使う? いらねーよあんなゴミ。 他にインストールしてあるブラウザ上で開けばいい。PWA として動かすにしても、勝手にインストールしやがる EdgeWebView 上で動かす必要はない。 Windows10 22h2 なら、EdgeWebView を消しても、Microsoft Store は動く。Windows 11 は知らん。いつになったら安定するんだ、Windows11 は。23/11 現在、まだ使いもんにならん。 Win+x キーを押して、WindowsPowerShell(管理者)を開き、次の3行を入力。 echo "" >"C:\Program Files (x86)\Microsoft\Edge" echo "" >"C:\Program Files (x86)\Microsoft\EdgeCore" echo "" >"C:\Program Files (x86)\Microsoft\EdgeWebView" ファイル置いとけば中身入れらんないから、インストールもされまい理論。 タスクスケジューラには何もなかったが、サービスに、 MicrosoftEdgeElevationService っていうクソがいたので無効に。しつけーわ、ほんと。 追記: 11 でも一応可能。MicrosoftStore も問題はないが、EdgeWebView を内蔵せずに利用するアプリは動作しなくなる(Microsoft PC Manager とか。PDF24 はE...