どうもミツシマです。

今回はExchange OnlineのSMTP認証機能を用いて、Powershellコマンドからメールを送信する方法を検証してみました。

<検証環境>
Windows Server 2016 Standard


〜検証〜

まずはSMTP認証を有効にする作業から。
Microsoft365管理センターのユーザーを選択して「メール」-「メールアプリを管理する」を選択します。
その後、「認証済みSMTP」を有効にして保存します。
設定画面

これで事前準備は完了です。
※もしPowershell等で一括変更したい場合等は以下のサイトを参考にするといいと思います。
Exchange Online で認証済みクライアントの SMTP 送信 (SMTP AUTH) を有効または無効にする
Set-TransportConfig」や「Set-CASMailbox」コマンドを使用するようです。


(2020/10/20追記)

最近再確認した際、GUIで「認証済みSMTP」のチェックがONになっていたのにSMTP送信出来ないことを確認しました。
Powershellコマンドで確認するとその理由がわかりました。
EO-SMTP認証について
上記のように、初期設定ではテナント全体で「SMTP認証」が無効であり、ユーザー作成時の「SMTP認証」は空欄となっております。
各ユーザーのメールボックスで「SMTP認証」が空欄の場合には、テナントの設定に準じる動きをします。
そのため、GUIでは「SMTP認証」が有効になっているような表記でも実際には有効になっていないケースがあります。。。。ひどい。。。orz

回避策としては以下の2つがあります。
・Powershellコマンドで「SMTP認証」を有効にする
・GUI(Microsoft 365管理センター)上で、「SMTP認証」のチェックを外して保存し、再度チェックをオンにして保存する。
みなさんも注意してくださいね!!



↓↓そして作成出来たPowershellコマンドがこちら↓↓

〜Test-SendSMTP.ps1〜

$mail = @{
    from = "smtp-testuser@xxx.onmicrosoft.com";
    to = "xxx@gmail.com";
    smtp_server = "smtp.office365.com";
    smtp_port = 587;
    user = "smtp-testuser@xxx.onmicrosoft.com";
    password = "Password1234";
}

#件名とメール本文
$tempsubject = "件名 TEST"
$tempbody = "TESTメール"

#連続何通送るかを決める
$flag = 10

$encoding = ([System.Text.Encoding]::BigEndianUnicode); # 有効な値は、ASCII、UTF8、UTF7、UTF32、Unicode、BigEndianUnicode、Default、および OEM です https://docs.microsoft.com/ja-JP/previous-versions//dd347693(v=technet.10)

$password = ConvertTo-SecureString $mail["password"] -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $mail["user"], $password

#連続してメールを送る
for($i=1; $i -le $flag; $i++){

    $subject = $tempsubject + $i
    $body = $tempbody + $i + "通目ですよ。"

    Send-MailMessage -To $mail["to"] `
                     -From $mail["from"] `
                     -SmtpServer $mail["smtp_server"] `
                     -Subject $subject `
                     -Body $body `
                     -Credential $credential `
                     -Port $mail["smtp_port"] `
                     -UseSsl `
                     -Encoding $encoding

    #メッセージ
    Write-Host "${i}通目送信完了"

    #3秒ウェイト
    Start-Sleep -Seconds 3

}

$count = $i - 1 

Write-Host "${count}通のメール送信完了しました."
pause


〜解説〜

$mail」内で必要となる環境変数を定義しています。
それぞれ「from」・「to」・「user」・「password」を実際に使用する環境に合わせて変更する必要があります。
上記の例だと「smtp-testuser@xxx.onmicrosoft.com」を差出人として、「xxx@gmail.com」宛にメールを送る形となっています。
(注)Microsoft365ユーザーのパスワードに記号(「$」や「@」等)を使用しているとPowershellコマンド上では上手く認証出来ない場合があるので、英数字に限定することをオススメします。
   実際やれないことはないはずなのですが、エスケープ等を使用しないといけないので少し面倒になります。実際には「ダブルコーテーション」ではなく「シングルコーテーション」で括ると良いかもです!!

その後に件名本文を適当に入力しています。
ここで「$flag」という環境変数を用いて何回連続でメールを送るかを定義しています。上記例では10回と定義しています。
(注)Exchange Onlineであまり連続してメールを送るのが良くないようなので、メールを送る度に3秒ウェイトするようにしています。

また、Exchange OnlineのSMTP認証送信を使用する際のSMTPサーバは「smtp.office365.com」、SMTPポートは「587」をそれぞれ指定し、必ずTLS1.2に対応していることが必要です。
2020年9月現在の設定なので将来的に変更される可能性は否めませんが。。。(汗)

ここまでで一通りの解説と準備が出来たので実際にコマンドを実行してみます。

↓↓実際にPowershellで送ると以下のような感じになります↓↓
実行画面


本日の検証はこれで終了です。
Send-MailMessage」コマンドのオプションで「CC」や「BCC」も出来るようなので興味がある人は調べて見ると面白いかもですよ!!
スポンサードリンク