【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 の使い方を教えてください....。