【Dify】Outlookプラグイン調査レポート
1. はじめに
Difyの魅力の一つに、外部サービスと連携するための「プラグイン機能」が挙げられます。
本記事では、 「Outlookプラグイン」 について調査しました。
このプラグインは、Dify上でOutlookメールの送受信・管理を可能にします。
このプラグインで、何ができるようになるか?
一言でいえば、「メール業務を効率化」できます。例えば、
・受信したメールをLLMで分析し、内容に応じて自動返信したり、フラグを立てたりする。
・簡単な指示を出すだけで、LLMが適切なビジネスメール(HTML形式で装飾されたもの)を作成し、指定したファイルを添付して送信する。
などです。

この記事では、導入のための初期設定から、具体的な活用例、Outlookプラグインで使用できる各ノードの詳細、Q&Aまでを解説します。
2. Outlookプラグインを利用するための設定
インストールの前に:
- このプラグインは、Difyの開発元であるLangGenius社が提供する公式プラグインです。
- SaaS版・Community版(※)で利用できます。
※Dify v1.7.0以降、本プラグインと互換性あり。 - 本プラグインが使用しているAPIについて:
- このプラグインは、Microsoft 365のデータ(メール、カレンダー、ファイルなど)と連携するための標準APIである「Microsoft Graph API」を利用しています。
- 参考:Microsoft Graphのアクセス許可のリファレンス - Microsoft Learn
-
本プラグインを使用する際、2つの異なる管理者の許可が必要になる可能性があるため、注意が必要です:
- Microsoft側の管理者権限:
多くの企業では、IT管理者が許可していない外部アプリケーション(今回の場合は dify-outlook-plugin)による自社のメール情報へのアクセスをセキュリティポリシーで禁止しています。以下の画面が表示された場合、ユーザー自身では認証を完了できません。組織の設定によっては「承認の要求」ボタンが表示され、そこから要求を送れることもありますが、いずれにせよ組織のIT管理者への連絡と承認作業が必須となります。
- Dify側の管理者権限:
Difyでは、セキュリティの観点から、プラグインの認証情報(OAuthの資格情報など)を管理できる権限を制限しています。具体的には、Difyの「OAuth認証を使用する」ボタンから認証情報を登録・管理できるのは、ワークスペースの「管理者」または「オーナー」権限を持つユーザーのみです。
「メンバー」や「エディター」権限のユーザーは、ワークフローを編集・実行できても、プラグインの認証設定自体を変更することはできません。
- Microsoft側の管理者権限:
-
まとめ
「管理者」が持つ権限と、それによってOutlookプラグイン導入においてできることをまとめると、以下のようになります。
| 観点 | 役割(管理者) | 持っている権限 | この権限でできること(Outlookプラグイン関連) |
|---|---|---|---|
| Microsoft 365 側 | Azure AD 管理者 | 組織のアプリ同意ポリシーを管理する権限 | ・Dify(dify-outlook-plugin)が要求するAPIへのアクセスを承認できる。・一般ユーザーがブロックされた管理者の承認要求に対応できる。 ・Azure ADでアプリ登録を行い、Difyからの接続に必要な権限やリダイレクトURIを設定できる。 |
| Dify ワークスペース側 | Dify 管理者 / オーナー | ワークスペースの認証情報を管理する権限 | ・Outlookのノード上で、「OAuth認証を使用する」から、Microsoftアカウントとの連携設定を登録・保存できる。 ・Outlookのノード上で、登録済みの複数のMSアカウントを切り替えることができる。 |
このように、Outlookプラグインを企業で利用するには、Microsoft側の管理者に「アプリの利用」を承認してもらい、Dify側の管理者が「アカウントの連携設定」を行う、というステップが必要です。
インストール手順
-
Difyのワークスペースで 画面右上> [プラグイン] を開きます。

-
画面左上>[マーケットプレイスを探索する]をクリックします。

-
検索バーで「Outlook」と入力します。

-
表示された「Outlook」プラグインの [インストール] ボタンをクリックします。
(カーソルを合わせるとインストールボタンが表示されます)

Outlookアカウント連携 (OAuth認証)
インストールが完了したら、DifyとMicrosoft 365アカウントを連携させます。
この連携は「OAuth 2.0」というセキュアな認証方式で行われるため、Difyは登録したMicrosoftアカウントのパスワードを知ることはありません。
設定は(A)Microsoft 365側と(B)Dify側の両方で必要です。
(A)Microsoft 365側での事前設定(Azure AD)
まず、Microsoft 365(Azure Active Directory)側で「アプリ登録」を行い、Difyからの接続に必要な権限やリダイレクトURI(Dify側で確認できます)を設定します。ここで「クライアントID」や「クライアントシークレット」が発行されるので、メモしておきます。
(B)Dify上での認証
次に、DifyのOutlookプラグイン設定画面で、(A)でメモしたIDやシークレットを入力します。最後に[認証する]ボタンからMicrosoftアカウントでログインし、アクセス許可を承認すれば連携完了です。
詳細な手順はこちらをご覧ください: Outlook Plugin - Dify Marketplace
3. 主な活用例
活用例1:メールの半自動管理
概要:
チャットで指示を出すと、受信トレイに届いた最新メールをチェック。LLMがその内容を分析し、「自動返信可能」「要確認(下書き作成)」「対応不要」 の3パターンに自動で振り分けるワークフローです。
何ができるか:
- 新着メールの内容をLLMが自動で理解
- メールが「自動返信可能か」「人間による確認が必要か」を判定
- 「自動返信可能」と判定された場合、返信文を自動生成して送信
- 「要確認」と判定された場合、返信文の下書きを作成し、Outlook上でフラグを設定
- 「対応不要」と判定された場合、Outlook上で「完了」フラグを設定
ユースケース:
- FAQや定型的な問い合わせへの一次対応の効率化
- スパムや情報提供メールなど、返信不要なメールの自動処理
- 対応が必要なメールだけをフィルタリングし、フラグを立てて見落としを防止
ワークフロー例

