Teams Phone Agentのスパム検出では、E.164形式の発信者番号をInclusionListに登録すると、その番号を常にスパムとして扱えます。さらにActionをDisconnectCallに設定すれば、指定番号からの着信を常に切断できます。
一方、ExclusionListに登録した番号は、そのスパム検出テンプレートではスパムと判定されません。ただし、ExclusionListはTeams全体の着信許可リストではありません。通常のコールフロー、テナント単位の着信拒否、通信事業者側の処理などは別に適用されます。
重要なのは、InclusionListが「判定結果をスパムに固定する設定」、Actionが「スパム判定後の処理」である点です。特定番号を確実に遮断するには、両方を正しく組み合わせ、作成したテンプレートを対象のTeams Phone Agentへ割り当てる必要があります。(Microsoft Learn)
なお、Teams Phone Agentは旧称をMainline Attendantといい、関連機能はFrontier Public Previewとして提供されています。利用できるテナントやTeams PowerShellモジュールが限定される可能性があるため、本番導入前に必ず検証環境で確認してください。(GitHub)
Teams Phone Agentの包含/除外番号でできること
InclusionListとExclusionListの動作を整理すると、次のようになります。
| 設定 | スパム判定 | 実際の着信動作 |
|---|---|---|
InclusionListに登録 | 常にスパムとして扱う | Actionで指定した処理を実行 |
ExclusionListに登録 | スパムとして扱わない | 通常のTeams Phone Agentの処理へ進む |
| どちらにも登録しない | 通常のスパム検出に委ねる | スパム判定された場合のみActionを実行 |
たとえば、迷惑営業の番号をInclusionListへ追加しても、ActionがTransferCallToOperatorならオペレーターへ転送されます。番号を完全に遮断したい場合は、次の組み合わせが必要です。
InclusionListへの登録
+
Action = DisconnectCall
反対に、取引先や役員などの番号をExclusionListへ登録すると、その番号はテンプレートによるスパム判定から除外されます。Microsoftの公式ドキュメントでも、InclusionListは常にスパムとみなすE.164番号、ExclusionListはスパムとみなさないE.164番号として説明されています。(Microsoft Learn)
InclusionListで特定番号を常に遮断する条件
InclusionListだけでは着信は切断されない
InclusionListは、対象番号のスパム判定を強制するための設定です。実際に切断、転送などを行うのはActionです。
指定できる主なアクションは次の3種類です。
| Actionの値 | 動作 | 注意点 |
|---|---|---|
DisconnectCall | 着信を切断する | 特定番号を常に遮断する場合に使用 |
TransferCallToOperator | 設定済みオペレーターへ転送する | オペレーター未設定時は切断される |
TransferCallToTarget | 指定した転送先へ転送する | CallTargetの設定が必要 |
特定番号からの着信を常に拒否したい場合は、次のように考えます。
対象番号をInclusionListへ登録
→ 必ずスパム判定
→ ActionをDisconnectCallに設定
→ 着信を切断
一方、迷惑電話を受付担当者へ集約して人間が確認したい場合は、TransferCallToOperatorが選択肢になります。別のコールキューや応答先へ隔離したい場合は、TransferCallToTargetを使用します。(Microsoft Learn)
ExclusionListで特定番号を必ず許可する際の注意点
ExclusionListに登録した番号は、対象テンプレートではスパムとして扱われません。そのため、通常であればスパム判定される可能性がある番号でも、Teams Phone Agentの通常フローへ進ませることができます。
ただし、「必ず許可」という表現は、あくまでこのスパム検出テンプレート上でスパムにしないという意味です。
次のような処理まで無効になるわけではありません。
- Teams Phone Agentの営業時間外フロー
- 通常の切断や転送設定
- テナント単位またはユーザー単位の着信拒否
- 電話番号ルーティングや通信事業者側の制限
- リソースアカウントや転送先の設定不備
また、ExclusionListへの登録は、発信者の本人性を保証するものではありません。重要な操作を電話で受け付ける業務では、番号だけを本人確認手段として扱わず、別の認証手順を維持してください。Teamsの一般的なスパムフィルタリングと着信ブロックも別の仕組みとして管理されます。(Microsoft Learn)
設定前に確認すること
Frontier Public Previewを利用できるか確認する
Teams Phone Agentとスパム検出テンプレートは、現時点ではFrontier Public Preview向けの機能です。
次の状態では、この記事で使用するコマンドレットが表示されないことがあります。
- テナントがFrontier Public Previewの対象ではない
- Teams PowerShellモジュールが古い
- プレビュー機能を利用できない管理アカウントで接続している
- 更新前のモジュールがPowerShellセッションに読み込まれたままになっている
まず、PowerShellとMicrosoftTeamsモジュールの状態を確認します。
$PSVersionTable.PSVersion
Get-InstalledModule MicrosoftTeams -AllVersions
MicrosoftTeamsモジュールを導入していない場合は、次のコマンドを実行します。
Install-Module -Name MicrosoftTeams -Force -AllowClobber
導入済みの場合は更新します。
Update-Module MicrosoftTeams
更新後、新しいPowerShellセッションを開いてTeamsへ接続します。
Connect-MicrosoftTeams
MicrosoftTeamsモジュールは、Windows PowerShell 5.1またはPowerShell 7.2以降がサポートされています。すでにモジュールを読み込んでいるセッションでは更新に失敗することがあるため、その場合はPowerShellを閉じてから新しい管理者セッションを開きます。(Microsoft Learn)
実際のパラメーター名を確認する
Frontier Public Previewでは、ドキュメントと配布中のモジュールで表記が一致しない可能性があります。
実際に利用できるパラメーターを、次のコマンドで確認してください。
Get-Command New-CsMainlineAttendantSpamDetectionTemplate -Syntax
(Get-Command New-CsMainlineAttendantSpamDetectionTemplate).Parameters.Keys |
Sort-Object
現在のMicrosoft Learnでは、構文欄にInclusionScopeとExclusionScopeが表示される一方、パラメーター説明と使用例ではInclusionListとExclusionListが使われています。MicrosoftDocsの更新履歴でも、電話番号リスト用のパラメーターとしてInclusionListとExclusionListが追加されています。プレビュー期間中は、実行環境で取得した構文を優先してください。(Microsoft Learn)
また、New-CsAutoAttendantにもInclusionScopeとExclusionScopeがありますが、こちらはディレクトリ検索で対象にするユーザー範囲の設定です。スパム電話番号の包含/除外リストとは別物なので、混同しないように注意してください。(Microsoft Learn)
電話番号をE.164形式へ変換する
InclusionListとExclusionListには、E.164形式の電話番号を登録します。
日本の電話番号では、国内用の先頭0を外し、国番号+81を付けます。
| 国内表記 | E.164形式の登録例 |
|---|---|
03-1234-5678 | +81312345678 |
06-1234-5678 | +81612345678 |
090-1234-5678 | +819012345678 |
登録時は、次の形式に統一するのが安全です。
- 先頭は
+ - 続けて国番号と電話番号
- 国内番号の先頭
0は除く - ハイフンや空白は入れない
- 全角数字を使わない
E.164の国際番号は最大15桁で構成されます。また、スパム検出テンプレートの番号リストではワイルドカードがサポートされていないため、+8190*のような範囲指定ではなく、個々の番号を登録する必要があります。(ITU)
特定番号を常に遮断・必ず許可する設定手順
番号リストを作成する
次の例では、2件を常にスパムとして切断し、1件をスパム判定から除外します。
# 形式説明用のサンプルです。実運用の番号へ置き換えてください。
$inclusionList = @(
"+81312345678"
"+819012345678"
)
$exclusionList = @(
"+81612345678"
)
番号の形式と重複を事前に検証します。
$allNumbers = @(($inclusionList + $exclusionList) |
Sort-Object -Unique)
# 「+」に続いて1~15桁の数字であることを確認
$invalidNumbers = @(
$allNumbers |
Where-Object { $_ -notmatch '^\+[1-9]\d{1,14}$' }
)
if ($invalidNumbers.Count -gt 0) {
throw "E.164形式ではない番号があります: $($invalidNumbers -join ', ')"
}
# 同じ番号が両方のリストにないことを確認
$overlapNumbers = @(
$inclusionList |
Where-Object { $exclusionList -contains $_ }
)
if ($overlapNumbers.Count -gt 0) {
throw "InclusionListとExclusionListの両方に登録されています: $($overlapNumbers -join ', ')"
}
公開ドキュメントでは、同一番号を両方のリストへ登録した場合の優先順位が明確に示されていません。運用上は、同じ番号を両方へ登録しないことを設定ルールにしてください。
スパム検出テンプレートを作成する
番号を常に遮断するため、ActionにはDisconnectCallを指定します。
$template = New-CsMainlineAttendantSpamDetectionTemplate `
-Name "JP-Agent-Spam-Disconnect" `
-Description "指定番号を常にスパム判定して切断し、信頼済み番号を除外する" `
-EnableSpamDetection $true `
-Action "DisconnectCall" `
-InclusionList $inclusionList `
-ExclusionList $exclusionList
この設定では、次のように動作します。
$inclusionListの番号は常にスパム判定され、切断される$exclusionListの番号はスパム判定から除外され、通常フローへ進む- リスト外の番号は通常のスパム検出結果に従う
テンプレートを作成しただけでは、Teams Phone Agentの着信動作は変わりません。作成後にテンプレートIDを確認し、対象のTeams Phone Agentへ割り当てる必要があります。(Microsoft Learn)
作成したテンプレートを確認する
戻り値と登録内容を確認します。
$template |
Format-List Id, Name, Description, EnableSpamDetection,
Action, InclusionList, ExclusionList
IDを指定して、テナントから再取得することもできます。
Get-CsMainlineAttendantSpamDetectionTemplate `
-Id $template.Id |
Format-List *
テナント内のテンプレートを一覧表示する場合は、IDを省略します。
Get-CsMainlineAttendantSpamDetectionTemplate
テンプレート名だけではなく、必ずId、Action、InclusionList、ExclusionListまで確認してください。似た名称のテンプレートを複数作成すると、誤ったテンプレートを割り当てやすくなります。(GitHub)
新しいTeams Phone Agentへ割り当てる
PowerShellで新しいTeams Phone Agentを作成する場合は、New-CsAutoAttendantのSpamDetectionTemplateIdへテンプレートIDを渡します。
次は、スパム検出に関係する部分を含めた構成例です。
$agent = New-CsAutoAttendant `
-Name "<Teams Phone Agent名>" `
-LanguageId "<サポートされる言語ID>" `
-TimeZoneId "<タイムゾーンID>" `
-DefaultCallFlow $defaultCallFlow `
-EnableMainlineAttendant `
-SpamDetectionTemplateId $template.Id
Name、LanguageId、TimeZoneId、DefaultCallFlowなどは、実際のTeams Phone Agent構成に置き換えてください。SpamDetectionTemplateIdはGUID型で、作成済みスパム検出テンプレートのIDを指定します。(Microsoft Learn)
既存のTeams Phone Agentへ割り当てる
既存のTeams Phone Agentでは、まずAuto Attendantオブジェクトを取得します。
$agentId = [guid]"<Teams Phone AgentのID>"
$agent = Get-CsAutoAttendant -Identity $agentId
$agent |
Select-Object Id, Name, SpamDetectionTemplateId
プレビュー版のオブジェクトにSpamDetectionTemplateIdプロパティが存在することを確認してから更新します。
if ($null -eq $agent.PSObject.Properties["SpamDetectionTemplateId"]) {
throw "現在のモジュールではSpamDetectionTemplateIdプロパティを確認できません。"
}
$agent.SpamDetectionTemplateId = $template.Id
Set-CsAutoAttendant -Instance $agent
Set-CsAutoAttendantは、取得したAuto Attendantオブジェクトのプロパティを変更し、そのオブジェクトをInstanceとして戻す方式です。プレビュー期間中は、更新前後にFormat-List *でプロパティを確認し、構成のバックアップを取ってください。(Microsoft Learn)
既存テンプレートへ番号を追加する方法
既存のスパム検出テンプレートを変更する場合は、次の順序で作業します。
Getで取得
→ オブジェクトのリストを変更
→ Setで保存
InclusionListとExclusionListへ番号を追加する
$templateId = [guid]"<スパム検出テンプレートのID>"
$template = Get-CsMainlineAttendantSpamDetectionTemplate `
-Id $templateId
$numberToAlwaysBlock = "+81312345678"
$numberToAlwaysAllow = "+81612345678"
$template.InclusionList = @(
(@($template.InclusionList) + $numberToAlwaysBlock) |
Sort-Object -Unique
)
$template.ExclusionList = @(
(@($template.ExclusionList) + $numberToAlwaysAllow) |
Sort-Object -Unique
)
Set-CsMainlineAttendantSpamDetectionTemplate `
-Instance $template
Sort-Object -Uniqueを使うことで、同じ番号を重複登録しにくくなります。
InclusionListから番号を削除する
$templateId = [guid]"<スパム検出テンプレートのID>"
$numberToRemove = "+81312345678"
$template = Get-CsMainlineAttendantSpamDetectionTemplate `
-Id $templateId
$template.InclusionList = @(
$template.InclusionList |
Where-Object { $_ -ne $numberToRemove }
)
Set-CsMainlineAttendantSpamDetectionTemplate `
-Instance $template
ExclusionListから番号を削除する
$templateId = [guid]"<スパム検出テンプレートのID>"
$numberToRemove = "+81612345678"
$template = Get-CsMainlineAttendantSpamDetectionTemplate `
-Id $templateId
$template.ExclusionList = @(
$template.ExclusionList |
Where-Object { $_ -ne $numberToRemove }
)
Set-CsMainlineAttendantSpamDetectionTemplate `
-Instance $template
Set-CsMainlineAttendantSpamDetectionTemplateは、取得したテンプレートのプロパティを変更して保存する方式です。Microsoftの例でも、テンプレートを取得し、Actionを書き換えてからSetで保存しています。既存リストを読み込まずに新しい配列だけを代入すると、登録済み番号を消してしまう可能性があるため注意してください。(Microsoft Learn)
設定後に実施するテスト
最低でも、次の3種類の発信元からテストしてください。
| テスト元 | 期待する結果 |
|---|---|
InclusionList登録番号 | DisconnectCallにより切断される |
ExclusionList登録番号 | スパム扱いされず、通常のTeams Phone Agentフローへ進む |
| どちらにも登録していない番号 | 通常のスパム検出とコールフローに従う |
テスト時は、管理台帳の電話番号ではなく、Teams側が実際に認識した発信者番号とリスト値が一致しているか確認します。
たとえば、Direct RoutingやSBCを使用している環境では、番号正規化の結果が想定と異なることがあります。次のような差があると、別の文字列として扱われる可能性があります。
登録値: +819012345678
受信した値: 09012345678
ワイルドカードが使えないため、最終的にTeamsへ渡されるE.164番号を正確に登録することが重要です。
設定後は、テンプレートとTeams Phone Agentの割り当ても再確認します。
Get-CsMainlineAttendantSpamDetectionTemplate `
-Id $template.Id |
Format-List Id, Name, EnableSpamDetection,
Action, InclusionList, ExclusionList
Get-CsAutoAttendant `
-Identity $agentId |
Select-Object Id, Name, SpamDetectionTemplateId
テンプレートIDが一致していなければ、リストを正しく作成しても対象のTeams Phone Agentには反映されません。
Teamsの通常のスパムフィルタリングとの違い
Teamsには、Teams Phone Agentのスパム検出テンプレートとは別に、ユーザー向けCalling Policyのスパムフィルタリングがあります。
| 項目 | Teams Phone Agentのテンプレート | Teams Calling Policy |
|---|---|---|
| 主な対象 | Teams Phone Agentへの着信 | TeamsユーザーへのPSTN着信 |
| 番号の包含/除外 | InclusionList、ExclusionList | 個別番号リストではない |
| スパム判定後の処理 | 切断または転送 | 主に「Spam Likely」の通知 |
| 主な管理方法 | Teams PowerShell | Teams管理センター、Teams PowerShell |
ユーザー向けスパムフィルタリングは、スパムの可能性がある着信を検出して「Spam Likely」と表示する仕組みであり、着信ブロックそのものとは異なります。
対してTeams Phone Agentのテンプレートでは、DisconnectCallを指定することで、スパム判定された通話を実際に切断できます。両者を同じ設定として扱わないようにしてください。(Microsoft Learn)
よくある設定ミスと対処方法
| 症状 | 主な原因 | 確認する内容 |
|---|---|---|
| InclusionListの番号が切断されない | Actionが切断以外 | ActionがDisconnectCallか確認 |
| ExclusionListの番号が接続できない | 別の着信拒否やコールフローが適用 | テナント設定、ルーティング、営業時間外処理を確認 |
| 番号を登録しても一致しない | E.164形式ではない | +81、先頭0の除去、空白・ハイフンを確認 |
InclusionListパラメーターが見つからない | モジュールまたはドキュメントの差 | Get-Commandで実際のパラメーターを確認 |
| テンプレートを作ったが動作しない | Agentへ未割り当て | SpamDetectionTemplateIdを確認 |
| 一部の既存番号が消えた | リスト全体を上書きした | Getで既存値を取得してから配列へ追加 |
| モジュールを更新できない | 現在のセッションで読込済み | PowerShellを閉じて新しいセッションで更新 |
| 転送先へ送られず切断される | オペレーターやCallTargetの未設定 | Actionと転送先オブジェクトを確認 |
特に注意したいのが、InclusionScopeとInclusionListの混同です。Teams Phone Agentのディレクトリ検索範囲を変更しても、発信者番号のスパム判定には使用されません。
変更前のバックアップと緊急停止
Frontier Public Previewの機能を本番に近い環境で使用する場合は、変更前のテンプレートを保存しておくと安全です。
$templateId = [guid]"<スパム検出テンプレートのID>"
$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
Get-CsMainlineAttendantSpamDetectionTemplate `
-Id $templateId |
ConvertTo-Json -Depth 10 |
Set-Content `
-Path ".\SpamDetectionTemplate-$timestamp.json" `
-Encoding UTF8
誤遮断が発生した場合は、テンプレートのスパム検出を無効にする方法があります。
$template = Get-CsMainlineAttendantSpamDetectionTemplate `
-Id $templateId
$template.EnableSpamDetection = $false
Set-CsMainlineAttendantSpamDetectionTemplate `
-Instance $template
無効化後は、対象番号だけでなく通常番号からもテストし、期待した動作へ戻ったことを確認してください。
テンプレートを完全に削除する場合は、対象Teams Phone Agentから割り当てを解除した後に実行します。
Remove-CsMainlineAttendantSpamDetectionTemplate `
-Id $templateId
MicrosoftDocsの更新履歴では、Teams Phone Agentに割り当てられていないテンプレートを削除対象とする旨が示されています。割り当て中のテンプレートを直接削除する運用は避けてください。(Microsoft Learn)
安全に運用するための管理ルール
番号リストは一度設定して終わりではなく、継続的に見直す必要があります。最低限、次の情報を管理台帳へ残してください。
- 登録したE.164番号
InclusionListまたはExclusionListの区分- 登録理由
- 申請者と承認者
- 登録日
- 見直し予定日
- 対象のテンプレートID
- 割り当て先のTeams Phone Agent
一時的にExclusionListへ登録した番号を放置すると、後から用途や所有者が変わってもスパム判定されない状態が残ります。取引先、委託先、イベント窓口などの一時的な番号には、見直し期限を設定するのが安全です。
また、同じ番号をInclusionListとExclusionListの両方へ登録しないこと、変更後は必ず3種類のテスト発信を行うこと、テンプレートIDと割り当て先を記録することを標準手順に含めてください。
Teams Phone Agentで特定番号を常に遮断するには、E.164形式の番号をInclusionListへ登録し、ActionをDisconnectCallに設定します。スパム判定から必ず除外したい番号はExclusionListへ登録します。
実際の作業では、最初にGet-Commandで利用可能なパラメーターを確認し、番号形式とリスト重複を検証してください。その後、テンプレートを作成して対象のTeams Phone Agentへ割り当て、包含番号、除外番号、未登録番号の3パターンで動作確認します。これにより、単なるスパム検出ではなく、業務要件に沿った着信制御として運用できます。

コメント