📧

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

に公開

1. はじめに

今回は、前回のOutlookプラグイン調査レポートに続き、「Gmailプラグイン」 について調査しました。

本プラグインを使用することで、Dify上でGmailの送受信・管理が可能になります。

具体的に:

・受信した問い合わせメールをLLMが分析して「営業」や「サポート」に自動で振り分け、適切な担当者へ転送したり、要確認のフラグを立てたりする。
・打ち合わせのお礼としてメール内容の概要と添付ファイルを渡すだけで、LLMがメール文を生成し、添付ファイル付きの「下書き」としてGmailに保存する。

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

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

インストールの前に:

  • このプラグインは、Difyの開発元であるLangGenius社が提供する公式プラグインです。
  • SaaS版・Community版(※)で利用できます。
    ※Dify v1.7.0以降、本プラグインと互換性あり。
  • 本プラグインが使用しているAPIについて

Gmailプラグイン導入において権限ごとにできることをまとめると、以下のようになります。

プラットフォーム / 観点 必要な役割・権限 この権限でできること (Gmailプラグイン関連)
1. Google Cloud (GCP)
システム構築側
GCP プロジェクト作成者
(または編集者・オーナー)
「接続口の作成」
・Dify用のプロジェクト作成とGmail APIの有効化。
・OAuth同意画面の作成。
・認証情報(Client ID / Secret)の発行。
2. Google Workspace
セキュリティ管理側
Google Workspace特権管理者 「接続の許可」
・1.で作ったGCPプロジェクトを「信頼できるアプリ」として登録。
・APIアクセスの制限解除(組織のセキュリティポリシーでブロックされている場合)。
3. Dify
ツール設定側
Dify ワークスペース
管理者 / オーナー
「連携の完了」
・GCPで発行したID/SecretをDifyに登録・保存する。
・認証ボタンを押してGoogleログインを行い、DifyとGmailの連携(認可)を完了できる。
・Gmailノードで使用するアカウントの切り替え管理

インストール手順

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

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

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

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

Googleアカウント連携 (OAuth認証)

インストールが完了したら、DifyとGoogleアカウントを「OAuth 2.0」というセキュアな認証方式を通してで連携させます。

設定は(A)Google側と(B)Dify側の両方で必要です。

(A)Google側での事前設定(GCP)

まず、Google Cloud Platform (GCP) 側でプロジェクトを作成し、「Gmail API」を有効化します。認証情報の設定でリダイレクトURI(Dify側で確認できます)を登録し、そこで発行された「クライアントID」と「クライアントシークレット」を控えておきます。

(B)Dify上での認証

次に、DifyのGmailツール設定画面で、(A)で取得したIDとシークレットを入力します。最後に[認証する]ボタンからGoogleアカウントでログインし、アクセス権限を許可すれば連携完了です。

詳細な手順はこちらをご覧ください: Gmail Plugin - Dify Marketplace

3. 主な活用例

活用例1:問い合わせメールの自動分類・転送

概要:
「お問い合わせ」という件名で届く未読メールを検知し、LLMが本文を読んで「営業」か「カスタマーサポート」かを判断。適切な担当部署へ転送するワークフローです。判断がつかない場合は、人が確認するためのフラグを立てます。

活用シーン:

  • 代表アドレスに届く多種多様なメールの振り分け業務の効率化
  • 緊急度の高いサポートメールと、対応不要な営業メールの選別
  • 担当部署へのエスカレーション作業の効率化

何ができるか:

  • 特定の件名(例:「お問い合わせ」)の未読メールを検索・取得
  • メール本文の内容から、送信者の意図(営業/サポート/その他)をLLMが分類
  • 「営業」なら営業チーム、「サポート」ならサポート担当へ、件名にタグを付けて自動転送
  • 分類不能なメールにはGmail上で重要フラグ(スター)を付与し、見落としを防止

ワークフロー例

ワークフロー解説
  1. [開始]: 手動で開始。
  2. [Gmailメッセージを検索]: 件名が「お問い合わせ」かつ「未読」のメールを検索し、最新1件を取得します。
  3. [ID取得 (Code)]: 検索結果のJSONから、処理に必要な「メッセージID」と「件名」をPythonコードで抽出します。
  4. [Gmailメッセージの詳細を取得]: IDを元に、メールの「本文」や「送信元アドレス」を取得します。
  5. [本文・送信元抽出 (Code)]: LLMに渡しやすいよう、JSONデータから本文テキストと送信元アドレスを抽出・整形します。
  6. [LLM (分類)]: メール本文を読み込み、「営業」「サポート」「その他」のいずれかに分類します。
  7. [IF/ELSE]: 分類結果に応じて処理を分岐させます。
    • 分岐1 (営業):
      • Gmailメッセージを送信: 件名に [営業転送] を付与し、営業チームのアドレスへ転送します。
    • 分岐2 (サポート):
      • Gmailメッセージを送信: 件名に [サポート転送] を付与し、サポート窓口へ転送します。
    • 分岐3 (その他/不明):
      • Gmailメッセージにフラグを立てる: 元のメールにスター(flag)を付け、後で人間が確認できるようにします。
  8. [回答]: どの処理を行ったかを結果として出力します。
    記事の文字数上限により、こちらのDSLファイルはありません。

