Microsoft Graph API と PowerShell を使用してメールを送信する方法

PowerShell 経由でメールを送受信するのは、必ずしも簡単ではありません。特に、Microsoft がセキュリティを強化し続け、Basic 認証などの古い認証方式のサポートを終了しているためです。Send-MailMessage最近、この頼りになるコマンドレットを試したことがある方は、廃止されたという厄介な警告を目にしたことがあるかもしれません。もちろん、Windows は必要以上に複雑にせざるを得ません。現在、基本的に、最新の Microsoft 365 テナントはデフォルトで Basic 認証を無効にしており、Graph API、OAuth、その他の最新の認証方式を使用するようにユーザーに促しています。そこで、このガイドでは、PowerShell で Graph API を使用して Exchange Online または Microsoft 365 経由でメールを送信する方法を説明します。Graph API は、最新の認証を使用してコンプライアンスを維持するには、今や必須となっています。

完璧ではありませんが、これらの手順に従えば、スクリプトからメールを送信する際に、認証エラーやセキュリティ警告に遭遇することなく、問題なく送信できるはずです。一度設定すれば、非推奨の機能に頼ることなく、メール送信を簡単に自動化できます。目標は、スクリプトからMicrosoftのクラウド(Graph API経由)に接続し、安全に認証を行い、最小限の手間でメールを送信できるようにすることです。もちろん、権限やトークン生成など、多少の手間はかかりますが、少なくともSend-MailMessage段階的に廃止されるという不吉な警告は回避できます。頑張ってください。きっと、その価値はあります。

Microsoft Graph API を使用して PowerShell でメール送信を修正する方法

Azure AD でメール送信の権限を構成する

まず、Azure AD アプリ登録が必要です。これが重要なゲートウェイとなります。Azure Active Directoryポータルにアクセスし、「アプリ登録」を選択して、「新規登録」をクリックします。アプリに名前を付け、「アプリケーション(クライアント)ID」を必ずメモしておいてください。認証にはシークレットまたは証明書が必要です。どちらかお好みで設定してください。テストの場合はシークレットの方が速い場合が多いです。

登録が完了したら、アプリ登録内の「API アクセス許可」に移動し、「アクセス許可を追加」をクリックします。「Microsoft Graph」を選択し、「アプリケーションのアクセス許可」を選択して、アクセス許可を追加します。その後、テナントに対して管理者の同意を付与することを忘れないでください。手動で行う場合は、これらの手順を実行するために管理者権限が必要になる場合があります。または、管理者に問い合わせてください。Mail. Send

権限の設定が完了したら、アプリケーションアクセスポリシーを設定することで、アプリが特定のメールボックスのみに代理送信する機能を制限できます。これにより、スクリプトがあらゆる場所から大量のメールを送信することがなくなり、セキュリティ対策として効果的です。

次に、Exchange Online で のような配布グループを作成しazappSendasAllowed、アプリが送信を許可されるサービス アカウントまたはユーザー メールボックスを追加します。

New-DistributionGroup -Name "azappSendasAllowed" -Type "Security" -Members @("[email protected]") Set-DistributionGroup -Identity azappSendasAllowed -HiddenFromAddressListsEnabled $true 

次に、ポリシーを使用してアプリのアクセスを制限します。

New-ApplicationAccessPolicy -AppId "YOUR-APP-ID" -PolicyScopeGroupId azappSendasAllowed -AccessRight RestrictAccess -Description "Restrict SendAs"

最後に、アプリが代理で送信できるアドレスを確認します。

Test-ApplicationAccessPolicy -Identity [email protected] -AppId "YOUR-APP-ID"

すべて設定が完了したら、認証と送信の準備は完了です。ただし、これは設定の一部にすぎません。

Invoke-RestMethod と Graph API を使用してメールを送信する

ここからは少し技術的な話になります。実際にメールを送信するには、登録したアプリでOAuthトークンを取得する必要があります。その手順は、Invoke-RestMethodコマンドレットを使ってトークンエンドポイントを呼び出すことです。

