システムクリップボードのテキストを使ってメール作成スクリプト

本連載ではここ数回にわたり、Windowsからスマホへテキストデータを簡単に渡す方法を探している。まずはメールを使う方法を考え、クリップボードに貼り付けたテキストで新規メールを作成するPowerShellスクリプトを作成したところだ。

次に示す「clip2mail.ps1」は、前回作成したPowerShellスクリプトに、もう少しだけ手を加えたものだ。

#!/usr/bin/env pwsh

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

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

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

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

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

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

記述内容については、前回を参考にしてもらえればと思う。コマンドラインからいろいろとオプションを使って新規メール作成を行うことができるThunderbirdを利用し、お手軽に新規メール作成を行おう、というのがアイデアのベースだ。

そして、メールの本文をシステムクリップボードからGet-Clipboardコマンドレットで取り寄せ、Thunderbirdを実行するコマンドラインで指定できる状態に変換してから利用する、といった処理を行っている。

例えば、メール本文に貼り付けたいテキストをシステムクリップボードにコピーした状態で、次のように作成したスクリプトを実行する。

> clip2mail.ps1

すると、新規メールのコンポーザが起動する。

  • Thunderbirdのメールコンポーザ

    Thunderbirdのメールコンポーザ

これだけのことではあるのだが、これが実に便利だったりする。

かなり便利な利用シーン

今回の取り組みの趣旨は、iPhoneやAndroidにテキストデータを送りたいというものだが、実はこのスクリプトは結構いろいろな作業の自動化にも使える。

まず本来の目的としては、例えば次のようなケースが考えられる。

  • Zoomを使ったビデオ会議のURLがPCで使っているグループウェアに表示されている。ビデオ会議にはiPadまたはiPhoneを使いたいので、このURLをiPadやiPhoneに持っていきたい。手入力はしたくないので、手軽に持っていく方法が必要。

そこで作成したのが、「clip2mail.ps1」だ。Webブラウザなり専用のグループウェアアプリケーションなりに表示されているZoomの会議用URLをコピーして、「clip2mail.ps1」を実行する。スクリプトが起動するThunderbirdのコンポーザには、すでにiPadやiPhoneで受信できるメールアドレスが設定されているので、この状態で「送信」ボタンを押せば作業は完了だ。後はiPadなりiPhoneなりのメールアプリでメールを開いてURLをクリックすれば、Zoomアプリが起動してビデオ会議に参加できる。

ビデオ会議に慣れてくると、結構ぎりぎりまで準備しなくなるものだ。いざという時に、こんな感じですぐにデータを渡せるようにしておくと便利なのである。

また、定例のメール送信業務を極力自動化するといった目的でもこのスクリプトは利用できる。メールのひな型をシステムクリップボードに入れておけば、その内容で新規メールを作ってくれるわけで、処理の自動化にかなり貢献してくれるのだ。

使っていって問題を見つけ、1つずつ潰していく

こういったスクリプトは日常使いをする中で、逐次問題となるケースを解決していくとよい。最初のうちは頻繁に問題が起きると思うが、使いながら改修していくことで、最終的には長期にわたって便利に使えるスクリプトが仕上がる。

今回は次のようなケースでの改修を考えてみよう。Get-Processの結果をシステムクリップボードにコピーして、それをメールで送信しようというものだ。

> Get-Process | clip.exe
> clip2mail.ps1

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

  • 実行するとエラー

    実行するとエラー

コマンドラインからオプションで本文も指定するという仕組み上、こうなるだろうと思っていた鋭い方も多いだろう。当然ながらコマンドラインで指定できる文字列の長さには限界がある。よって、長い文章はそのままでは本文に貼り付けることができない。長くなってくると上記のようにエラーとなるのだ。

今回はこれを解消する方法を考えてみよう。

長いテキストは途中で切る

Thunderbirdをコマンドラインから実行してメールコンポーザを起動するという方法を採用したままでも、長いテキストデータをメールで送れるようにする方法はいくつかある。今回は最もシンプルな方法として、システムクリップボードから持ってきたテキストデータが長かった場合に、途中でテキストを切ってしまうことにしよう。エラーになって送ることができないよりは、途中で切れていても送れたほうがマシという発想だ。

実際に厳密に長さを計って文字列を切るのはちょっと面倒くさい。最初は「長い場合にはざっくり切る」という実装をしてしまって良いと思う。

“なんちゃって実装”として以下のような感じのアルゴリズムで処理を行えばよいだろう。

  1. ざっくりと上限となる文字数を決めておく
  2. システムクリップボードからテキストを持ってきて、その文字数が上限を超えているかどうか調べる
  3. 上限を超えていたら、上限文字数までで切る

シンプルだ。次のように実装しておけばよい(お気づきの通り、これはあくまでも参考なのでかなりテキトーな実装だ。厳密に処理したい方は、各自調べて実装していただきたい)。

$bodycharlimit = 32000

if ($body.Length -gt $bodycharlimit) {
    $body = $body.Substring(0, $bodycharlimit)
}

では、これを加えて前回作成したスクリプトを書き換えてみよう。次のような感じになる(clip2mail.ps1)。

#!/usr/bin/env pwsh

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

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

#========================================================================
# 本文の上限文字数
#========================================================================
$bodycharlimit = 32000

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

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

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

#========================================================================
# 引数で指定できる文字列長には上限がある。上限を超えている場合には、条件
# 未満まで文字数を減らして使用する。
#========================================================================
if ($body.Length -gt $bodycharlimit) {
    $body = $body.Substring(0, $bodycharlimit)
}

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

文字数上限はざっと使ってみてアバウトな数字を使っているので、これで問題が出るようなら書き換えて使ってもらえればと思う。

それでは実行してみよう。先ほどエラーになったのと同じコマンドだ。

> Get-Process | clip.exe
> clip2mail.ps1

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

  • 実行結果

    実行結果

今度はちゃんとThunderbirdのコンポーザが起動した。まずはここまでできれば良いだろう。

小さく変更して便利にしていくのが、実用的なスクリプトのポイント

clip2mail.ps1はすでに実用的に使える状態にはなっているのだが、いくつかの点でもう少し改修が必要だ。最初はちょっとした用途で使えればいいか、くらいの気楽な気持ちで作ってみても、実際に使ってみて便利だと、ほかの用途にも使えるようにしたくなってくる。clip2mail.ps1はそうした類のスクリプトだ。

こういったスクリプトのポイントは、最初からがっつり作り込むのではなく、スクリプト自体はシンプルで見通し良くしておいて、必要に応じてすぐ改修できる状態にしておくことだ。そうやって書き換えていくことで、本当に自分にとって便利なスクリプトに育っていってくれる。