📧

【Dify】Outlookプラグイン調査レポート

に公開

1. はじめに

Difyの魅力の一つに、外部サービスと連携するための「プラグイン機能」が挙げられます。

本記事では、 「Outlookプラグイン」 について調査しました。
このプラグインは、Dify上でOutlookメールの送受信・管理を可能にします。

このプラグインで、何ができるようになるか?

一言でいえば、「メール業務を効率化」できます。例えば、

・受信したメールをLLMで分析し、内容に応じて自動返信したり、フラグを立てたりする。
・簡単な指示を出すだけで、LLMが適切なビジネスメール(HTML形式で装飾されたもの)を作成し、指定したファイルを添付して送信する。

などです。

この記事では、導入のための初期設定から、具体的な活用例、Outlookプラグインで使用できる各ノードの詳細、Q&Aまでを解説します。

2. Outlookプラグインを利用するための設定

インストールの前に:

  • このプラグインは、Difyの開発元であるLangGenius社が提供する公式プラグインです。
  • SaaS版・Community版(※)で利用できます。
    ※Dify v1.7.0以降、本プラグインと互換性あり。
  • 本プラグインが使用しているAPIについて:
  • 本プラグインを使用する際、2つの異なる管理者の許可が必要になる可能性があるため、注意が必要です:

    1. Microsoft側の管理者権限
      多くの企業では、IT管理者が許可していない外部アプリケーション(今回の場合は dify-outlook-plugin)による自社のメール情報へのアクセスをセキュリティポリシーで禁止しています。以下の画面が表示された場合、ユーザー自身では認証を完了できません。組織の設定によっては「承認の要求」ボタンが表示され、そこから要求を送れることもありますが、いずれにせよ組織のIT管理者への連絡と承認作業が必須となります。
    1. Dify側の管理者権限
      Difyでは、セキュリティの観点から、プラグインの認証情報(OAuthの資格情報など)を管理できる権限を制限しています。具体的には、Difyの「OAuth認証を使用する」ボタンから認証情報を登録・管理できるのは、ワークスペースの「管理者」または「オーナー」権限を持つユーザーのみです。
      「メンバー」や「エディター」権限のユーザーは、ワークフローを編集・実行できても、プラグインの認証設定自体を変更することはできません。
  • まとめ
    「管理者」が持つ権限と、それによって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側の管理者が「アカウントの連携設定」を行う、というステップが必要です。

インストール手順

  1. Difyのワークスペースで 画面右上> [プラグイン] を開きます。

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

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

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

実行結果

今回はキーワードを指定せず、実行しました。これにより、受信トレイ内の最新メール1件を取得して処理を実行します。

  • 分岐1(自動返信 可 /返信 要)

    ▲返信完了

    ▲実際に送信(受信)したメール





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

    ▲返信の下書きを作成


▲作成された下書き


▲受信したメールに期限付きでフラグを設定





  • 分岐3(返信 不要)

    ▲返信不要

    ▲受信したメールに完了のフラグを設定

活用例2:リッチテキストメール作成と添付ファイルの自動送信

概要:
Difyのチャット画面から「宛先」「件名」「添付ファイル」そして「本文に関する簡単な指示」を入力するだけで、LLMが指示を元にレイアウトの整ったメールを生成し、ファイルを添付して送信するワークフローです。

何ができるか:

  • 「〇〇さんに、資料送付の件で」といった簡単な指示から、丁寧なビジネスメール本文を生成。
  • 生成されたプレーンテキストの本文を、LLMがさらに見やすくHTML形式でメールを整形。
  • Difyにアップロードしたファイルを、メールに自動で添付。
  • メールの作成からファイル添付、送信までをワンストップで実行。

ユースケース:

  • 請求書・見積書・提案資料など、定型的なファイル送付業務の効率化
  • 営業の商談後フォローアップや人事の採用通知など、体裁の整ったメール作成

ワークフロー例

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

実行結果


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

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

▲HTMLで装飾されたメールを送信

遭遇したエラーについて

【検証中に遭遇したエラーについて】

今回、ワークフローを構築し実行した際に「下書き送信(Send Draft)」ノードで送信できないというエラーに遭遇しました。画面上では宛先が入っているにもかかわらず、「To recipients are required(宛先が必要です)」と返されてしまう現象です。

結論としては、MS Graph APIの仕様とDifyプラグインの挙動における相性の問題が原因であると考えられます。

▼ 今後の対策と推奨フロー
現状、この「下書き作成 → 送信」の2段階フローはAPIの仕様上非常に不安定です。
そのため、以下の代替案での運用を推奨します。

  1. 「メッセージ送信(Send Email)」ノードで一括実行する

    下書きを経由せず、作成と同時に送信まで完結させることでIDの変動エラーを回避できます。

  2. 「下書き作成」までを自動化し、送信は手動で行う

    人間が内容を確認したい場合は、Difyの処理を下書き作成までにとどめ、送信ボタンはOutlook上で人間が押す運用にします。

