PowerShellでメール送信時に失敗した場合のリトライ処理方法


はじめに

PowerShellでのメール送信は「SMTPClient」を利用する方法と、「Send-MailMessage」コマンドを利用する方法があります

ここでは、メール送信に失敗するケースを考慮しリトライ処理とWait処理を取り入れたメール送信スクリプトを備忘録として残しておきます。

 

実行環境

本スクリプトを作成した時の環境は下記の通り

項目 バージョン
PS Version 5.1.17763.1007
OS Windows 10 1809 Enterprise 64bit
.Net Framework 4.7.2

 

Send-MailMessageを利用した場合

SendMailMessage.ps1ファイルを用意し、下記を記載したものを実行します。
今回はgmailのSMTPサーバ経由でメールを送信します。

# 最大リトライ回数
$MaxRetryCount = 5;
# 送信後の待ち時間(秒)
$RetryWaitSec = 10;
# メール設定
$SmtpServer = "smtp.gmail.com"
$Port = 587
$Encoding = ([System.Text.Encoding]::BigEndianUnicode)
# $Encoding = "UTF8"
$From = "sample@gmail.com"
$userName = "sample@gmail.com"
$password = ConvertTo-SecureString "pwd1234" -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential $userName, $password

$To =@("sample1.gmail.com", "sample2.gmail.com")
$Cc =@("sample3.gmail.com")
$Subject = "Sample Mail"
$Body = @"
This is Sample Mail.
"@

$count = 0
Do {
    try{
        Send-MailMessage -From $From -To $To -Cc $Cc -Subject $Subject -Body $Body -SmtpServer $SmtpServer -Port $Port -Credential $Credential -Encoding $Encoding
    } catch {
        $count ++
        if($count -eq $MaxRetryCount) {
            Write-Host "Unable to send message"
        }
        Start-Sleep -s $RetryWaitSec
    }

} until ($count -eq $MaxRetryCount)

 

SMTPClientを利用した場合

SendMailSmtpClient.ps1ファイルを用意し、下記を記載したものを実行します。
Send-MailMessage同様gmailのSMTPサーバ経由でメールを送信します。

# 最大リトライ回数
$MaxRetryCount = 5;
# 送信後の待ち時間(秒)
$RetryWaitSec = 10;
# メール設定
$SmtpServer = "smtp.gmail.com"
$Port = 587
$From = "sample@gmail.com"
$UserName = "sample@gmail.com"
$Password = "pwd1234"
$To ="sample1.gmail.com"
$Subject = "Sample Mail"
$Body = @"
This is Sample Mail.
"@

$count = 0

$SMTPClient=New-Object Net.Mail.SmtpClient($SmtpServer,$Port)
# No SSL encrypted
$SMTPClient.EnableSsl=$false
$SMTPClient.Credentials=New-Object Net.NetworkCredential($UserName,$Password)

# Create mail message
$MailMassage=New-Object Net.Mail.MailMessage($From,$To,$Subject,$Body)

$count = 0
Do {
    try{
        $SMTPClient.Send($MailMassage)
    } catch {
        $count ++
        if($count -eq $MaxRetryCount) {
            Write-Host "Unable to send message"
        }
        Start-Sleep -s $RetryWaitSec
    }

} until ($count -eq $MaxRetryCount)

 

最後に

SmtpClientを利用する場合は、ちょっと設定などが面倒なのと、制限があったりしてPowerShellだと使い勝手がよくない気がします。

PowerShell4.0未満の時はよくSmtpClientを利用していましたが、4.0以降だとSend-MailMessageでPort指定ができたりできるようになっているので、最近ではSend-MailMessageを使っています。

メール送信処理では、結構失敗するケースがあるので、リトライ処理やリトライ待ち時間をいれて処理することをお勧めします。