実行結果

  • 顧客対応メールの場合
    LLMが「サポート」と判断し、カスタマーサポートチーム宛に転送処理が完了します。

    Dify上で実行結果を報告

    転送完了

  • 判断に迷うメールの場合
    「その他」と判断され、受信トレイの該当メールにスターが付きます。

    Dify上で実行結果を報告

    スター(フラグ)設定完了


活用例2:メール下書き作成アシスタント

概要:
「下書きの新規作成」か「下書き一覧の確認」かを選択できるワークフローです。
新規作成時は、メール内容の要約テキストから、ビジネスシーンに適した丁寧なメール本文を生成します。また、オプションでファイルを添付し、下書きに保存可能です。下書き一覧の確認では、既存の下書きをキーワードで検索し、検索結果のIDや件名、本文抜粋をリストアップできます。

活用シーン:

  • 要点の入力から商談相手に送るメールを作成
  • 日報や定期連絡など、構成が決まっているメールの作成
  • 埋もれてしまった下書きの検索と確認

何ができるか:

  • モード選択: 「下書きを新規作成」または「下書きを検索して一覧表示」を選択可能
  • AIによる本文生成: 要件を入力するだけで、整ったビジネスメール本文を生成
  • 添付ファイル対応: Dify上でアップロードしたファイルを、そのままGmailの下書きに添付
  • 下書き管理: 既存の下書きをキーワード検索し、IDや件名、本文抜粋をリストアップ

ワークフロー例

ワークフロー解説
  1. [開始]: 以下の入力フィールドを受け付けます。
    • 処理内容(新規作成/一覧表示)
    • 宛先、件名、検索クエリ
    • 添付ファイル、本文概要
  2. [IF/ELSE]: 「処理内容」で選択されたモードによって分岐します。
  3. 分岐A:下書きを新規作成
    • [LLM-本文生成]: 入力された「本文概要」を元に、ビジネス敬語を用いた丁寧なメール本文を生成します。
    • [Gmail下書きを作成]: 宛先、件名、そしてLLMが生成した本文を使って下書きを作成します。
    • [Gmail下書きに添付ファイルを追加]: 作成された下書きIDに対し、アップロードされたファイルを添付します。
    • [回答]: 作成完了メッセージと、生成された本文を表示します。
  4. 分岐B:下書き一覧を表示
    • [Gmail下書きを一覧表示]: 入力された「検索クエリ」に基づいて下書きを検索・取得します。
    • [テンプレート-出力整形]: 取得したJSONデータ(件名、ID、本文抜粋など)を見やすいMarkdown形式のリストに変換します。
    • [回答]: 整形された下書きリストを表示します。
      DSLファイルはこちら

実行結果

  • 新規作成モード

    入力フィールドを埋めて実行

    Dify上で実行結果を報告


作成された下書き

  • 一覧表示モード
    検索クエリを入力して実行すると、該当する下書きメールがリスト形式でチャット画面に表示され、IDや内容を即座に確認できます。

    クエリを任意で設定し検索

    下書きフォルダ


    新しい順に出力。下書き4は宛先を記入していないので空欄

※将来的な活用例:トリガー機能を使用してメール受信->送信を自動化

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

概要:
「メールの受信」というイベントをきっかけに、Difyのワークフローを自動起動させる仕組みです。専用の「プラグイントリガー」や、より高度な連携が可能な「Webhookトリガー」で受信を検知し、LLMが受信内容を解析、分類、そして適切な返信メールを自動で生成・送信します。

具体的なワークフローについては、今後Gmail Triggerの動作確認ができ次第加筆予定です!

4. Gmailプラグイン - 各ノードの説明

Gmailプラグインで使用できるノードは全部で8種類です。
機能別に分類すると、以下の3つに分けられます。

  • メール作成・送信関連: 4種類
  • 受信メール処理関連: 3種類
  • 下書き取得: 1種類

このセクションでは、これらの各ノードについて解説します。

