Microsoft 365(Exchange Online)環境でスクリプトからメールが送信できないときに確認すること

Web サイトでフォームからの問い合わせをメールで受け取るような仕組みを作ることって割と多いと思います。このような仕組みを実装する場合、ふた昔前は SMTP サーバを指定するだけで OK でしたが、スパム送信の温床となったことから、ひと昔前からは、SMTP 認証を使うようになりました。つまり、ID とパスワードで認証して、パスした場合だけメール送信できるわけです。

この SMTP 認証によるメール送信機能の実装は、スクリプトを自作する場合だけでなく、WordPress などの CMS や複合機からのファックス受信のメール通知などでも多く使われています。
しかし、この SMTP 認証も ID とパスワードだけで認証が通ってしまうので、最近ではより安全な OAuth による認証などに移行しつつあります。

前口上が長くなってしまいましたが、最近の Microsoft 365(Exchange Online)も、上記のようなリスクを考慮し、SMTP 認証によるメール送信機能をデフォルトで禁止しています。現在のテナントの設定は PowerShell から確認することができます。

$UserCredential = Get-Credential
# Microsoft 365 のログイン情報を入力

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session -DisableNameChecking

Get-TransportConfig | Format-List SmtpClientAuthenticationDisabled

最後のコマンドの実行結果が SmtpClientAuthenticationDisabled : True になっていた場合は、テナントで SMTP 認証によるメール送信機能が禁止されています。

上記のように、基本的な考え方としては、SMTP 認証によるメール送信機能を使わないほうがよいので、SmtpClientAuthenticationDisabled : False になっていた場合は、以下のコマンドを実行してデフォルトを禁止に変更します。

Set-TransportConfig -SmtpClientAuthenticationDisabled $true

そのうえで、個々のユーザーに対して、SMTP 認証によるメール送信機能を許可する場合には、以下のコマンドを実行します。

Set-CASMailbox -Identity yamada@example.com -SmtpClientAuthenticationDisabled $false

ユーザーに対する SMTP 認証によるメール送信機能の許可状況は

Get-CASMailbox -Identity yamada@example.com | Format-List SmtpClientAuthenticationDisabled

で確認できます。
SmtpClientAuthenticationDisabled : False の場合は(明示的に)送信可
SmtpClientAuthenticationDisabled : True の場合は(明示的に)送信不可
SmtpClientAuthenticationDisabled :   の場合はテナントの設定に従う
です。

この設定は、ユーザーに SMTP サーバの利用権があることが前提となるため、共有メールボックスや配布グループ、Microsoft 365 グループでは使用できません。これらのメールアドレスを使ってメール送信しようとする場合には、別の設定が必要となりますが、それについては機会があれば書いてみたいと思います。

この記事を書いた人
グッドネイバー

“ Webに悩むお客さまの「よき隣人」でありたい ” をモットーに、Web システム開発(主に Laravel)、Web マーケティング支援の仕事をしています。お仕事のご依頼・ご相談はこちらからお気軽にどうぞ。