$AccessSecret = "YOUR-APP-SECRET" $AzureAppID = "YOUR-CLIENT-ID" $tenantID = "YOUR-TENANT-ID" $tokenBody = @{ Grant_Type = "client_credentials" Scope = "https://graph.microsoft.com/.default" Client_Id = $AzureAppID Client_Secret = $AccessSecret } $tokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantID/oauth2/v2.0/token" -Method POST -Body $tokenBody $headers = @{ "Authorization" = "Bearer $($tokenResponse.access_token)" "Content-type" = "application/json" } 

この部分は少し奇妙です。なぜ特定の設定でのみ機能し、他の設定では機能しないのかは分かりませんが、このトークンによってスクリプトはGraphと安全に通信できるようになります。すべてが正しく設定されていれば、アクセストークンが出力として表示されるはずです。

メールを送信するには、送信したいJSONペイロードを作成します。例を以下に示します。

$MailFrom = "[email protected]" $MailTo = "[email protected]" $URLsend = "https://graph.microsoft.com/v1.0/users/$MailFrom/sendMail" $BodyJsonsend = @" { "message": { "subject": "Test email from Graph API", "body": { "contentType": "HTML", "content": "This email is sent via Microsoft Graph APIPretty nifty, huh?" }, "toRecipients": [ { "emailAddress": { "address": "$MailTo" } } ] }, "saveToSentItems": "true" } "@ Invoke-RestMethod -Method POST -Uri $URLsend -Headers $headers -Body $BodyJsonsend 

すべてがうまくいけば、受信者はあなたのメールを受け取るはずです。JSON は少し脆弱で、デバッグは爆弾を仕掛けるような作業のように感じることもありますが、最新のセキュリティを求めるなら、今はこれが唯一の方法です。

Microsoft. Graph モジュールの Send-MgUserMail を使用する

もう少しシンプルで簡単な方法をお探しの場合は、Microsoft. Graphモジュールをインストールしてください。このモジュールは複雑な部分を抽象化し、次のようなコマンドを記述できるようになります。

Install-Module Microsoft. Graph Import-Module Microsoft. Graph # Authenticate with a certificate (or app secret) $certThumbprint = "YOUR-CERT-THUMBPRINT" $AzureAppID = "YOUR-APP-ID" $TenantID = "YOUR-TENANT-ID" Connect-MgGraph -TenantId $TenantID -ClientId $AzureAppID -CertificateThumbprint $certThumbprint # Compose email $MailFrom = "[email protected]" $MailTo = "[email protected]" $MsgBody = "This is a test email with Microsoft. Graph module" $Message = @{ Subject = "Hello from Graph SDK" Body = @{ ContentType = "HTML" Content = $MsgBody } ToRecipients = @( @{ EmailAddress = @{ Address = $MailTo } } ) } # Send email Send-MgUserMail -UserId $MailFrom -Message $Message 

この方法は添付ファイルを直接追加することも可能で、作業もはるかに簡単です。ちなみに、この方法はOffice 365/Exchange Onlineでのみ機能し、オンプレミスのExchangeやその他のSMTPサービスでは機能しません。また、セキュリティポリシーによっては、認証用の証明書やシークレットの設定が必要になる場合があります。

結局のところ、スクリプトから信頼性の高い安全な方法でメールを送信したい場合、奇妙な警告や非推奨のコマンドレットを使用せずに済むのであれば、Graph APIを使用するのが最善策です。最初は設定が少し面倒ですが、一度設定してしまえば、あとはスムーズに進めることができます。

まとめ

  • Mail. Send 権限を持つ Azure AD アプリを設定します。
  • 必要に応じて配布グループを作成して構成します。
  • OAuth 2.0 で認証し、アクセス トークンを取得します。
  • Invoke-RestMethod または Microsoft. Graph モジュールを使用して電子メールを送信します。
  • 権限が正しくなかったり、トークンの有効期限が切れていたりする場合は、時折問題が発生する可能性があります。

まとめ

PowerShellで最新のメール送信機能を使うのは面倒な場合があります。特にMicrosoftがセキュリティを強化しているため、なおさらです。しかし、一度すべてを適切に設定すれば、メール送信を安全かつ確実に自動化するのはずっと簡単になります。ワンクリックで設定できるとは思わないでください。「一度やってみよう」という感じで、後はうまくいきます。この方法が、非推奨コマンドやセキュリティ上の悩みから解放されるきっかけになれば幸いです。頑張ってください!