ワークフロー解説
- [開始]: 手動実行で、検索キーワードを任意で指定できるようにしています。
- [メッセージ一覧]: 受信トレイから、キーワード検索結果における最新1件のメールを取得します。(キーワードを指定しない場合は受信トレイ内最新1件を取得します。)
- [コード(メールID抽出)]: 取得したメールリストから、処理対象の「メッセージID」だけを抜き出します。
- [メッセージを取得]: メッセージIDを使い、メールの詳細情報(本文、送信者など)を取得します。
- [コード(メール情報整理)]: 取得した詳細情報から、LLMに渡すために「件名」「送信者」「本文」を整理します。
- [LLM (分析)]: メール情報をLLMに渡し、「カテゴリ」「自動返信可否」「返信要否」をJSON形式で判定させます。
-
[IF/ELSE]: LLMの判定結果に応じて、処理を3つに分岐させます。
-
分岐1 (自動返信 可 /返信 要):
-
LLMが返信文を生成 →メールの下書き作成→下書きを送信ノードで自動送信。
-
-
分岐2 (自動返信 不可 / 返信 要):
-
LLMが返信文の「案」を生成 →メールの下書き作成(下書きとして保存) →メールにフラグノードで「要確認」のフラグを設定。
-
-
分岐3 (返信 不要):
-
メールにフラグノードで「完了」フラグ(complete)を設定。
-
-
分岐1 (自動返信 可 /返信 要):
-
[回答]: 実行結果(どの処理を行ったか)をDify上で報告します。
記事の文字数上限により、こちらのDSLファイルはありません。
実行結果
今回はキーワードを指定せず、実行しました。これにより、受信トレイ内の最新メール1件を取得して処理を実行します。
-
分岐1(自動返信 可 /返信 要)

▲返信完了

▲実際に送信(受信)したメール
-
分岐2 (自動返信 不可 / 返信 要)

▲返信の下書きを作成

▲作成された下書き

▲受信したメールに期限付きでフラグを設定
-
分岐3(返信 不要)

▲返信不要

▲受信したメールに完了のフラグを設定
活用例2:リッチテキストメール作成と添付ファイルの自動送信
概要:
Difyのチャット画面から「宛先」「件名」「添付ファイル」そして「本文に関する簡単な指示」を入力するだけで、LLMが指示を元にレイアウトの整ったメールを生成し、ファイルを添付して送信するワークフローです。
何ができるか:
- 「〇〇さんに、資料送付の件で」といった簡単な指示から、丁寧なビジネスメール本文を生成。
- 生成されたプレーンテキストの本文を、LLMがさらに見やすくHTML形式でメールを整形。
- Difyにアップロードしたファイルを、メールに自動で添付。
- メールの作成からファイル添付、送信までをワンストップで実行。
ユースケース:
- 請求書・見積書・提案資料など、定型的なファイル送付業務の効率化
- 営業の商談後フォローアップや人事の採用通知など、体裁の整ったメール作成
ワークフロー例

ワークフロー解説
- [開始]: Difyのチャット画面から、「宛先」「件名」「CCアドレス」「添付ファイル」を受け取ります。
- [LLM (本文生成)]: ユーザーがチャットで入力した「本文の指示」を元に、丁寧なビジネスメールの本文を生成します。
- [LLM (HTML変換)]: ステップ2で生成された本文を、インラインCSSを使ったリッチなメールに変換します。この際、「添付ファイルのご確認」といったセクションを設けるよう指示しています。
-
[メールの下書き作成]:
本文タイプをhtmlに設定し、ステップ3で生成されたHTML本文を使って下書きを作成します。このノードの出力として「下書きID」が生成されます。 - [下書きに添付ファイルを追加]: [開始] ノードで受け取った「添付ファイル」と、ステップ4の「下書きID」を使って、下書きにファイルを添付します。
-
[下書きを送信]: ステップ5でファイルが添付された下書きのID(
draft_id)を使い、メールを送信します。 -
[回答]: 送信が完了したことをDify上で報告します。
DSLファイルはこちら
実行結果

▲宛先アドレスや件名などを入力

▲チャットで指示を出して実行

▲HTMLで装飾されたメールを送信
遭遇したエラーについて
【検証中に遭遇したエラーについて】
今回、ワークフローを構築し実行した際に「下書き送信(Send Draft)」ノードで送信できないというエラーに遭遇しました。画面上では宛先が入っているにもかかわらず、「To recipients are required(宛先が必要です)」と返されてしまう現象です。
結論としては、MS Graph APIの仕様とDifyプラグインの挙動における相性の問題が原因であると考えられます。
▼ 今後の対策と推奨フロー
現状、この「下書き作成 → 送信」の2段階フローはAPIの仕様上非常に不安定です。
そのため、以下の代替案での運用を推奨します。
-
「メッセージ送信(Send Email)」ノードで一括実行する
下書きを経由せず、作成と同時に送信まで完結させることでIDの変動エラーを回避できます。
-
「下書き作成」までを自動化し、送信は手動で行う
人間が内容を確認したい場合は、Difyの処理を下書き作成までにとどめ、送信ボタンはOutlook上で人間が押す運用にします。
※なお、現状の「メッセージ送信」ノードではファイルの添付が行えないため、その点でも運用フローの調整が必要です。
ちなみに私は今回、「下書き作成までをフローに任せ、最終的な送信は手動で行う」という運用で対応しました。
※活用例1にトリガー機能を実装してみました!
トリガー機能とは:
トリガー機能は、Difyのバージョン1.10.0より登場した機能です。
この機能によりワークフロー自動実行の「きっかけ」を設定できます。これまでは手動やAPIコールでしか開始できなかったワークフローを、外部システムからのイベント(メール受信など)や、設定したスケジュールに基づき、自動で起動できます。
概要:
メールの受信をきっかけに、受信トレイ内の最新メールをチェック。LLMがその内容を分析し、「自動返信可能」「要確認(下書き作成)」「対応不要」 の3パターンに自動で振り分けるワークフローです。
活用例1と異なり、チャットフローではなく、ワークフローで作成しています。そして、Difyを操作することなく、自動で実行されます。
何ができるか:
- 新着メールの内容をLLMが自動で理解
- メールが「自動返信可能か」「人間による確認が必要か」を判定
- 「自動返信可能」と判定された場合、返信文を自動生成して送信
- 「要確認」と判定された場合、返信文の下書きを作成し、Outlook上でフラグを設定
- 「対応不要」と判定された場合、Outlook上で「完了」フラグを設定
ユースケース:
- FAQや定型的な問い合わせへの一次対応の効率化
- スパムや情報提供メールなど、返信不要なメールの自動処理
- 対応が必要なメールだけをフィルタリングし、フラグを立てて見落としを防止
ワークフロー例

