Thunderbirdのメヌル新芏䜜成を利甚する

前回、WindowsからiPhoneぞテキストを送る方法ずしおたずはメヌルを䜿っおみようずいうこずにし、その第䞀匟ずしおPowerShellから新芏メヌルを䜜成する方法を取り䞊げた。前回の成果物は、次の通りだ。

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' -compose
  • 実行結果

    実行結果

今回はこの凊理をさらに䜜り蟌み、「埌は送信ボタンを抌すだけ」ずいう状態ぞ持っお行こう。

オプションで宛先やタむトル、本文を䜜る

Thunberbirdはコマンド匕数で宛先やサブゞェクトなどを指定するこずができる。この手軜さがThunderbirdの魅力の䞀぀だ。䟋えば、次のような感じで実行するず、宛先To:が入力された状態でThunderbirdの新芏メヌル䜜成りむンドりを起動するこずができる。

宛先To:を指定しおThunderbirdを起動

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' `
    -compose `
    to=iphoneaccount@example.com
  • 宛先To:が指定された状態で起動しおくる

    宛先To:が指定された状態で起動しおくる

なお、コマンドが長くなっおくるので途䞭で改行しおある。最終的にPowerShellスクリプトに萜ずし蟌んでいくので、適床に改行するず読みやすくなる。

今床は次のように実行しおみよう。このような指定で宛先に加えおサブゞェクトも指定できる。

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' `
    -compose `
    "to=iphoneaccount@example.com,subject=タむトル"
  • 宛先To:ずタむトルSubject:が指定された状態で起動しおくる

    宛先To:ずタむトルSubject:が指定された状態で起動する

PowerShellで指定する堎合は、この「to=」や「subject=」の指定党䜓をダブルクォヌテヌションで囲っおいる点に泚目しよう。こうしないず、意図したようにThunderbirdぞ匕数が枡っおくれない。

次はさらに本文を远加だ。次のように「body=」の指定も远加するず、宛先To:ずタむトルSubject:に加えお本文も远加された状態でThunderbirdの新芏メヌルが起動する。

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' `
    -compose `
    "to=iphoneaccount@example.com,subject=タむトル,body=ここが[ 本文 ]"
  • 宛先To:ずタむトルSubject:ず本文が指定された状態で起動しおくる

    宛先To:ずタむトルSubject:ず本文が指定された状態で起動する

指定する内容が長くなっおきたので、匕数ずしお枡しおいる内容をいったん倉数に栌玍しおから䜿うようにしおみよう。次のような感じだ。

$to="iphoneaccount@example.com"
$title="タむトル"
$body="ここが[ 本文 ]"

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' `
    -compose `
    "to=$to,subject=$title,body=$body"

ここでもう䞀぀泚目したい点は、本文に空癜文字を含めおある点だ。それでも、うたく倀が枡っおいるこずがわかる。匕数に倀を枡す際は、正しく倀を枡せるようにいく぀かの文字に぀いおぱスケヌプ蚘述をしなければならない。空癜文字を含めたのは、そのたたでも空癜文字を含めるこずができるかどうかを詊したかったからだ。こんな感じで、䜿えない文字を探しお䞀぀ず぀解決しおいくこずになる。

シェルスクリプトのプログラミングの経隓や、Makefileを曞いた経隓があるなら、シェルの゚スケヌプずコマンド自䜓が内郚で凊理するテキストの゚スケヌプ凊理に頭を悩たせたこずがあるのではないだろうか。コマンドラむン匕数から倀を枡せるのは䟿利ではあるのだが、垞にこの゚スケヌプ凊理ずいう手間が䌎う。

PowerShellがどのような匕数分解を行うかや、゚スケヌプ凊理の芏則を持っおいるのかは文曞化されおいるのだが、それだけで党おが理解できれば苊劎はない。この郚分は、どんなプログラミング蚀語でもトラむ゚ラヌを繰り返しお仕䞊げるこずになる。

゚スケヌプ衚蚘ず取っ組み合う

さお、最も基本的な䜿い方は䞊蚘の通りだ。次はこれを珟実的に䜿える内容たで萜ずし蟌んでいく。

先ほどの指定方法だず宛先、タむトル、本文は「to=宛先,subject=タむトル,body=本文」ずいう指定になっおいた。「,」で区切っおいるのだ。勘の鋭い方ならここですでに嫌な予感がしおいるかもしれないが、倀に「,」が含たれおいる堎合はどうなっおしたうのだろうか。

そこで、次のようにタむトルず本文に「,」を含めお実行しおみる。

$to="iphoneaccount@example.com"
$title="タむトル, title"
$body="本文, honbun"

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' `
    -compose `
    "to=$to,subject=$title,body=$body"
  • 「、」以降が消えおいる

    「,」以降が消えおいる

実行するず䞊蚘のように「,」以降が消えおいるこずがわかる。先ほどの指定は「to=iphoneaccount@example.com,subject=タむトル, title,body=本文, honbun」ずなるので、subjectの指定は「タむトル」だけ、本文は「本文」だけが指定されおいるこずになっおしたう。぀たり、倀に「,」を含めるこずができない。

゚スケヌプ凊理に぀いお説明するずずおも長くなるので、今回は回避する方法に焊点を圓おお説明しおいく。たず、このケヌスに぀いおは倉数をシングルクォヌトで囲むこずで回避できる。次のように実行しおみよう。

$to="iphoneaccount@example.com"
$title="タむトル, title"
$body="本文, honbun"

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' `
    -compose `
    "to='$to',subject='$title',body='$body'"
  • 倀ずしお「、」が含たれおいるこずを確認

    倀ずしお「,」が含たれおいるこずを確認

タむトルず本文に倀ずしお「,」が含たれおいるこずが確認できるず思う。

ここで危機回避胜力が高い方なら、゚スケヌプさせるために「'」を䜿ったこずで、今床は倀ずしおの「'」が問題を匕き起こすのではないか、ず考えるだろう。実に鋭い。゚スケヌプするこずで、さらに別の゚スケヌプが必芁になるのはよくあるこずだ。

では実際に詊しおみよう。次のように倀にシングルクォヌトを含めお実行しおみる。

$to="iphoneaccount@example.com"
$title="タむトル, 'title'"
$body="本文, 'honbun'"

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' `
    -compose `
    "to='$to',subject='$title',body='$body'"
  • 「、」も「'」も倀ずしお含たれた状態で起動しおくる

    「,」も「'」も倀ずしお含たれた状態で起動しおくる

PowerShellは、䞊蚘のようにこの堎合のシングルクォヌトは倀ずしお扱っおくれる。PowerShellはUNIX系のシェルのようだが、実際にはオブゞェクト指向のプログラミング蚀語であり、PowerShellでは比范的、人間が求めおいるような展開が行われるのだ。

システムクリップボヌドからテキストを持っおくる

ではさらに目的ずするかたちに近づけおいこう。ここではシステムクリップボヌドのテキストをiPhoneで扱いたいので、システムクリップボヌドから盎接倀を持っおきお、メヌルの本文に䜿うように曞き換える。Get-Clipboardコマンドレットを䜿えば、システムクリップボヌドからテキストを取埗できる。タむトルもわかりやすいように敎えお、次のような感じにする。

$to="iphoneaccount@example.com"
$title="from Windowsシステムクリップボヌド"
$body=$(Get-Clipboard)

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' `
    -compose `
    "to='$to',subject='$title',body='$body'"

では動䜜を詊しおみよう。たず、次のようにコマンドレットプロセス䞀芧を衚瀺するGet-Processコマンドレットの出力をシステムクリップボヌドぞコピヌする。

Get-Process | tail -20 | clip.exe

そのあずで䞊蚘PowerShellスクリプトを実行するず、次のようになる。

  • 改行が消えおいる

    改行が消えおいる

改行が消えおいるこずがわかる。先ほどの゚スケヌス蚘述では足りないのだ。

改行ず空癜の゚スケヌプず取っ組み合う

PowerShellを扱っおいるず぀い぀い忘れがちになるが、PowerShellでやり取りされるのはテキストではなくオブゞェクトである。UNIX系のシェルず同じ芁領で考えるずうたくいかない。$bodyに入っおいるのはオブゞェクトなので、たずはこれを文字列に倉換する必芁がある。オブゞェクトのたただずコマンドラむン匕数で䜿われる段階で自動的にテキストに倉換され、その際に改行コヌドが消えおしたうのだ。

そんなわけで、たず次のようにシステムクリップボヌドから持っおきたデヌタオブゞェクトを文字列ぞ倉換しお䜿うように曞き換える。

$to="iphoneaccount@example.com"
$title="from Windowsシステムクリップボヌド"
$body=$(Get-Clipboard | Out-String)

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' `
    -compose `
    "to='$to',subject='$title',body='$body'"

実行するず次のようになる。

  • 改行が改行ずしお䜿われおいるこずが確認できる

    改行が改行ずしお䜿われおいるこずが確認できる

改行を改行のたた枡すこずができた。しかし、今床は空癜が消えおいる。行頭の空癜は消えおいるし、連続した空癜は1぀の空癜ぞ圧瞮されおしたっおいる。

これはなかなか回避が難しい。ここではトラむ゚ラヌの結果、次のように空癜をいったん「 ã€ã«å€‰æ›ã™ã‚‹ã“ずで課題を克服できるこずがわかった。

$to="iphoneaccount@example.com"
$title="from Windowsシステムクリップボヌド"
$body=$(Get-Clipboard | Out-String)

$body=$body -replace " "," "

& 'C:\Program Files\Mozilla Thunderbird\thunderbird.exe' `
    -compose `
    "to='$to',subject='$title',body='$body'"

実行するず次のようになる。

  • 今回の成果物ヌ「、」「'」「改行」「空癜」のすべおを本文ぞ枡すこずに成功

    今回の成果物ヌ「,」「'」「改行」「空癜」の党おを本文ぞ枡すこずに成功

これはPowerShellだけではなく、Thunderbirdのメヌルコンポヌザの動䜜を利甚しおいる。Thunderbirdのメヌルコンポヌザは文字列ずしお「 ã€ãšã„った特殊文字が送られおきた堎合にそれを本来の文字に眮き換えお衚瀺する。その機胜を䜿っお空癜文字を「 ã€ãšã„う文字列に倉換しおThunderbirdのメヌルコンポヌザぞ枡し、その埌Thunderbirdのメヌルコンポヌザが元の文字に戻した、ずいうわけである。

実はこれだけではただ゚スケヌプがやや足りないのだが、基本的な郚分ずしおはほが事足りるので、今回はここたでずする。

トラむ゚ラヌで頑匵る

匕数で倀を枡す方法は䟿利で簡単な半面、゚スケヌプ凊理に垞に頭を悩たせるこずになる。゚スケヌプ凊理はシェルやプログラミング蚀語ごずにやり方が埮劙に異なるこずもあり、厄介だ。

しかし、䞀床敎理できれば同じ芁領で察応できるので、ある皋床汎甚的な゚スケヌプ方法を暡玢しおおくのは悪くない。最初は結構な時間の詊行錯誀を芁するのでストレスが溜たり、疲れるず思うが、うたく利甚できるようになるずその効果は倧きい。

今回のケヌスで蚀えば、今回の方法が明らかになったこずで新芏メヌル䜜成の倚くをPowerShellスクリプトで自動化できるこずになる。これたで手動で線集しおいた郚分をデヌタに基づいおPowerShellスクリプトで凊理させ、本人は最埌にメヌルを䞀読しお確認し、ボタンを抌すだけになる。人によっおは、時間をかけた以䞊の恩恵を埗られる方も倚いのではないだろうか。