パラメータで宛先とサブジェクトを指定する

ここ数回にわたって、PowerShellスクリプトから新規メール作成コンポーザを起動するコードを作成している。前回までで、システムクリップボードの内容をメールの本文として利用する部分の処理がほぼ完成した。まずシステムクリップボードにメールの本文に使いたいテキストをコピーし、その後スクリプトを実行すれば、コピーしたテキストを本文に使った新規メール作成コンポーザが起動する。

前回までに作成したPowerShellスクリプト「clip2mail.ps1」は次の通りだ。

#!/usr/bin/env pwsh

#========================================================================
# システムクリップボードのテキストでメールを作成
#========================================================================

#========================================================================
# Thunderbirdアプリケーションパス
#========================================================================
$mailer='C:\Program Files\Mozilla Thunderbird\thunderbird.exe'

#========================================================================
# 本文の上限文字数
#========================================================================
# これ以上の値を指定するとThuderbirdがクラッシュすることがある
$bodycharlimit = 24000

#========================================================================
# 宛先とサブジェクト
#========================================================================
$to=$env:DEFAULT_EMAIL_TO
$subject="Windowsシステムクリップボード"

#========================================================================
# システムクリップボードのテキストをThunderbirdのコンポーザに貼り付け
# できるフォーマットへ変換
#========================================================================
$body=$(Get-Clipboard | Out-String)

$body=$body -replace " "," "
$body=$body -replace "<","&lt;"
$body=$body -replace ">","&gt;"
$body=$body -replace "  ","<pre style='display:inline'>&#009;</pre>"
$body=$body -replace ",","&#044;"

#========================================================================
# 引数で指定できる文字列長には上限がある。上限を超えている場合には、上限
# 未満まで文字数を減らして使用する。
#========================================================================
function Get-TrimmedBody {
    # 上限文字数で文字列を切り捨てる。
    $trimmed = $body.Substring(0, $bodycharlimit)

    # 文字列の末尾がこの配列の文字列の途中で切れていたと判断できる
    # 場合に、配列の文字列の分も削除する。これら文字列はすべて記載
    # されている必要があり、途中で切れている場合には削除する必要が
    # ある。
    $a = $("&nbsp;",
           "&lt;",
           "&gt;",
           "<pre style='display:inline'>&#009;</pre>",
           "&#044;")
    :EndTreatment foreach ($v in $a) {
        $len = $v.Length - 1
        for ($i=0; $i -lt $len; $i++) {
            $v = $v.Substring(0, $len - $i)
            if ($trimmed.EndsWith($v)) {
                $trimmed = $trimmed.Substring(0, $trimmed.Length - $v.Length)
                break EndTreatment
            }
        }
    }

    # 終端処理を行った文字列を返す
    $trimmed
}

if ($body.Length -gt $bodycharlimit) {
    $body = Get-TrimmedBody
    $body += "<br>"
    $body += "<br>"
    $body += "(サイズオーバーでカットしました)"
}

#========================================================================
# メールを作成
#========================================================================
& $mailer                               `
    -compose                            `
    "to='$to',subject='$subject',body='$body'"

そもそも、一連の取り組みは「WindowsからiPhoneやAndroidへテキストデータを持っていきたい。簡単にメールで送れるようにしよう」という発想から始まっている。そのため、宛先やサブジェクトは固定でかまわない。

だが、このスクリプト自体は結構汎用的に利用できる作りになっている。宛先やサブジェクトがパラメータで指定できるようになれば、さらにいろいろな用途で使えるようになるだろう。今回は、この部分を実装したい。