LoginSignup
2
0

ロジックアプリからマネージド ID を用いて Office 365 ユーザーからメール通知を行う

Last updated at Posted at 2024-03-13

1. はじめに

ロジックアプリからメール通知を行う構成では、標準コネクタで提供されている Office 365 コネクタを用いるケースが多いと思います。Office 365 コネクタを用いた実装はとてもお手軽なのですが、コネクタの認証画面から送信元ユーザー経由で認証を行う必要があり(※初回のみ)、カスタマイズできる項目に限界があるなどの制限があります。
今回、Microsoft Graph API を用いることで、ロジックアプリで設定したマネージド ID 経由でメール送信する手法をご紹介します。

詳細は Microsoft Graph API の user: sendMail の情報を参考としています。

2. [参考] ロジックアプリからメール送信を行うパターン

ロジックアプリからメール送信する方法は幾つかあります。
要件に合った方法を検討して下さい。

方式 Office 365 Azure Communication Services Microsoft Graph API
ロジックアプリ
コネクタ
Office 365 コネクタ Azure Communication Services コネクタ HTTP
O365 ユーザーの作成の必要性 必要 不要 必要
認証方式 ユーザー認証(コネクタ内) 接続文字列 マネージドID

3. 設定方法

Microsoft Graph API を用いて、マネージド ID で通知する流れを以下ご紹介します。

3.1 ロジックアプリ側の作成

  • ロジックアプリを作成し、マネージド ID を有効化します
  • 複数のロジックアプリで同じような通知方式を組むのであれば、ユーザー割り当てマネージド ID を一つ作成し、ロジックアプリに割り当てる方法を検討して下さい

image.png

3.2 Entra ID でマネージド ID に対して権限を与える

マネージド ID に Microsoft Graph 権限の Mail.Send を与えるのですが、2024.3 現在 Azure ポータルから設定することが不可となっており PowerShell / Azure CLI で設定する必要があります。
マネージド ID に対して Graph API の権限を付与する方法は公式 Docs に幾つかサンプルが掲載されています。以下サイトの例からマネージド ID に対して Mail.Send の権限を付与するスクリプトを実行します。

# テナント ID と先ほどメモしたオブジェクト ID を設定
$TenantID="<Entra テナント ID>"
$spID="<ここにマネージド ID の object ID>"

# MS Graph の許可を指定、1 つのみ指定
# 複数必要の場合は「マネージド ID にアクセス許可を設定」のコマンドを繰り返し実施
$PermissionName = "Mail.Send"

# 事前に MS Graph PowerShell にログイン
Connect-MgGraph -TenantId $TenantID -Scopes Application.Read.All,AppRoleAssignment.ReadWrite.All

# Microsoft Graph のサービスプリンシパルを取得
$GraphServicePrincipal = Get-MgServicePrincipal -Filter "DisplayName eq 'Microsoft Graph'" | Select-Object -first 1

# マネージド ID にアクセス許可を設定
$AppRole = $GraphServicePrincipal.AppRoles | Where-Object {$_.Value -eq $PermissionName -and $_.AllowedMemberTypes -contains "Application"}

$params = @{
    PrincipalId = $spID
    ResourceId = $GraphServicePrincipal.Id
    AppRoleId = $AppRole.Id
}

New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $spID -BodyParameter $params

Powershell を実行して無事に成功すると、以下のようなメッセージが出力されます。

PS C:\> .\deploy.ps1
Welcome to Microsoft Graph!
Connected via delegated access using 14d82eec-204b-4c2f-b7e8-296a70dab67e
Readme: https://aka.ms/graph/sdk/powershell
SDK Docs: https://aka.ms/graph/sdk/powershell/docs
API Docs: https://aka.ms/graph/docs
NOTE: You can use the -NoWelcome parameter to suppress this message.
DeletedDateTime Id AppRoleId CreatedDateTime PrincipalDisplayName 
xxxxxxxxxxxxxxx xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 2024/03/13 6:54:58 <マネージドID の名前> 
PS C:\>

実際に Entra ID でマネージド ID に権限が付与されたかどうか確認します。
Entra ID の「すべてのアプリケーション」から「アプリケーションの種別 = マネージドID」でフィルタすると探しやすいです。

image.png

3.3 ロジックアプリで HTTP コネクタを用いて RESTAPI を叩く

マネージド ID に権限を持たせることが出来たので、ロジックアプリ側で HTTP コネクタを用いて RESTAPI を叩くように設定します。
今回、テスト用に以下のようなロジックアプリを作成しています。

  • Reccurence で定期実行
  • MailBody で HTML メール本体
  • HTTP で Microsoft Graph API 経由でメール送信

image.png

HTTP コネクタの設定例です。
image.png
パラメータとして以下を設定しています。

項目 内容
方法 POST
URI https://graph.microsoft.com/v1.0/(送信元メールアドレス)/sendMail
ヘッダー Content-Type : application/json
本文 Graph API のメッセージフォーマット
(JSON) 形式
認証の種類 マネージド ID
マネージド ID システム割り当てマネージド ID
対象ユーザー https://graph.microsoft.com/

設定を行い、ロジックアプリを起動してメール通知が行われることを確認してみます。

image.png

4. カスタマイズ

本文に入る Graph API メッセージフォーマットですが、これだけのパラメータが適用可能です。添付ファイルなどを指定することも出来ます。

{
  "bccRecipients": [{"@odata.type": "microsoft.graph.recipient"}],
  "body": {"@odata.type": "microsoft.graph.itemBody"},
  "bodyPreview": "string",
  "categories": ["string"],
  "ccRecipients": [{"@odata.type": "microsoft.graph.recipient"}],
  "changeKey": "string",
  "conversationId": "string",
  "conversationIndex": "String (binary)",
  "createdDateTime": "String (timestamp)",
  "flag": {"@odata.type": "microsoft.graph.followupFlag"},
  "from": {"@odata.type": "microsoft.graph.recipient"},
  "hasAttachments": true,
  "id": "string (identifier)",
  "importance": "String",
  "inferenceClassification": "String",
  "internetMessageHeaders": [{"@odata.type": "microsoft.graph.internetMessageHeader"}],
  "internetMessageId": "String",
  "isDeliveryReceiptRequested": true,
  "isDraft": true,
  "isRead": true,
  "isReadReceiptRequested": true,
  "lastModifiedDateTime": "String (timestamp)",
  "parentFolderId": "string",
  "receivedDateTime": "String (timestamp)",
  "replyTo": [{"@odata.type": "microsoft.graph.recipient"}],
  "sender": {"@odata.type": "microsoft.graph.recipient"},
  "sentDateTime": "String (timestamp)",
  "subject": "string",
  "toRecipients": [{"@odata.type": "microsoft.graph.recipient"}],
  "uniqueBody": {"@odata.type": "microsoft.graph.itemBody"},
  "webLink": "string",

  "attachments": [{"@odata.type": "microsoft.graph.attachment"}],
  "extensions": [{"@odata.type": "microsoft.graph.extension"}],
  "multiValueExtendedProperties": [{"@odata.type": "microsoft.graph.multiValueLegacyExtendedProperty"}],
  "singleValueExtendedProperties": [{"@odata.type": "microsoft.graph.singleValueLegacyExtendedProperty"}]
}

5. 制限事項など

色々と制限事項が重なるので、本番運用検討されている方は以下 Docs を参照下さい。

  • 10000 リクエスト / 10 分 かつ / ユーザー / App ID

参考URL

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0