ワークフロー解説
- [メール受信]: Outlookでメールを受信したタイミングで自動的にワークフローを起動します。(特定の送信者アドレスのみに限定する設定も可能です。)
- [メッセージ一覧]: 受信トレイから最新のメッセージ一覧を取得し、直近のメール情報を確保します。
- [コード(メールID抽出)]: 取得したメッセージリストから、処理対象となるメールの「メッセージID」を抽出します。
- [メッセージを取得]: メッセージIDを使用し、そのメールの詳細情報(本文、送信者、件名など)を取得します。
- [コード(メール情報整理)]: 取得した詳細情報から、LLMに渡すために「件名」「送信者」「本文」などの要素を整理・抽出します。
- [LLM (分析)]: メール情報をLLMに渡し、「カテゴリ」「自動返信可否」「返信要否」をJSON形式で判定させます。
-
[IF/ELSE]: LLMの判定結果に応じて、処理を3つに分岐させます。
-
分岐1 (自動返信 可能 / 返信 必要):
-
LLMが返信文を生成 →メッセージを送信ノードでそのまま自動的に返信メールを送信します。
-
-
分岐2 (自動返信 不可 / 返信 必要):
-
LLMが返信文の「案」を生成 →メールの下書き作成(下書きフォルダに保存) →メールにフラグノードで「要確認(Flagged)」のフラグを設定します。
-
-
分岐3 (返信 不要):
-
メールにフラグノードで、該当メールに「完了(Complete)」フラグを設定し、処理済みとします。
-
-
分岐1 (自動返信 可能 / 返信 必要):
実行結果
活用例1の様にDify上でメッセージが出てくることはなく、受信->処理を自動化。
Difyのアプリを開いていなくても、自動で処理が実行されます。
-
分岐1(自動返信 可 /返信 要)

▲受信メール

▲自動返信
-
分岐2 (自動返信 不可 / 返信 要)

▲受信メール

▲作成された下書き

▲受信したメールに期限付きでフラグを設定
-
分岐3(返信 不要)

▲返信不要->受信したメールに完了のフラグを設定
4. Outlookプラグイン-各ノードの説明
Outlookプラグインで使用できるノードは全部で9種類です。
機能別に分類すると、以下の3つに分けられます。
- メール作成・送信関連: 4種類
- 受信メール処理関連: 4種類
- 下書き取得: 1種類
このセクションでは、これらの各ノードについて解説します。
0. 全ノード共通事項
-
メールの宛先はメール作成機能を持つ各ノードで指定(定数・変数)
- 該当ノード:
- 「メールの下書き作成」ノード
- 「メッセージを送信」ノード
- 例:「メッセージを送信」ノード設定画面
- 該当ノード:
-
宛先、CC/BCC宛先は「,」区切りで複数人指定可能
-
入力変数は定数・変数ともに設定可能
-
出力変数は共通して以下の3つの情報を持つ(中身が空のこともある)

-
text:ツールが生成したコンテンツ
- ノードで行った操作内容・操作の成功/失敗・エラーメッセージが出力される
- 下書き作成ノードでのみ下書きIDが出力
-
files:ツールが生成したファイル
- 本プラグインではファイルを生成するノードがないため通常は空
-
json:ツールが生成したJSON
- 主に取得したメールの詳細情報を出力
- jsonが空でない場合以下の情報(主要なものを抜粋)を持つ
-
body: 本文 -
id: メールを一意に特定するためのID -
is_read: 既読状態 (true/false) -
sender: 送り主の情報(名前、メールアドレス) -
received_datetime: 受信日時 -
subject: 件名
-
-
text:ツールが生成したコンテンツ
詳細(例:メッセージ取得ノード)
{
"text": "Retrieved message: テスト(件名)",
"files": [],
"json": [
{
"attachments": []//添付ファイルの詳細,
"body": "//メール本文",
"body_type": "//本文のタイプ。html or text",
"cc_recipients": []//cc送信先,
"has_attachments": //file添付があるか。true or false,
"id": "//メールのID",
"received": "//受取日時 20xx-xx-xxTxx:xx:xx",
"sender": {
"email": "//送り主のメールアドレス",
"name": "//送り主の名前"
},
"subject": "//件名",
"to_recipients": [
{
"email": "//受信者のメールアドレス",
"name": "//受信者の名前"
}
]
}
]
}
1. メッセージ一覧 (list_messages)

登録したアカウントの受信フォルダにアクセスし、メールをリスト形式で取得します。
-
主な機能:
- 検索クエリで件名、送信者、本文などを検索。
- 取得件数の制限設定。
- 本文をリストに含めるかどうかの選択。
-
設定 :
- フォルダ: 取得したメッセージを一覧表示する際のフォルダ名を設定(任意)。
- 検索: 検索クエリを記入(任意)。
- 制限: 取得するメッセージ数を指定(デフォルト10)。
- 本文を含める: 取得したメールの本文を出力のJSON内に含むか選択。
- (「メッセージを取得」ノードを使わず)このノードだけで全メールの本文もまとめて取得したい場合に有効です。
2. メッセージを取得 (get_message)

