【PowerShell】Windows PowerShell を使用してメールに返信する


※この投稿は PowerShell Advent Calender に参加しています。

前回、以下の投稿をしました。

【Management】Windows PowerShell を使用して GMail や Office 365 からメールを送信する

では、もう半歩だけ踏みこんで、PowerShell を使用してメールに返信するにはどうしたらよいか?

なんで「返信」したいかというと、スレッド表示にしたいからです。多くのメーラーにはスレッド表示機能が実装されています。Outlook も例外ではありません。スレッド表示はとても便利です。ちなみに、Windows Phone に実装されている OUTLOOK Mobile もスレッド表示ができます。

スレッド表示をするには、返信されてきたメールに所定のヘッダーが埋め込まれている必要があります。それが、In-Reply-To ヘッダーと References ヘッダーです。正直、RFC を読み込んでいないのでアレなのですが(すんません...orz)、OUTLOOKの場合、In-Reply-To に埋め込まれている Message-ID を使用してスレッドを構成しているようです。ただ、In-Reply-To が無い場合には、References を参照しているみたいですね。

ここで、元のメールの Message-ID の値が xxxxxxxxxxx@mail.gmail.com だとしましょう。さらに、xxxxxxxxxxx@mail.gmail.com の親メールが yyyyyyyyyyy@mail.gmail.com だとしましょう。

このメールに返信するには、以下のようなスクリプトを書きます。以下の例では、gmail を使用して、user9999@gmail.com というユーザーがメールを送信しています。

##SMTP認証するためのユーザーIDとパスワード
$Cred_UserID = "user9999@gmail.com"
$Cred_Password = "password"

##In-Reply-To にセットする Message-ID と References
##いずれも<>で囲む
$InRelyTo = "<xxxxxxxxxxx@mail.gmail.com>"
## Referencesが複数必要な場合には半角空白で区切る
$References = "<yyyyyyyyyyy@mail.gmail.com> <xxxxxxxxxxx@mail.gmail.com>"

##メールの送信先。複数指定することができる。
$To = @("hogehoge0000@gmail.com","hogehoge9999@gmail.com")
$Subject = "タイトル"
$From = "user9999@gmail.com"
$Body = "本文"
$SmtpServer = "smtp.gmail.com"

##送信するメッセージを作成
[System.Net.Mail.MailMessage]$newMessage = New-Object System.Net.Mail.MailMessage

##送信先や送信元等を newMessage にセットする
foreach ($name in $To) {
      $newMessage.To.Add(($name))
}
$newMessage.From = $From
$newMessage.Sender = $From
$newMessage.Subject = $Subject
$newMessage.Body = $Body
$newMessage.Headers.Add("In-Reply-To", $InRelyTo)
$newMessage.Headers.Add("References", $References)

$client = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$client.EnableSsl = $True
$client.Credentials = New-Object System.Net.NetworkCredential($Cred_UserID, $Cred_Password);

##送信
$client.Send($newMessage)

今回は In-Reply-To や References を使用しましたが、System.Net.Mail.MailMessage を使用すると、必要なヘッダーを自由に生成することができます。

使い道は限られますが、例えばシステムが受信したメールに対して自動返信するような仕組みを生成する場合には、このように In-Reply-To ヘッダーを埋め込んで送信してあげると、受信者はスレッドで表示することができるのでメッセージの見逃しを防止できます。

それにしても...詳しい方、正しい In-Reply-To と References の使い方を教えてください....。

Comments (0)

Skip to main content