Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
※この投稿は 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 の使い方を教えてください....。