Powershellスクリプトにてメールを送信する

今回は、.NetFrameworkのSystem.Net.Mail 名前空間 ()に定義された各クラスを用いてPowershellからメール送信できるようにした。

動作環境

今回動作確認をした環境は以下の通り。
以下のレジストリ値から、.NetFrameworkのバージョンは4.5.1だと分かる。
方法 : インストールされている .NET Framework バージョンを確認する

PS > Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Release

Release      : 378675
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4
PSChildName  : Full
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry

PS > $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34014
BuildVersion                   6.3.9600.17090
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

使用するクラス

System.Net.Mail名前空間で定義されたクラスのうち、今回使用するのは以下の3つ。

Attachmentクラスはメールに添付ファイルを付けたい場合のみ使用する。

実装方法

実装例は以下の通り。例外処理は省略。

Function Send-Mail([string]$subject, [string]$body, [string]$from_address, [string]$to_address, [string]$smtp_server, [string]$smtp_port, [string]$attached_file, [string]$password)
{
    # SMTPクライアントオブジェクトの生成
    $client = New-Object Net.Mail.SmtpClient($smtp_server, $smtp_port)
    # SMTPクライアントのSSL使用を無効化
    $client.EnableSsl = $false
    # SMTP送信者アカウント認証
    if ($password -ne $null) {
        $client.Credentials = New-Object System.Net.NetworkCredential($from_address, $password)
    }
    
    # メールメッセージオブジェクトの生成
    $message = New-Object Net.Mail.MailMessage($from_address, $to_address, $subject, $body)
    
    # 添付ファイルの付与
    if ($attached_file -ne $null) {
        $filepath = @(Get-ChildItem $attached_file)
        $attachment = New-Object Net.Mail.Attachment($filepath)
        $message.Attachments.Add($attachment)
    }

    # メール送信
    $client.Send($message)
}

その他の方法

上記の方法以外に、Powershellの"Send-MailMessage"コマンドレットでもメール送信が可能となっている。
Send-MailMessage