0. 全ノード共通事項

  • メールの宛先はメール作成機能を持つ各ノードで指定

    • 該当ノード:
      • 「Gmailメッセージを送信」ノード
      • 「Gmail下書きを作成」ノード
    • 例:「Gmailメッセージを送信」ノード設定画面
  • 複数宛先の指定:
    宛先、CC、BCCは、メールアドレスをカンマ(,)区切りで入力することで複数設定可能です。

  • 入力変数は定数・変数ともに設定可能:
    各ノードの入力変数には定数だけでなく変数も設定できます。

  • IDの連携が重要:
    多くのノードは message_iddraft_id をキーにして動作します。これらは検索ノード等の出力に含まれます。

  • 返信先について:
    メッセージを送信するノードでは返信先が指定できます。
    返信先を設定すると受信したメッセージの返信ボタンから直接、送信者ではない人(=返信先に設定された人)に返信できます。

  • 出力変数text:
      各ノード処理結果のステータス(成功/失敗)やエラーメッセージをtext変数として出力します。

  • 出力変数id:
    ID(draft_id, message_id, thread_id)を含むノードの出力は、抽出処理を挟むことなく、後続ノードでID情報として活用できます。

  • 出力変数json:
    各ノードでメールの詳細情報はjson形式で出力されます。

    • Gmailメッセージを検索/Gmail下書きを一覧表示の json:
    • 検索結果(メールや下書き)のリストがJSON配列として返されます。
    主な中身:
      - `id`: **メッセージID**。他のノード(詳細取得やフラグ立て)でメールを指定するために使います。
      - `thread_id`: スレッド(一連のやり取り)のID。
      - `snippet`: メールの本文の要約(スニペット)。
      - `subject`: メールの件名。
      - `from`: 送信者のメールアドレス。
      - `to`: 宛先のメールアドレス。
      - `date`: メールの送信日時。
      - `body`: `include_body`を`true`に設定した場合のみ、ここに本文が入ります。デフォルト(`false`)の場合は空文字列 `""` になります。
    
    • Gmailメッセージの詳細を取得の json:
    • メッセージ詳細のリストがJSON配列として返されます。
    主な中身:
      - `body`: メールの**完全な本文**。
      - `subject`: 件名。
      - `from`: 送信者。
      - `to`: 宛先。
      - `cc`: CCの宛先。
      - `bcc`: BCCの宛先。
      - `date`: 日付。
      - `id`: メッセージID。
      - `snippet`: 本文の要約。
      - `attachments`: **添付ファイルのリスト**(配列)。添付ファイルがある場合、ここにファイル名やMIMEタイプなどの情報が入ります。
    
    • これらのjson形式の出力から特定の情報を取り出すためには、間に「コード実行」ノードを挟んでPythonコードでデータをパース(解析)する方法があります。

1. Gmailメッセージを検索 (search_messages)

Gmailの検索演算子を使用して、条件に一致するメールを検索・取得します。

  • 主な機能:
    • 検索クエリで件名、送信者、本文などを検索。
    • 取得件数の制限設定。
    • 本文をリストに含めるかどうかの選択。
    • 結果の並び替え(日付順など)の指定。
  • 設定:
    • 検索クエリ: Gmailの検索ボックスで使う検索文字列(from:やsubject:など)。(必須)
    • 最大結果数: 取得するメールの最大数(デフォルト: 20)。(任意)
    • メール本文を含める: trueにすると結果に本文を含めます(デフォルト:false)。(任意)
    • 並び替え: date (日付順)、from (送信者順)、subject (件名順) から選択(デフォルト: date)。(任意)

2. Gmailメッセージの詳細を取得 (get_message)

特定のメール1件の完全な詳細情報を取得します。

  • 主な機能:

    • メールIDを指定して詳細情報を取得。
    • 本文の全文を取得。
    • 送信者、受信者、CC、BCC情報を取得。
    • 添付ファイル情報(ID、名前、サイズなど)を取得。
  • 設定:

    • メッセージID: 「Gmailメッセージを検索」ノードなどで取得したメッセージの一意のID。(必須)
    • メール本文を含める: trueにすると本文を含めます(デフォルト: true)。(任意)
    • 添付ファイルの詳細を含める: trueにすると添付ファイルの詳細情報を含めます(デフォルト: false)。(任意)

3. Gmailメッセージを送信 (send_message)

指定した宛先にメールを即時送信します。

  • 主な機能:
    • 宛先、件名、本文を指定して送信。
    • CC、BCCの設定。
    • 返信先の指定。
  • 制約:
    • ファイル添付不可。
  • 設定:
    • 宛先(受信者): 受信者のメールアドレス。(必須)
    • 件名: メールの件名。(必須)
    • メール本文: メールの本文(プレーンテキスト)。(必須)
    • CC(カーボンコピー): CCのアドレス。(任意)
    • BCC(ブラインドカーボンコピー): BCCのアドレス。(任意)
    • 返信先: 返信先のアドレス(送信者と異なる場合)。(任意)

4. Gmail下書きを作成 (draft_message)

メールを送信せずに、下書きとして保存します。

  • 主な機能:
    • 宛先、件名、本文を指定して下書き保存。
    • CC、BCC、返信先の設定。
    • 後続処理用に下書きIDを出力。
  • 設定:
    • 宛先(受信者): 下書きの宛先。(任意)
    • 件名: 下書きの件名。(任意)
    • メール本文: 下書きの本文。(任意)
    • CC(カーボンコピー): 下書きのCC。(任意)
    • BCC(ブラインドカーボンコピー): 下書きのBCC。(任意)
    • 返信先: 下書きの返信先。(任意)

5. Gmail下書きに添付ファイルを追加 (add_attachment_to_draft)

作成済みの下書きメールにファイルを添付します。

  • 主な機能:

    • 下書きIDを指定してファイルを添付。
    • 添付時のファイル名を変更可能。
    • Dify上のファイル変数をアップロード。
  • 設定:

    • 下書きID: 「Gmail下書きを作成」ノードなどで取得したID。(必須)
    • 添付するファイル: Difyのファイルアップロード機能などで渡されたファイル変数。(必須)
    • 添付ファイル名: 添付ファイルに付けるカスタム名(指定しない場合は元のファイル名)。(任意)