「メッセージ一覧」で取得した id を使い、特定のメール1件の詳細情報を取得します。
-
主な機能:
- メールIDを指定して詳細情報を取得。
- 本文の全文を取得(HTML/テキスト形式)。
- 送信者、受信者、CC、BCC情報を取得。
- 添付ファイル情報(ID、名前、サイズなど)を取得。
-
設定:
- メッセージID: 詳細を取得したいメールのIDを指定(通常は「メッセージ一覧」ノードで取得したID)。
3. メールの下書き作成 (draft_email)

メールの下書きを作成します。このノードはメールを送信せず、作成した下書きのIDを出力します。
-
主な機能:
- 宛先(To)、CC、BCC、件名、本文を設定。
- 本文の形式を
textまたはhtmlで選択可能。 - メールの重要度(
low,normal,high)を設定可能。
-
設定:
-
宛先: 宛先メールアドレス。 -
CC/BCC宛先: CC/BCC受信者のメールアドレス(任意)。 -
件名: 件名。 -
本文: 本文。 -
本文タイプ:textまたはhtmlを指定。 -
重要度: メールの重要度(low,normal,high)を指定。
-
-
出力変数:
-
text: 作成された下書きIDが返されます。
-
4. 下書きを送信 (send_draft)

「メールの下書き作成」ノードで作成した下書きなどを、IDを指定して送信します。活用例1, 2で使用している送信方法です。
-
主な機能:
-
下書きIDを指定して、対応する下書きメールを送信。
-
-
設定:
-
下書きID: 送信したい下書きのIDを指定(活用例では下書き作成ノードの出力を渡しています)。
-
5. メッセージを送信 (send_message)

宛先、件名、本文を指定してメールを直接送信します。下書き関連のノードを経由しない、シンプルな送信が可能です。
-
主な機能:
- 下書き作成を経由せず、メールを直接送信。
-
制約:
- CC/BCCの指定やファイル添付ができない。
-
設定:
-
宛先: 宛先メールアドレス。 -
件名: 件名。 -
メッセージ: 本文。
-
6. 下書きに添付ファイルを追加 (add_attachment_to_draft)

既存の下書きメールにファイルを添付します。活用例2で使用しました。
-
主な機能:
-
下書きIDを指定して、下書きにファイルを追加。 - Difyにアップロードしたファイル(変数)を渡すことが可能。
-
-
設定:
-
下書きID: 添付ファイルを追加したい下書きのID。 -
添付するファイル: 添付するファイル(Difyのファイル変数など)。 -
添付ファイル名: 添付ファイルに設定する名前(任意)。
-
7. メールにフラグ (flag_email)

指定したメールIDに対して、Outlook上でフォローアップフラグを設定します。活用例1で使用しました。
-
主な機能:
- メールIDを指定してフラグを設定。
- フラグの状態を
flagged(フラグ設定)またはcomplete(完了)に指定。 - 期限(日数)やフラグメッセージを設定可能。
-
設定:
- メールID: フラグを設定したいメールのID。
- フラグ状態:
flaggedまたはcompleteを指定。 - 期限日数: メールに期限を設定。
- フラグメッセージ: フラグに添えるメモ(任意)。
8. メールの優先度設定 (prioritize_email)

指定したメールIDを持つメールの優先度を設定します。
-
主な機能:
- メールIDを指定して優先度を
high(高)、normal(通常)、low(低)に設定。
- メールIDを指定して優先度を
-
設定:
-
メールID: 優先度を設定したいメールのID。 -
優先度:high,normal,lowのいずれかを指定。
-
9. 下書きメール一覧 (list_draft_emails)

下書きフォルダ内のメールを一覧で取得します。
-
主な機能:
- 下書きフォルダ内のメールをリスト形式で取得。
- 検索クエリや取得件数の制限が可能。
-
設定:
- 制限: 取得するメッセージ数を指定(デフォルト10)。
- 検索: 検索クエリを記入。
- 添付ファイル情報を含める: 添付ファイル情報を出力に含むか選択。
5. Q&A
セキュリティに関するQ&A
Q: 意図しないメールを送信してしまうリスクは?
A: 意図せずメールを送信するリスクは低いです。
- 実行の安全性: Difyのプラグインは、ワークフローの中で、配置したノードが実行されたときにだけ動作します。今回紹介した手動実行のワークフローであれば、指示を出した場合にのみ動作し、メールが自動で送信されることはありません。
Q: 送信元アカウントはどれになりますか?
A: 「アカウント連携 (OAuth認証)」で認証に使用したMicrosoft 365アカウントになります。
- 複数アカウントを登録の場合は「6.Q&A > Q: 複数のOutlookアカウントを使い分けられますか?」をご覧ください。
Q: OAuthトークンの有効期限は?
A: トークン自体はDifyが自動更新し続けます。
Dify v1.7.0以降はOAuth 2.0のリフレッシュトークンに対応しています。アクセストークンが切れても、Difyが内部でリフレッシュトークンを使い、新しいアクセストークンを自動で再取得するため、認証セッションが維持されます。そのため、頻繁に再認証する必要はありません。
ただし、ユーザーによる再認証作業が必要になる場合があります。
「クライアントシークレット」の有効期限(「2. Outlookプラグインを利用するための設定 >(A)Microsoft 365側での事前設定(Azure AD)」で設定した期限)が切れた場合は、新しいクライアントシークレットを再設定し、再認証する作業が必要になります。
機能面に関するQ&A
Q: 送信するメールのUIをリッチにできますか?
A: 可能です。
活用例2で示したように、「メールの下書き作成 (draft_email)」ノードの本文タイプでhtmlを指定してください。LLMにHTML(インラインCSS)を生成させることで、リッチなメールが作成できます。(※)
※LLMに生成させるHTMLはOutlook上で問題なく表示できるよう、プロンプトでインラインCSSや基本的なHTMLタグの使用に限定する必要があります。
Q: 添付ファイルは送れますか?
A: 送れます。
「メールの下書き作成」ノードで下書きを作成した後、「下書きに添付ファイルを追加」ノードを使います。
Difyの開始ノードでアップロードしたファイル変数をこのノードに渡すことで、メールに添付できます。
添付できるファイル数は最大10個、1ファイル当たりのサイズ上限は15MB(ドキュメント形式の場合)です。
- 詳しくはこちら:ファイルアップロード - Dify Docs
Q: 複数のOutlookアカウントを使い分けられますか?
A: 使い分けられます。
以下の画像右側の「OAuth認証を使用する」より複数のアカウントを登録できます。(※)
それぞれのOutlookノードで画像を参考に以下の操作を行うことで、アカウントを切り替えられます(※)。