※なお、現状の「メッセージ送信」ノードではファイルの添付が行えないため、その点でも運用フローの調整が必要です。

ちなみに私は今回、「下書き作成までをフローに任せ、最終的な送信は手動で行う」という運用で対応しました。


※活用例1にトリガー機能を実装してみました!

トリガー機能とは:
トリガー機能は、Difyのバージョン1.10.0より登場した機能です。
この機能によりワークフロー自動実行の「きっかけ」を設定できます。これまでは手動やAPIコールでしか開始できなかったワークフローを、外部システムからのイベント(メール受信など)や、設定したスケジュールに基づき、自動で起動できます。

概要:
メールの受信をきっかけに、受信トレイ内の最新メールをチェック。LLMがその内容を分析し、「自動返信可能」「要確認(下書き作成)」「対応不要」 の3パターンに自動で振り分けるワークフローです。
活用例1と異なり、チャットフローではなく、ワークフローで作成しています。そして、Difyを操作することなく、自動で実行されます。

何ができるか:

  • 新着メールの内容をLLMが自動で理解
  • メールが「自動返信可能か」「人間による確認が必要か」を判定
  • 「自動返信可能」と判定された場合、返信文を自動生成して送信
  • 「要確認」と判定された場合、返信文の下書きを作成し、Outlook上でフラグを設定
  • 「対応不要」と判定された場合、Outlook上で「完了」フラグを設定

ユースケース:

  • FAQや定型的な問い合わせへの一次対応の効率化
  • スパムや情報提供メールなど、返信不要なメールの自動処理
  • 対応が必要なメールだけをフィルタリングし、フラグを立てて見落としを防止

ワークフロー例

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

実行結果

活用例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": "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。
    • 優先度: high, normal, low のいずれかを指定。

9. 下書きメール一覧 (list_draft_emails)

下書きフォルダ内のメールを一覧で取得します。

  • 主な機能:
    • 下書きフォルダ内のメールをリスト形式で取得。
    • 検索クエリや取得件数の制限が可能。
  • 設定:
    • 制限: 取得するメッセージ数を指定(デフォルト10)。
    • 検索: 検索クエリを記入。
    • 添付ファイル情報を含める: 添付ファイル情報を出力に含むか選択。

5. Q&A

セキュリティに関するQ&A

Q: 意図しないメールを送信してしまうリスクは?

A: 意図せずメールを送信するリスクは低いです

  • 実行の安全性: Difyのプラグインは、ワークフローの中で、配置したノードが実行されたときにだけ動作します。今回紹介した手動実行のワークフローであれば、指示を出した場合にのみ動作し、メールが自動で送信されることはありません。

Q: 送信元アカウントはどれになりますか?

A: 「アカウント連携 (OAuth認証)」で認証に使用したMicrosoft 365アカウントになります

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(ドキュメント形式の場合)です。

Q: 複数のOutlookアカウントを使い分けられますか?

A: 使い分けられます

以下の画像右側の「OAuth認証を使用する」より複数のアカウントを登録できます。(※)

それぞれのOutlookノードで画像を参考に以下の操作を行うことで、アカウントを切り替えられます(※)。

  1. ノード右上の選択画面(画像では「ワークスペースのデフォルト」)を開く
  2. 設定したいアカウント(画像では「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つ目のメッセージ」で検索したとすると、以下の手順で処理が行われます。
  1. 検索がヒット: Outlookの仕様上、「2つ目のメッセージ」は2つ目のスレッドだけでなく、それを引用している「3つ目のメッセージ」や「4つ目のメッセージ(最新)」のメール本文にも含まれています。
  2. 新しい順にソート: メッセージ一覧ノードは、ヒットしたメール(メッセージ2, 3, 4)を「受信日時が新しい順」に並べ替えます。
  3. 1件取得: ノードの制限が1の場合、メッセージ一覧ノードは一番新しい「メッセージ4」のメール1件だけを取得します。
    その結果、取得するのは「メッセージ4」のメール1件ですが、その本文には「メッセージ1〜3」がすべて引用されているため、結果的にスレッド全体の履歴が見える、という仕組みです。

6. おわりに

この記事では、DifyのOutlookプラグインの導入設定から、具体的な活用例、各ノードの詳細、気になるQ&Aまで解説しました。

メール業務の効率化に本記事を参考にしていただけますと幸いです!



7. 参考

参照資料

本記事で説明した活用例の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: []
UPGRADE tech blog

Discussion