6. Gmail下書きを送信 (send_draft)

作成済みの下書きメールを指定して送信します。

  • 主な機能:

    • 下書きIDを指定して送信を実行。
  • 設定:

    • 下書きID: 「Gmail下書きを作成」または「添付ファイルを追加」ノードで取得したID。(必須)

7. Gmailメッセージにフラグを立てる (flag_message)

特定のメールにスター(重要マーク)を付ける、または外します。

  • 主な機能:
    • メッセージIDで対象のメールを指定。
    • スターを付ける(flag)、外す(unflag)の選択。
  • 設定:
    • メッセージID: 「Gmailメッセージを検索」ノードなどで取得したID。(必須)
    • アクション: flag (スターを追加) または unflag (スターを削除) を選択(デフォルト: flag)。(必須)

8. Gmail下書きを一覧表示 (list_drafts)

作成済みの下書きを一覧で表示します。

  • 主な機能:
    • 検索クエリで特定の下書きを絞り込み。
    • 取得件数の制限設定。
    • 下書きの本文を含めるかどうかの選択。
  • 設定:
    • 最大結果数: 取得する下書きの最大数(デフォルト: 10)。(任意)
    • メール本文を含める: trueにすると結果に本文を含めます。(任意)
    • 検索クエリ: 下書きをフィルタリングするための検索文字列(from:やsubject:など)。(任意)

5. Q&A

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

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

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

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

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

A: Dify上での認証」に使用したGoogleアカウントになります

Q: OAuthトークンの有効期限は?

A: GCPでの設定によります。

  • GCPのOAuth同意画面で、ステータスを「Testing」にしている場合、Googleの仕様により7日間で認証が無効になります。この場合、7日ごとにDifyのGmail設定画面で再度「認証する」ボタンを押してログインし直す必要があります。(※GCPでのID/Secretの作り直しは不要です)
  • 企業などのGoogle Workspaceアカウントで、ステータスを「Internal」に設定できる場合は、この7日制限はなくなり、一度認証すれば継続的に利用可能です。
  • 詳しくは参考資料をご覧ください。

機能面に関するQ&A

Q: 送信するメールのUIをリッチにできますか?

A: プレーンテキストのみ可能です。

本プラグインはHTML形式のメール送信には対応していません。また、Markdown形式などにも対応していません。
そのためLLMに対して、「罫線や記号を使ったテキストのみでレイアウトを成形する」といった指示を出すことで、見やすく整ったメールを作成することが可能です。

Q: 添付ファイルは送れますか?

A: 送れます

「下書きに添付ファイルを追加」ノードを使います。
Difyの開始ノードでアップロードしたファイル変数をこのノードに渡すことで、メールに添付できます。
添付できるファイル数は最大10個、1ファイル当たりのサイズ上限は15MB(ドキュメント形式の場合)です。

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

A: 使い分けられます。

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

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

  1. ノード右上の選択画面(画像では「ワークスペースのデフォルト」)を開く
  2. 設定したいアカウント(画像では「Auth2」または「Auth3」)を選択

※Difyの管理者以上の権限がないとアカウントの登録(認証)・アカウントの切り替えができません。
参考:「2. Gmailプラグインを利用するための設定」>「インストールの前に:

Q: 大量のメールを送信することはできますか?

A: 可能ですが、Google側の送信制限に注意が必要です。

Gmail APIには技術的な使用量制限と、アカウント自体の送信数制限の2つが存在します。

詳しくはこちら
  • APIの使用量制限: Gmail APIには「1日あたり10億クォータユニット」という枠がありますが、「送信」は1通あたり100ユニットを消費します。また、短時間に大量のリクエストを送ると「User-rate limit(秒間250ユニット等)」に抵触し、エラー(429 Too Many Requests)が返る可能性があります。
  • アカウントの送信制限: API経由であっても、Googleはアカウント自体の送信上限(無料版: 約500通/日、Workspace: 約2,000通/日)を適用します。

Q: 一度に送信できるメールの最大サイズは?

A. Gmail APIの公式リファレンスには、メッセージ全体の具体的な最大サイズ値は明記されていません。

ただし、添付ファイルのサイズ上限については最大25MBまでであると公式ドキュメントに記載されています。
なお、Difyでファイルを添付する場合、このGmail側の制限とは別に、Dify側のファイルアップロードサイズ上限が適用されます。

Q: 一度に検索できるメールの件数は?

A: 最大100件です。

Q: ワークフローの実行からメールが実際に処理(送信・フラグ立て)されるまでにかかる時間は?

A: 実行時間は、利用するLLMの応答速度やワークフローの処理内容によって異なります

公式なパフォーマンス保証はありませんが、私が本記事の活用例を実行した際の「実測値」では、以下のようになりました。

  • 活用例1(問い合わせメールの自動分類・転送): 約3秒
  • 活用例2(メール下書き作成アシスタント):
    • 新規作成モード:約5秒
    • 一覧表示モード:約2秒
      ※環境により変動します。

Q: Google Apps Script (GAS) との違いは?

