【PowerShell】Start-Processでメール送信画面を起動

背景

PowerShellのスクリプトの中からメールを送るだけであれば、Send-MailMessageコマンドを使えばよいのですが、

  • 送信前にメールの内容を表示して
  • 必要に応じて適宜修正してから送信

という要件があり、その対応として、
所定の内容(宛先、件名、本文)をセットしたうえで、メール送信画面を開く
をゴールとすることにしました。

実現方法

色々調べて見つけた情報が、
Start-Processコマンドを使えば、Windowsの関連付けに従ってアプリケーションを起動することができる
ということ

例えば、
Start-Process "C:\Temp\Sample.txt"
等とすれば、txt に関連付けられたアプリケーション(メモ帳など)で当該のファイルを開くことができます。

ということは、
mailto:のリンクをパラメータとしてStart-Processを実行すれば、目的が達成できるのは?

結論

目論見通り、実現することができました。
サンプルのソースを以下に載せておきます。

# UrlEncodeを関数化
function UrlEncoding([string]$inputString){
    return ([System.Web.HttpUtility]::UrlEncode($inputString)).Replace('+','%20')
}
# 変数定義
$Subject = "テストメール"
$MailTo = "test@test.com"
$MailCc = "cc@test.com"
$Body = @()
$CrLf = "`r`n"

for ($i = 1; $i -le 10; $i++) {
    $Body += "メール本文 $i 行目"
}
$MailBody = ($Body -join $CrLf)

# mailto のリンク形式の文字列を生成
$EncodeTxt = 'mailto:' + $MailTo + '?cc=' + $MailCc + `
                '&subject=' + (UrlEncoding($Subject)) + `
                '&body=' + (UrlEncoding($MailBody))

# メーラー起動
Start-Process $EncodeTxt

簡単な解説

mailto: のリンク書式についての説明は割愛します。

最初の function UrlEncoding の部分は、2byte文字をSystem.Web.HttpUtilityのUrlEncodeを用いてエンコードしている部分ですが、半角スペースが + にエンコードされてしまうため、それを %20 に置換する処理を追加しています。

また、メールの本文については CR+LF の改行コードを含めた文字列にしてからエンコードする必要があるため、1行ずつを配列に格納したものを、CR+LFで結合するという作りにしてあります。

上記のソースを実行すると、例えば、mailtoのリンクでChromeを起動するように設定し例れば、下記の様にGmailでメール送信画面が起動します。

このような要件はニッチかもしれませんが、参考になれば幸いです。