- ノード右上の選択画面(画像では「ワークスペースのデフォルト」)を開く
- 設定したいアカウント(画像では「Auth2」または「Auth3」)を選択
※Difyの管理者以上の権限がないとアカウントの登録(認証)・アカウントの切り替えができません。「2. Outlookプラグインを利用するための設定」>「インストールの前に:」を参考にしてください。
Q: 大量のメールを送信することはできますか?
A: 制限付きで可能です。
主な制約はDify側ではなく、Microsoft Graph API(Outlookプラグインが内部で使用するAPI)側にあります。
Exchange Onlineの制限により、実質的な上限は1分あたり30メッセージ程度です。
Q: 一度に送信できるメールの最大サイズは?
A: Microsoft Graph API自体は、メッセージ全体の固定的な最大サイズを明確に定めている数値を公開していません。
ただし、添付ファイル単体については最大150MBまでアップロード可能であると公式ドキュメントに記載があります。
なお、Difyでファイルを添付する場合、Graph APIの制限とは別に、Dify側のファイルサイズ上限が適用されます。
Q: 一度に検索できるメールの件数は?
A: 100件です。
メッセージ一覧ノードの制限数を101以上に設定すると以下のエラーメッセージが出力されます。
{
"files": [],
"json": [
{
"data": []
}
],
"text": "Limit must be between 1 and 100."
}
Q: ワークフローの実行からメールが実際に処理(送信・フラグ立て)されるまでにかかる時間は?
A: 実行時間は、利用するLLMの応答速度やワークフローの処理内容によって異なります。
公式なパフォーマンス保証はありませんが、私が本記事の活用例を実行した際の「実測値」では、以下のようになりました。
- 活用例1(メール分析・フラグ設定): 約7秒
- 活用例2(HTMLメール作成・送信): 約6秒
※環境により変動します。
Q: DifyとPower Automateとの違いは?
A: 得意な領域が異なります。違いは以下の通りです。
簡単に言えば、Power Automateは「定型業務の効率化」に強く、Difyは「AIによる非定型業務の効率化」に強いです。
| 対象 | Power Automate | Dify (with Outlook Plugin) |
|---|---|---|
| 得意分野 |
ルールベースの効率化 (Microsoft 365連携) |
LLMを軸とした効率化 (AIとの会話・AIによる判断) |
| 主な例 | 「特定の件名のメールが来る」 →「添付ファイルをSharePointに保存」 →「Teamsに通知」 |
「受信メールの文脈をAIが解釈」 →「クレームか判断+要約を作成」 →「返信文案をAIが生成」 |
Q: メールを取得した際にスレッドはどのように扱われますか?
A: スレッド単位ではなく、「個別のメール」単位で扱われます。
ただし、実質的に画像のようにスレッド全体を取得できます。
それは、「検索条件にヒットしたメールのうち、最新の1件」を取得する際、そのメール本文に過去の履歴がすべて「引用」として含まれているためです。
- 具体例:
例えば、「2つ目のメッセージ」で検索したとすると、以下の手順で処理が行われます。
- 検索がヒット: Outlookの仕様上、「2つ目のメッセージ」は2つ目のスレッドだけでなく、それを引用している「3つ目のメッセージ」や「4つ目のメッセージ(最新)」のメール本文にも含まれています。
- 新しい順にソート: メッセージ一覧ノードは、ヒットしたメール(メッセージ2, 3, 4)を「受信日時が新しい順」に並べ替えます。
-
1件取得: ノードの制限が1の場合、メッセージ一覧ノードは一番新しい「メッセージ4」のメール1件だけを取得します。
その結果、取得するのは「メッセージ4」のメール1件ですが、その本文には「メッセージ1〜3」がすべて引用されているため、結果的にスレッド全体の履歴が見える、という仕組みです。
6. おわりに
この記事では、DifyのOutlookプラグインの導入設定から、具体的な活用例、各ノードの詳細、気になるQ&Aまで解説しました。
メール業務の効率化に本記事を参考にしていただけますと幸いです!
7. 参考
参照資料
- Microsoft Graphのアクセス許可のリファレンス - Microsoft Learn
- ユーザーと管理者の同意の概要 - Microsoft Entra ID
- チームメンバーの管理 - Dify Docs
- Outlook Plugin - Dify Marketplace
- Add OAuth Support to Your Tool Plugin - Dify Docs
- ファイルアップロード - Dify Docs
- What is the maximum number of emails that can be sent per minute using Microsoft Graph API - MicrosoftLearn
- attachment: createUploadSession - Microsoft Graph API
本記事で説明した活用例のDSLファイル
文字数上限により、活用例2のみとなります。
活用例2
app:
description: ''
icon: 🤖
icon_background: '#FFEAD5'
mode: advanced-chat
name: outlook_ブログ用2
use_icon_as_answer_icon: false
dependencies:
- current_identifier: null
type: marketplace
value:
marketplace_plugin_unique_identifier: langgenius/openai:0.0.29@9e17ae8073fe53c282e9dc411e76a3cc52f8e794e4cc2499d204502086871c53
version: null
- current_identifier: null
type: marketplace
value:
marketplace_plugin_unique_identifier: langgenius/outlook:0.2.0@c20058fb4744377ad44f555c4027d8f7d1e40f4fdcb3c99692c5da1d87eb5da0
version: null
kind: app
version: 0.4.0
workflow:
conversation_variables: []
environment_variables: []
features:
file_upload:
allowed_file_extensions:
- .JPG
- .JPEG
- .PNG
- .GIF
- .WEBP
- .SVG
allowed_file_types:
- image
allowed_file_upload_methods:
- local_file
- remote_url
enabled: false
fileUploadConfig:
audio_file_size_limit: 50
batch_count_limit: 5
file_size_limit: 15
image_file_size_limit: 10
video_file_size_limit: 100
workflow_file_upload_limit: 10
image:
enabled: false
number_limits: 3
transfer_methods:
- local_file
- remote_url
number_limits: 3
opening_statement: ''
retriever_resource:
enabled: true
sensitive_word_avoidance:
enabled: false
speech_to_text:
enabled: false
suggested_questions: []
suggested_questions_after_answer:
enabled: false
text_to_speech:
enabled: false
language: ''
voice: ''
graph:
edges:
- data:
isInIteration: false
isInLoop: false
sourceType: start
targetType: llm
id: 1760411275931-source-1762500514102-target
source: '1760411275931'
sourceHandle: source
target: '1762500514102'
targetHandle: target
type: custom
zIndex: 0
- data:
isInIteration: false
isInLoop: false
sourceType: llm
targetType: llm
id: 1762500514102-source-1762500757419-target
source: '1762500514102'
sourceHandle: source
target: '1762500757419'
targetHandle: target
type: custom
zIndex: 0
- data:
isInLoop: false
sourceType: llm
targetType: tool
id: 1762500757419-source-1760584036093-target
source: '1762500757419'
sourceHandle: source
target: '1760584036093'
targetHandle: target
type: custom
zIndex: 0
- data:
isInIteration: false
isInLoop: false
sourceType: tool
targetType: tool
id: 1760584036093-source-1762503820460-target
source: '1760584036093'
sourceHandle: source
target: '1762503820460'
targetHandle: target
type: custom
zIndex: 0
- data:
isInIteration: false
isInLoop: false
sourceType: tool
targetType: tool
id: 1762503820460-source-1760584028012-target
source: '1762503820460'
sourceHandle: source
target: '1760584028012'
targetHandle: target
type: custom
zIndex: 0
- data:
isInLoop: false
sourceType: tool
targetType: answer
id: 1760584028012-source-1762504449338-target
source: '1760584028012'
sourceHandle: source
target: '1762504449338'
targetHandle: target
type: custom
zIndex: 0
nodes:
- data:
selected: false
title: 開始
type: start
variables:
- hint: ''
label: 宛先アドレス
max_length: 48
options: []
placeholder: ''
required: true
type: text-input
variable: recipient_email
- default: ''
hint: ''
label: 件名
max_length: 48
options: []
placeholder: ''
required: true
type: text-input
variable: subject
- default: ''
hint: ''
label: 共有相手のアドレス
max_length: 48
options: []
placeholder: ''
required: false
type: text-input
variable: cc_address
- allowed_file_extensions: []
allowed_file_types:
- image
- document
allowed_file_upload_methods:
- local_file
- remote_url
default: ''
hint: ''
label: 添付するファイルをアップロードしてください
max_length: 10
options: []
placeholder: ''
required: false
type: file-list
variable: attachment_file
height: 167
id: '1760411275931'
position:
x: 30
y: 294
positionAbsolute:
x: 30
y: 294
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 243
- data:
is_team_authorization: true
paramSchemas:
- auto_generate: null
default: null
form: llm
human_description:
en_US: The unique identifier of the draft message to send
ja_JP: 送信する下書きの一意の識別子
pt_BR: O identificador único do rascunho para enviar
zh_Hans: 要发送的草稿消息的唯一标识符
label:
en_US: Draft ID
ja_JP: 下書きID
pt_BR: ID do Rascunho
zh_Hans: 草稿ID
llm_description: The unique identifier of the draft message to send, this
ID can be obtained from the draft_message tool
max: null
min: null
name: draft_id
options: []
placeholder: null
precision: null
required: true
scope: null
template: null
type: string
params:
draft_id: ''
provider_id: langgenius/outlook/outlook
provider_name: langgenius/outlook/outlook
provider_type: builtin
selected: false
title: 下書きを送信
tool_configurations: {}
tool_description: Outlookを使用してMicrosoft Graph API経由で下書きメールを送信する。draft_messageツールから下書きIDが必要です。
tool_label: 下書きを送信
tool_name: send_draft
tool_node_version: '2'
tool_parameters:
draft_id:
type: mixed
value: '{{#1760584036093.text#}}'
type: tool
height: 53
id: '1760584028012'
position:
x: 1345.165535145987
y: 294
positionAbsolute:
x: 1345.165535145987
y: 294
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 243
- data:
is_team_authorization: true
paramSchemas:
- auto_generate: null
default: null
form: llm
human_description:
en_US: Email addresses of the recipients
ja_JP: 受信者のメールアドレス
pt_BR: Endereços de e-mail dos destinatários
zh_Hans: 收件人的电子邮件地址
label:
en_US: To Recipients
ja_JP: 宛先
pt_BR: Destinatários
zh_Hans: 收件人
llm_description: Email addresses of the primary recipients, multiple addresses
should be comma-separated, example, john@example.com, jane@example.com
max: null
min: null
name: to_recipients
options: []
placeholder: null
precision: null
required: true
scope: null
template: null
type: string
- auto_generate: null
default: null
form: llm
human_description:
en_US: Email addresses of CC recipients
ja_JP: CC 受信者のメールアドレス
pt_BR: Endereços de e-mail dos destinatários em cópia
zh_Hans: 抄送收件人的电子邮件地址
label:
en_US: CC Recipients
ja_JP: CC 宛先
pt_BR: Destinatários em Cópia
zh_Hans: 抄送收件人
llm_description: Email addresses of CC recipients, multiple addresses should
be comma-separated, optional
max: null
min: null
name: cc_recipients
options: []
placeholder: null
precision: null
required: false
scope: null
template: null
type: string
- auto_generate: null
default: null
form: llm
human_description:
en_US: Email addresses of BCC recipients
ja_JP: BCC 受信者のメールアドレス
pt_BR: Endereços de e-mail dos destinatários em cópia oculta
zh_Hans: 密送收件人的电子邮件地址
label:
en_US: BCC Recipients
ja_JP: BCC 宛先
pt_BR: Destinatários em Cópia Oculta
zh_Hans: 密送收件人
llm_description: Email addresses of BCC recipients, multiple addresses should
be comma-separated, optional
max: null
min: null
name: bcc_recipients
options: []
placeholder: null
precision: null
required: false
scope: null
template: null
type: string
- auto_generate: null
default: null
form: llm
human_description:
en_US: Subject line of the email
ja_JP: メールの件名
pt_BR: Linha de assunto do e-mail
zh_Hans: 邮件的主题行
label:
en_US: Subject
ja_JP: 件名
pt_BR: Assunto
zh_Hans: 主题
llm_description: The subject line of the email message
max: null
min: null
name: subject
options: []
placeholder: null
precision: null
required: true
scope: null
template: null
type: string
- auto_generate: null
default: null
form: llm
human_description:
en_US: Content of the email message
ja_JP: メールの本文
pt_BR: Conteúdo da mensagem de e-mail
zh_Hans: 邮件的内容
label:
en_US: Body
ja_JP: 本文
pt_BR: Corpo
zh_Hans: 正文
llm_description: The content of the email message, can be plain text or
HTML, if HTML is used, it should be properly formatted
max: null
min: null
name: body
options: []
placeholder: null
precision: null
required: true
scope: null
template: null
type: string
- auto_generate: null
default: text
form: llm
human_description:
en_US: Type of the email body content
ja_JP: メール本文のタイプ
pt_BR: Tipo do conteúdo do corpo do e-mail
zh_Hans: 邮件正文内容的类型
label:
en_US: Body Type
ja_JP: 本文タイプ
pt_BR: Tipo de Corpo
zh_Hans: 正文类型
llm_description: Type of the email body content, can be text or html, default
is text
max: null
min: null
name: body_type
options: []
placeholder: null
precision: null
required: false
scope: null
template: null
type: string
- auto_generate: null
default: normal
form: llm
human_description:
en_US: Importance level of the email
ja_JP: メールの重要度
pt_BR: Nível de importância do e-mail
zh_Hans: 邮件的重要性级别
label:
en_US: Importance
ja_JP: 重要度
pt_BR: Importância
zh_Hans: 重要性
llm_description: Importance level of the email, can be low, normal, or high,
default is normal
max: null
min: null
name: importance
options: []
placeholder: null
precision: null
required: false
scope: null
template: null
type: string
params:
bcc_recipients: ''
body: ''
body_type: ''
cc_recipients: ''
importance: ''
subject: ''
to_recipients: ''
provider_id: langgenius/outlook/outlook
provider_name: langgenius/outlook/outlook
provider_type: builtin
selected: false
title: メールの下書き作成
tool_configurations: {}
tool_description: Outlook でメールの下書きを作成
tool_label: メールの下書き作成
tool_name: draft_email
tool_node_version: '2'
tool_parameters:
bcc_recipients:
type: mixed
value: '{{#1760411275931.cc_address#}}'
body:
type: mixed
value: '{{#1762500757419.text#}}'
body_type:
type: mixed
value: html
cc_recipients:
type: mixed
value: '{{#1760411275931.cc_address#}}'
importance:
type: mixed
value: normal
subject:
type: mixed
value: '{{#1760411275931.subject#}}'
to_recipients:
type: mixed
value: '{{#1760411275931.recipient_email#}}'
type: tool
height: 53
id: '1760584036093'
position:
x: 807.211116452432
y: 294
positionAbsolute:
x: 807.211116452432
y: 294
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 243
- data:
context:
enabled: false
variable_selector: []
model:
completion_params: {}
mode: chat
name: gpt-4o
provider: langgenius/openai/openai
prompt_template:
- id: be06251c-ce20-4087-95f9-679a40718e9d
role: system
text: 'あなたは優秀なビジネスアシスタントです。
以下の指示に基づいて、丁寧なビジネスメールの本文を作成してください。
# 指示
{{#sys.query#}}
# 注意点
- 宛名は指示に含まれる名前(例:〇〇様)を使用してください。
- 結びの挨拶(「何卒よろしくお願い申し上げます。」など)を必ず含めてください。
- 件名・署名は不要です。本文のみを生成してください。
'
selected: false
title: LLM(本文生成)
type: llm
vision:
enabled: false
height: 89
id: '1762500514102'
position:
x: 285.76809308548843
y: 294
positionAbsolute:
x: 285.76809308548843
y: 294
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 243
- data:
context:
enabled: false
variable_selector: []
model:
completion_params: {}
mode: chat
name: gpt-4o
provider: langgenius/openai/openai
prompt_template:
- id: df2af5ef-0308-40dc-a196-63a4d0f5cd64
role: system
text: "あなたはプロのEメールマーケター兼Webデザイナーです。\n以下の「プレーンテキストの本文案」を、ビジネスシーンにふさわしい、リッチで視覚的に分かりやすいHTMLメールに変換してください。\n\
\n# 制約条件\n- 全てのCSSはインライン形式(<div style=\"...\">)で記述してください(多くのメールクライアントが<style>タグをサポートしないため)。\n\
- 企業のロゴや画像は使用せず、CSS(背景色、パディング、マージン、フォントスタイル)のみでデザインを構築してください。\n- 信頼性と清潔感を重視し、過度に派手な色は避けてください。\n\
- 必ずUTF-8でエンコードしてください。\n- コードブロックで囲まないでください\n\n# 変換指示\n1. **全体:**\n \
\ - <div style=\"font-family: Arial, 'Hiragino Sans', 'Hiragino Kaku\
\ Gothic ProN', Meiryo, sans-serif; line-height: 1.6; color: #333;\">\
\ で全体を囲ってください。\n2. **本文:**\n - 挨拶、主要なメッセージ、結びを適切に <p> タグで分けてください。\n\
3. **添付ファイルの言及:**\n - 添付ファイル(ファイル名: {{start.attachment_file.name}})について言及している箇所は、目立つようにデザインしてください。\n\
\ - 例えば、以下のようなボックスデザインを適用してください。\n - <div style=\"background-color:\
\ #f4f7f6; border-left: 5px solid #4CAF50; padding: 15px; margin: 20px\
\ 0;\">\n <strong>添付ファイルのご確認</strong><br>\n 「{{start.attachment_file.name}}」を添付いたしました。ご査収ください。\n\
\ </div>\n4. **強調:**\n - プレーンテキスト内で強調されている箇所(例:お礼、重要な日付など)があれば、<strong>\
\ タグで太字にしてください。\n5. **署名(ダミー):**\n - メールの最後に、以下のような一般的なビジネス署名を模したHTMLを追加してください。\n\
\ - <div style=\"margin-top: 30px; border-top: 1px solid #ddd; padding-top:\
\ 15px; font-size: 0.9em; color: #777;\">\n <p style=\"margin:\
\ 0;\">株式会社〇〇<br>\n (氏名)<br>\n 〒123-4567 東京都〇〇区〇〇 1-2-3<br>\n\
\ Email: info@example.com | Tel: 03-1234-5678</p>\n </div>\n\
\n# プレーンテキストの本文案\n{{#1762500514102.text#}}\n\n# 添付ファイル\n{{#1760411275931.attachment_file#}}\n\
\n# 完成したHTMLコードのみを以下に出力してください\n"
selected: false
title: LLM(HTML変換)
type: llm
vision:
enabled: false
height: 89
id: '1762500757419'
position:
x: 541.536186170977
y: 294
positionAbsolute:
x: 541.536186170977
y: 294
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 243
- data:
is_team_authorization: true
paramSchemas:
- auto_generate: null
default: null
form: llm
human_description:
en_US: The unique identifier of the draft email
ja_JP: 下書きメールの一意の識別子
pt_BR: O identificador único do rascunho de e-mail
zh_Hans: 草稿邮件的唯一标识符
label:
en_US: Draft ID
ja_JP: 下書きID
pt_BR: ID do Rascunho
zh_Hans: 草稿ID
llm_description: The unique identifier of the draft email to add the attachment
to, this ID can be obtained from the list_draft tool
max: null
min: null
name: draft_id
options: []
placeholder: null
precision: null
required: true
scope: null
template: null
type: string
- auto_generate: null
default: null
form: llm
human_description:
en_US: The files to attach to the draft email
ja_JP: 下書きメールに添付するファイル
pt_BR: Os arquivos para anexar ao rascunho de e-mail
zh_Hans: 要附加到草稿邮件的文件
label:
en_US: Files to Attach
ja_JP: 添付するファイル
pt_BR: Arquivos para Anexar
zh_Hans: 要附加的文件
llm_description: The files to attach to the draft email, you can upload
multiple files
max: null
min: null
name: file_to_attach
options: []
placeholder: null
precision: null
required: true
scope: null
template: null
type: files
- auto_generate: null
default: null
form: llm
human_description:
en_US: Optional name for the attachment
ja_JP: 添付ファイルのオプション名
pt_BR: Nome opcional para o anexo
zh_Hans: 可选的附件名称
label:
en_US: Attachment Name
ja_JP: 添付ファイル名
pt_BR: Nome do Anexo
zh_Hans: 附件名称
llm_description: Optional name for the attachment, if not provided, a default
name will be used
max: null
min: null
name: attachment_name
options: []
placeholder: null
precision: null
required: false
scope: null
template: null
type: string
params:
attachment_name: ''
draft_id: ''
file_to_attach: ''
provider_id: langgenius/outlook/outlook
provider_name: langgenius/outlook/outlook
provider_type: builtin
selected: false
title: 下書きに添付ファイルを追加
tool_configurations: {}
tool_description: 下書きメールにファイルを添付
tool_label: 下書きに添付ファイルを追加
tool_name: add_attachment_to_draft
tool_node_version: '2'
tool_parameters:
attachment_name:
type: mixed
value: 添付ファイル
draft_id:
type: mixed
value: '{{#1760584036093.text#}}'
file_to_attach:
type: variable
value:
- '1760411275931'
- attachment_file
type: tool
height: 53
id: '1762503820460'
position:
x: 1082.792883929854
y: 294
positionAbsolute:
x: 1082.792883929854
y: 294
selected: false
sourcePosition: right
targetPosition: left
type: custom
width: 243
- data:
answer: '## 📧 メール送信完了
以下の内容でメールを送信しました。
**宛先:**
{{#1760411275931.recipient_email#}}
**件名:**
{{#1760411275931.subject#}}
**添付ファイル:**
{{#1760411275931.attachment_file.name#}}
---
**生成された本文:**
{{#1762500514102.text#}}'
selected: false
title: 回答
type: answer
variables: []
height: 191
id: '1762504449338'
position:
x: 1617.4450235580866
y: 294
positionAbsolute:
x: 1617.4450235580866
y: 294
selected: true
sourcePosition: right
targetPosition: left
type: custom
width: 243
viewport:
x: -887.8015122217823
y: 32.128413456539306
zoom: 0.796937201371908
rag_pipeline_variables: []
Discussion