A: 「LLM(AI)」が使えるか、が最大の違いです。

GASは「毎日定時にメールを送る」といったルールベースの処理は得意ですが、GAS単体ではAIが使用できないため「メールの文面を読んで文脈を理解する」「丁寧な返信文を一から考える」といったタスクは苦手です。Difyを使えば、GAS単体では難しかった「内容の理解と生成」を伴うメール業務の効率化が実現できます。

Q: メールを取得した際にスレッドはどのように扱われますか?

A: スレッド単位ではなく、「個別のメール」単位で扱われます。

ただし、実質的に画像のようにスレッド全体を取得できます。
それは、「検索条件にヒットしたメールのうち、最新の1件」を取得する際、そのメール本文に過去の履歴がすべて「引用」として含まれているためです。

  • 具体例:
    例えば、「スレッド2」で検索したとすると、以下の手順で処理が行われます。
  1. 検索がヒット: Gmailの仕様上、「スレッド2」は2つ目のスレッドだけでなく、それを引用している「スレッド3」や「スレッド4(最新)」のメール本文にも含まれています。
  2. 新しい順にソート: メッセージ検索ノードは、ヒットしたメール(スレッド2, 3, 4)を「受信日時が新しい順」に並べ替えます。(並び替えをdateにしているため)
  3. 1件取得: ノードの制限が1の場合、メッセージ一覧ノードは一番新しい「スレッド4」のメール1件だけを取得します。
    その結果、取得するのは「スレッド4」のメール1件ですが、その本文には「スレッド1〜3」がすべて引用されているため、結果的にスレッド全体の履歴が見える、という仕組みです。

    マスク部分には送信者の氏名とメールアドレスが記載

6. おわりに

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

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

7. 参考

参照した記事

本記事で説明した活用例のDSLファイル

文字数上限により、活用例2のみとなります。

活用例2
app:
  description: ''
  icon: 🤖
  icon_background: '#FFEAD5'
  mode: advanced-chat
  name: 技術ブログ_Gmail2
  use_icon_as_answer_icon: false
dependencies:
- current_identifier: null
  type: marketplace
  value:
    marketplace_plugin_unique_identifier: langgenius/openai:0.2.7@9031bbf9b37d9f6341a20c78a8bd18d686afd3ff627545496c3557705419d084
    version: null
- current_identifier: null
  type: marketplace
  value:
    marketplace_plugin_unique_identifier: langgenius/dify-gmail:0.2.0@b07b113a879e020e68928b96960bf892218b0146c911be437d38581fd3ac5ab9
    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: if-else
      id: 1763683255508-source-1763685743152-target
      source: '1763683255508'
      sourceHandle: source
      target: '1763685743152'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: if-else
        targetType: llm
      id: 1763685743152-true-1763685769030-target
      source: '1763685743152'
      sourceHandle: 'true'
      target: '1763685769030'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: llm
        targetType: tool
      id: 1763685769030-source-1763685790601-target
      source: '1763685769030'
      sourceHandle: source
      target: '1763685790601'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: if-else
        targetType: tool
      id: 1763685743152-false-1763685936812-target
      source: '1763685743152'
      sourceHandle: 'false'
      target: '1763685936812'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: tool
        targetType: tool
      id: 1763685790601-source-1763686378774-target
      source: '1763685790601'
      sourceHandle: source
      target: '1763686378774'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: tool
        targetType: answer
      id: 1763686378774-source-1763685887146-target
      source: '1763686378774'
      sourceHandle: source
      target: '1763685887146'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: template-transform
        targetType: answer
      id: 1763687498928-source-1763686673248-target
      source: '1763687498928'
      sourceHandle: source
      target: '1763686673248'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: tool
        targetType: template-transform
      id: 1763685936812-source-1763687498928-target
      source: '1763685936812'
      sourceHandle: source
      target: '1763687498928'
      targetHandle: target
      type: custom
      zIndex: 0
    nodes:
    - data:
        selected: false
        title: 開始
        type: start
        variables:
        - default: ''
          hint: ''
          label: 処理内容
          max_length: 48
          options:
          - 下書きを新規作成
          - 下書きを検索して一覧表示
          placeholder: ''
          required: true
          type: select
          variable: select
        - hint: ''
          label: 宛先
          max_length: 48
          options: []
          placeholder: ''
          required: true
          type: text-input
          variable: to_address
        - default: ''
          hint: ''
          label: 検索クエリ
          max_length: 48
          options: []
          placeholder: ''
          required: false
          type: text-input
          variable: search_query
        - hint: ''
          label: 件名
          max_length: 48
          options: []
          placeholder: ''
          required: true
          type: text-input
          variable: subject
        - allowed_file_extensions: []
          allowed_file_types:
          - document
          allowed_file_upload_methods:
          - local_file
          - remote_url
          default: ''
          hint: ''
          label: 添付ファイル
          max_length: 5
          options: []
          placeholder: ''
          required: false
          type: file-list
          variable: file
        - hint: ''
          label: 本文概要
          max_length: 200
          options: []
          placeholder: ''
          required: true
          type: text-input
          variable: abstract
      height: 218
      id: '1763683255508'
      position:
        x: 80
        y: 282
      positionAbsolute:
        x: 80
        y: 282
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: contains
            id: a2c7fab3-a03f-4ac3-aee1-a58aaf5253cd
            value: 新規作成
            varType: string
            variable_selector:
            - '1763683255508'
            - select
          id: 'true'
          logical_operator: and
        selected: false
        title: IF/ELSE
        type: if-else
      height: 124
      id: '1763685743152'
      position:
        x: 380
        y: 282
      positionAbsolute:
        x: 380
        y: 282
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        context:
          enabled: false
          variable_selector: []
        model:
          completion_params: {}
          mode: chat
          name: gpt-4o
          provider: langgenius/openai/openai
        prompt_template:
        - edition_type: basic
          id: 7a07959d-9fc6-4d90-834f-0b639cefac0c
          role: system
          text: 'あなたは熟練したビジネスパーソンであり、メールライティングの専門家です。

            以下の[メールの概要]に基づき、ビジネスシーンに適した丁寧で明確なメール本文のみを作成してください。


            # 制約事項

            - **範囲**: 「相手の宛名(〇〇様)」から書き始め、「結びの言葉(よろしくお願いいたします等)」で終えてください。

            - **除外**: 件名、および末尾の署名(自分の名前や会社名)は一切含めないでください。

            - **形式**: Gmailで送信するため、装飾のないプレーンテキスト形式で出力してください。

            - **レイアウト**: 読みやすさを考慮し、適切な改行と空行を入れてください。

            - **文体**: 相手に敬意を払いつつ、用件が伝わりやすい「礼儀正しく、かつ簡潔な」ビジネス敬語を使用してください。


            # メールの概要

            {{#1763683255508.abstract#}}


            # 生成するメール本文'
        selected: false
        title: LLM-本文生成
        type: llm
        vision:
          enabled: false
      height: 88
      id: '1763685769030'
      position:
        x: 710
        y: 273
      positionAbsolute:
        x: 710
        y: 273
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        is_team_authorization: true
        paramSchemas:
        - auto_generate: null
          default: ''
          form: llm
          human_description:
            en_US: Email addresses of the primary recipients (comma-separated for
              multiple recipients)
            ja_JP: 主要な受信者のメールアドレス(複数の受信者はカンマで区切る)
            pt_BR: Endereços de email dos destinatários principais (separados por
              vírgula para múltiplos destinatários)
            zh_Hans: 主要收件人的电子邮件地址(多个收件人用逗号分隔)
          label:
            en_US: To (Recipients)
            ja_JP: 宛先(受信者)
            pt_BR: Para (Destinatários)
            zh_Hans: 收件人
          llm_description: Email addresses of the primary recipients. Multiple recipients
            can be separated by commas. Can be left empty for drafts.
          max: null
          min: null
          name: to
          options: []
          placeholder: null
          precision: null
          required: false
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: ''
          form: llm
          human_description:
            en_US: Subject line of the email (can be left empty for drafts)
            ja_JP: メールの件名(下書きは空にできます)
            pt_BR: Linha de assunto do email (pode ser deixada em branco para rascunhos)
            zh_Hans: 电子邮件的主题行(草稿可以留空)
          label:
            en_US: Subject
            ja_JP: 件名
            pt_BR: Assunto
            zh_Hans: 主题
          llm_description: Subject line of the email message. Can be left empty for
            drafts.
          max: null
          min: null
          name: subject
          options: []
          placeholder: null
          precision: null
          required: false
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: ''
          form: llm
          human_description:
            en_US: Content of the email message (can be left empty for drafts)
            ja_JP: メールメッセージの内容(下書きは空にできます)
            pt_BR: Conteúdo da mensagem de email (pode ser deixado em branco para
              rascunhos)
            zh_Hans: 电子邮件的内容(草稿可以留空)
          label:
            en_US: Email Body
            ja_JP: メール本文
            pt_BR: Corpo do Email
            zh_Hans: 邮件正文
          llm_description: Content of the email message. Can be left empty for drafts.
            Currently supports plain text format.
          max: null
          min: null
          name: body
          options: []
          placeholder: null
          precision: null
          required: false
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: ''
          form: llm
          human_description:
            en_US: Email addresses to carbon copy (comma-separated for multiple recipients)
            ja_JP: カーボンコピーするメールアドレス(複数の受信者はカンマで区切る)
            pt_BR: Endereços de email para cópia (separados por vírgula para múltiplos
              destinatários)
            zh_Hans: 要抄送的电子邮件地址(多个收件人用逗号分隔)
          label:
            en_US: CC (Carbon Copy)
            ja_JP: CC(カーボンコピー)
            pt_BR: CC (Cópia)
            zh_Hans: 抄送
          llm_description: Email addresses to carbon copy. Multiple recipients can
            be separated by commas. Leave empty if not needed.
          max: null
          min: null
          name: cc
          options: []
          placeholder: null
          precision: null
          required: false
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: ''
          form: llm
          human_description:
            en_US: Email addresses to blind carbon copy (comma-separated for multiple
              recipients)
            ja_JP: ブラインドカーボンコピーするメールアドレス(複数の受信者はカンマで区切る)
            pt_BR: Endereços de email para cópia oculta (separados por vírgula para
              múltiplos destinatários)
            zh_Hans: 要密送的电子邮件地址(多个收件人用逗号分隔)
          label:
            en_US: BCC (Blind Carbon Copy)
            ja_JP: BCC(ブラインドカーボンコピー)
            pt_BR: BCC (Cópia Oculta)
            zh_Hans: 密送
          llm_description: Email addresses to blind carbon copy. Multiple recipients
            can be separated by commas. Leave empty if not needed.
          max: null
          min: null
          name: bcc
          options: []
          placeholder: null
          precision: null
          required: false
          scope: null
          template: null
          type: string
        - auto_generate: null
          default: ''
          form: llm
          human_description:
            en_US: Email address for replies (if different from sender)
            ja_JP: 返信用のメールアドレス(送信者と異なる場合)
            pt_BR: Endereço de email para respostas (se diferente do remetente)
            zh_Hans: 回复的电子邮件地址(如果与发件人不同)
          label:
            en_US: Reply-To
            ja_JP: 返信先
            pt_BR: Responder Para
            zh_Hans: 回复地址
          llm_description: Email address for replies. If not specified, replies will
            go to the sender's email address.
          max: null
          min: null
          name: reply_to
          options: []
          placeholder: null
          precision: null
          required: false
          scope: null
          template: null
          type: string
        params:
          bcc: ''
          body: ''
          cc: ''
          reply_to: ''
          subject: ''
          to: ''
        provider_id: langgenius/dify-gmail/dify-gmail
        provider_name: langgenius/dify-gmail/dify-gmail
        provider_type: builtin
        selected: false
        title: Gmail下書きを作成
        tool_configurations: {}
        tool_description: 後で編集して送信できるGmailの下書きメールを作成
        tool_label: Gmail下書きを作成
        tool_name: draft_message
        tool_node_version: '2'
        tool_parameters:
          bcc:
            type: mixed
            value: ''
          body:
            type: mixed
            value: '{{#1763685769030.text#}}'
          cc:
            type: mixed
            value: ''
          reply_to:
            type: mixed
            value: ''
          subject:
            type: mixed
            value: '{{#1763683255508.subject#}}'
          to:
            type: mixed
            value: '{{#1763683255508.to_address#}}'
        type: tool
      height: 52
      id: '1763685790601'
      position:
        x: 1012
        y: 273
      positionAbsolute:
        x: 1012
        y: 273
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        answer: '## 下書きを作成しました。Gmailで確認してください。

          本文:

          {{#1763685769030.text#}}'
        selected: false
        title: 回答
        type: answer
        variables: []
      height: 134
      id: '1763685887146'
      position:
        x: 1614
        y: 273
      positionAbsolute:
        x: 1614
        y: 273
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        is_team_authorization: true
        paramSchemas:
        - auto_generate: null
          default: 10
          form: llm
          human_description:
            en_US: Maximum number of drafts to retrieve (1-100)
            ja_JP: 取得する下書きの最大数(1-100)
            pt_BR: Número máximo de rascunhos a recuperar (1-100)
            zh_Hans: 要检索的最大草稿数量(1-100)
          label:
            en_US: Maximum Results
            ja_JP: 最大結果数
            pt_BR: Resultados Máximos
            zh_Hans: 最大结果数
          llm_description: Maximum number of drafts to return (between 1 and 100,
            default is 10)
          max: null
          min: null
          name: limit
          options: []
          placeholder: null
          precision: null
          required: false
          scope: null
          template: null
          type: number
        - auto_generate: null
          default: 0
          form: llm
          human_description:
            en_US: Whether to include the full email body content in the results (may
              increase response time)
            ja_JP: 結果にメール本文の完全な内容を含めるかどうか(応答時間が増加する可能性があります)
            pt_BR: Se deve incluir o conteúdo completo do corpo do email nos resultados
              (pode aumentar o tempo de resposta)
            zh_Hans: 是否在结果中包含完整的邮件正文内容(可能会增加响应时间)
          label:
            en_US: Include Email Body
            ja_JP: メール本文を含める
            pt_BR: Incluir Corpo do Email
            zh_Hans: 包含邮件正文
          llm_description: Set to true to include full email body content, false to
            include only headers and metadata. Including body content will increase
            response time.
          max: null
          min: null
          name: include_body
          options: []
          placeholder: null
          precision: null
          required: false
          scope: null
          template: null
          type: boolean
        - auto_generate: null
          default: ''
          form: llm
          human_description:
            en_US: Optional Gmail search query to filter drafts (e.g., 'subject:meeting',
              'to:example@gmail.com')
            ja_JP: 下書きをフィルタリングするオプションのGmail検索クエリ(例:'subject:meeting'、'to:example@gmail.com')
            pt_BR: 'Consulta de pesquisa opcional do Gmail para filtrar rascunhos
              (ex: ''subject:meeting'', ''to:example@gmail.com'')'
            zh_Hans: 可选的Gmail搜索查询来过滤草稿(例如:'subject:meeting'、'to:example@gmail.com')
          label:
            en_US: Search Query
            ja_JP: 検索クエリ
            pt_BR: Consulta de Pesquisa
            zh_Hans: 搜索查询
          llm_description: Optional Gmail search query to filter drafts. Use Gmail
            search operators like 'subject:', 'to:', 'from:', 'has:attachment'. Leave
            empty to get all drafts.
          max: null
          min: null
          name: search_query
          options: []
          placeholder: null
          precision: null
          required: false
          scope: null
          template: null
          type: string
        params:
          include_body: ''
          limit: ''
          search_query: ''
        provider_id: langgenius/dify-gmail/dify-gmail
        provider_name: langgenius/dify-gmail/dify-gmail
        provider_type: builtin
        selected: false
        title: Gmail下書きを一覧表示
        tool_configurations: {}
        tool_description: Gmailの下書きフォルダから下書きメールを一覧表示し、オプションのフィルタリングをサポート
        tool_label: Gmail下書きを一覧表示
        tool_name: list_drafts
        tool_node_version: '2'
        tool_parameters:
          include_body:
            type: constant
            value: true
          limit:
            type: constant
            value: 10
          search_query:
            type: mixed
            value: '{{#1763683255508.search_query#}}'
        type: tool
      height: 52
      id: '1763685936812'
      position:
        x: 710
        y: 400
      positionAbsolute:
        x: 710
        y: 400
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        is_team_authorization: true
        paramSchemas:
        - auto_generate: null
          default: null
          form: llm
          human_description:
            en_US: The unique identifier of the Gmail draft to add the attachment
              to
            ja_JP: 添付ファイルを追加するGmail下書きの一意の識別子
            pt_BR: Identificador único do rascunho do Gmail ao qual adicionar o anexo
            zh_Hans: 要添加附件的Gmail草稿的唯一标识符
          label:
            en_US: Draft ID
            ja_JP: 下書きID
            pt_BR: ID do Rascunho
            zh_Hans: 草稿ID
          llm_description: The unique draft ID of the Gmail draft to add the attachment
            to. This ID can be obtained from the list_drafts tool or draft_message
            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: ''
          form: llm
          human_description:
            en_US: Custom name for the attachment (if different from the original
              filename)
            ja_JP: 添付ファイルのカスタム名(元のファイル名と異なる場合)
            pt_BR: Nome personalizado para o anexo (se diferente do nome do arquivo
              original)
            zh_Hans: 附件的自定义名称(如果与原始文件名不同)
          label:
            en_US: Attachment Name
            ja_JP: 添付ファイル名
            pt_BR: Nome do Anexo
            zh_Hans: 附件名称
          llm_description: Custom name for the attachment. If not specified, the original
            filename 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/dify-gmail/dify-gmail
        provider_name: langgenius/dify-gmail/dify-gmail
        provider_type: builtin
        selected: false
        title: Gmail下書きに添付ファイルを追加
        tool_configurations: {}
        tool_description: 既存のGmail下書きメッセージにファイル添付を追加
        tool_label: Gmail下書きに添付ファイルを追加
        tool_name: add_attachment_to_draft
        tool_node_version: '2'
        tool_parameters:
          attachment_name:
            type: mixed
            value: ''
          draft_id:
            type: mixed
            value: '{{#1763685790601.draft_id#}}'
          file_to_attach:
            type: variable
            value:
            - '1763683255508'
            - file
        type: tool
      height: 52
      id: '1763686378774'
      position:
        x: 1314
        y: 273
      positionAbsolute:
        x: 1314
        y: 273
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        answer: '{{#1763687498928.output#}}'
        selected: false
        title: 回答 2
        type: answer
        variables: []
      height: 102
      id: '1763686673248'
      position:
        x: 1358
        y: 400
      positionAbsolute:
        x: 1358
        y: 400
      selected: true
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        selected: false
        template: "### \U0001F4C2 下書き一覧(最新{{ arg1[0].drafts | length }}件)\r\n\r\n\
          {% if arg1[0].drafts %}\r\n{% for draft in arg1[0].drafts %}\r\n**件名:**\
          \ {{ draft.subject | default('(件名なし)') }}\r\n- **ID:** `{{ draft.id }}`\r\
          \n- **宛先:** {{ draft.to | default('(未設定)') }}\r\n- **本文抜粋:** {{ draft.body\
          \ | replace('\\n', ' ') | truncate(50, true, '...') }}\r\n\r\n---\r\n{%\
          \ endfor %}\r\n{% else %}\r\n下書きは見つかりませんでした。\r\n{% endif %}"
        title: テンプレート-出力整形
        type: template-transform
        variables:
        - value_selector:
          - '1763685936812'
          - json
          value_type: array[object]
          variable: arg1
      height: 52
      id: '1763687498928'
      position:
        x: 1060
        y: 400
      positionAbsolute:
        x: 1060
        y: 400
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    viewport:
      x: -32.75774092252789
      y: 53.96813632561674
      zoom: 0.8270233684432657
  rag_pipeline_variables: []

UPGRADE tech blog

Discussion