Workato：Slackに届くメールを自動で要約して閲覧効率UP

# はじめに

Slackには、[チャンネルでメールを受信する機能](https://slack.com/intl/ja-jp/help/articles/206819278-Slack-%E3%81%AB%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B)があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/1c1707cd-cf94-4320-bd06-845d311e5132.png)


障害情報や、メールでしか届かない情報について、メールソフトを見に行かなくても関係者間でキャッチアップすることができ、とても便利ですよね。

この機能を皆さんも活用されていると思いますが、メールが長文だったり、翻訳が必要だったり、稀に重要でない内容のメールが届くケースに遭遇することはないでしょうか？
これらすべてに目を通していくことは物理的にも心理的にも大変なことですよね。

Slackで受信したメールはファイルになって折りたたまれており、クリックして全文を表示できますが、忙しい人にとってはこの一手間が高いハードルとなって立ちはだかることでしょう。

本記事では、この問題をWorkatoで解決すべく、レシピの構築手順を解説します。
メールの要点抽出と翻訳を自動で行う「メール要約ボット」で、情報収集と意思決定をスピーディーに行っていきましょう。

# 「メール要約ボット」を導入するとこんな感じ
Slackアプリをチャンネルに追加しておけば、新着メールにすぐ反応し、ボットが要約メッセージを返します。

### 動作結果１：顧客からのメール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/4847f951-e2f4-4fc0-ab61-8b02927a1dcb.png)

### 動作結果２：メンテナンス情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/6f390244-f729-4d07-9150-42de4bbae8b7.png)

### 動作結果３：製品アップデート情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/9ce8c24d-c495-49f4-92c2-36ada9cb4392.png)


# Workatoレシピ	
実装内容としてはこちらの通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/e0357343-b8c1-427e-af4a-724422ff1925.png)

新着メールがチャンネルに届いたことをきっかけに動き、AIで翻訳・要約し、形を整えてから、チャンネルにメッセージを返します。

# 工程１. SlackAppの設定
次は、Slack側の設定です。
カスタムワークボットを使用するため、こちらの記事の手順に沿って、**WorkatoのCustom OAuth profile**および対応する**SlackApp**を作成します。

https://qiita.com/yabikkio/items/a9d13e5c1ec14be5097f

## 設定のカスタマイズ① イベント追加
SlackAppの初期設定が済んだら、一部の設定についてカスタマイズします。
SlackAppの「**Event Subscriptions**」の画面に遷移します。

### Subscribe to bot events
パブリックチャンネルとプライベートチャンネルで動作させたいので、以下を追加します。
- message.channels
- message.groups


### 設定を保存
画面最下部の[Save Changes]ボタンをクリックして、設定を保存しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/90279cf3-f0ee-41ce-8972-d42a995c1e40.png)

## 設定のカスタマイズ② アプリの見た目を変える
Slack Appの「**Basic Information**」の画面に遷移して、**Display Information**で任意のアイコンに変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/93cfb500-4757-4468-add7-c23d1e6b700e.png)

## アプリをSlackへインストール
SlackAppの「**Install App**」の画面に遷移します。

**インストール権限がある場合**は、「install to `Slakワークスペース名`」ボタンが表示されます。
クリックすることで、アプリのインストールが完了します。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/1af619cc-ba77-4e4b-a6db-de208bd9c778.png">

**インストール権限がない場合**は「Request to Install」ボタンが表示されます。
クリックすることで、リクエストの申請が行われます。管理者の承認が下りたらインストールし、工程４に進みます。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/1da6a3d4-a3b0-474a-8e57-c5fc42735d35.png">

# 工程２. Workbotのコネクション設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/a326a400-7a6d-41a8-aeb0-d3d6dfddef28.png)

- **Custom OAuth profile**：工程３で作成したプロファイルを選択します。
これにより、意図したSlackAppと紐づけることができます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/d05ea4d0-64f3-4f32-90b1-e7474a59abcd.png">

「Connect」ボタンでSlackの画面に遷移し、「許可する」ボタンをクリックします。

コネクションのステータスが`Connected`となれば完了です。

# 工程３. レシピ実装
## Step1）トリガー
- **App**：Workbot for Slack
- **Trigger**：New event
- **Connection**：工程２で作成したコネクション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/d083d259-598f-4a37-8186-aa2ef8665450.png)

### Setup
何のイベントをきっかけに動くかを設定します。
- **Event name**：`Message（message）`を選択します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/54cdb71c-ed81-46ea-9b59-9859afa0e9dc.png">

この設定では、チャンネルの**全メッセージに反応**してレシピが実行されてしまうので、**チャンネルに届いたメールにのみ反応**するよう、条件を追加します。

#### トリガーに条件設定
レシピを保存して、動作確認をしてみると、チャンネルにメールが届いた際にイベント受信した内容としては、次のような形となります。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/bae93339-ab4c-4103-b1bd-7452dce99eb5.png">

主な特徴は、次のとおりです。
- **投稿者が「USLACKBOT」である**
- **「files」フィールドが存在する**

特定の条件を満たす場合にのみトリガーされるようにするには、「Set trigger condition」のトグルをONにします。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/0e7925ae-9a5f-41c8-b861-e00e0d48e23d.png">

２つの条件を追加します。（AND条件）

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/e62b44a4-b933-4ed3-8a6b-73ef212adb81.png">

## Step2）メール件名とメール本文の取得
要約に必要なのは、メール件名とメール本文です。
しかしながら、Step1から出力されるであろうデータピルを見ると、それらが見つかりません。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/189b1be1-f707-4d2d-ad39-c9a34a76588d.png">

メール、正確にはファイルに関する項目がデータピルとして見当たらないのは、この機能がシンプルな文字だけのメッセージを想定しているためです。

これらの情報にアクセスするには、上の階層のデータピルを起点に、JSONのキーを指定します。

具体的には、「Message」オブジェクト内にある「files」というリスト（リストといえど実際は１件だけ）の中の、「subject」（件名）と「plain_text」（本文）という情報を取り出します。

- **App**：Variables by Workato
- **Action**：Create variable

### Setup
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/d33ea2e6-66b9-408c-947d-e93a18684e68.png)
formulaモードを使用して、ブラケット記法でキーを指定し、目的の要素にアクセスしています。

## Step3）メールの要約
- **App**：AI by Workato
- **Action**：Analyze text

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/0d19928b-5da2-41ab-a7d6-c7c1ef4e27cf.png)



### Setup
ソーステキストには、前工程で取得した、メールの件名と本文を設定します。
命令文には、日本語訳して300字以内で要約をしてほしい旨などを設定します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/528ce8a4-e0fd-4c72-98ba-4892c31654ee.png">


## Step4）通知用に整形
Step3と同じアクションを使いますが、処理内容を変えます。
- **App**：AI by Workato
- **Action**：Analyze text

### Setup
ソーステキストには、前工程でAIがアウトプットした要約結果を設定します。
命令文には、メッセージ用に見た目を加工してほしい旨を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/c48c69f6-dc69-4c67-a7b0-1fa8ad81c09c.png)

## Step5）メッセージを投稿
要約メッセージはチャンネルに返信しますが、元のメールとの繋がりが分かるようにスレッド形式にします。さらに、クリックしなくても内容がすぐに読めるよう、「チャンネルにも返信する」設定も行います。

コネクタで提供されている「Post message」アクションでは、「チャンネルにも返信する」というオプションが利用できないため、**カスタムアクション**を使います。

- **App**：Workbot for Slack
- **Action**：Custom action
- **Connection**：工程２で作成したコネクション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/e5f24388-48a3-47b3-9184-901a6df4e2bf.png)

### Setup
「setup manually」をクリックします。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/4fb03d8c-b18d-48d2-ac3b-49fac9322e52.png">


使用するSlackのAPIエンドポイントは、chat.postMessageです。

https://api.slack.com/methods/chat.postMessage


APIのリファレンスに従って、以下のフィールドを設定します。
- **Action name**：任意の名称
- **Method**：POST
- **Path**：chat.postMessage

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/70f95683-41f2-4d80-bb6f-26b544bdcfc1.png)

### Request body parameters （スキーマ定義）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/87cbda22-79bd-4e4c-9739-1214bcc0ca6f.png)

### Data (パラメータ設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/05a8a949-0c91-44f7-a98d-40640b70dd97.png)

これでレシピは完成です！
レシピを保存して、スタートさせましょう。

# 工程４. チャンネルにアプリを追加しておく
対象のチャンネルに、メール要約ボットを参加させます。

## メンションを利用して追加する方法
チャンネルで、メール要約ボットにメンションしてメッセージを送信すると、ボットユーザーに対しての操作メニューが現れます。
「追加する」ボタンクリックすると、チャンネルにアプリが追加されます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/81f91a6d-9a92-47c3-9c67-677aa4c2876e.png">

:::note warn
Slackアプリは、参加したチャンネルのイベントのみ取得することができます。
（参加していないチャンネルのイベントを取得することはできません）
:::

# 留意事項
## AI by Workatoコネクタの制限

本レシピでは、メールの要約(Step3)と、要約結果の加工(Step4)に生成AIを活用しています。
AI by Workatoコネクタには以下の制限があるため、注意が必要です。

https://docs.workato.com/connectors/ai-by-workato.html#limits

### 文字数制限
アクションごとに 128,000 トークン (約 95,000 語) の入力制限が適用されます。
例えば、返信を繰り返したメールは、スレッド形式で過去の長い会話がそのまま引用されているため長文化するケースがありますが、制限文字数を超えるとメール本文の後方が打ち切られる形となり、情報が欠落してしまうことで、要約の品質が低下します。具体的には、重要な情報（結論、アクションなど）が抜ける、内容が不正確になる場合があります。

### レート制限
24時間ごとに各ワークスペースで100アクションまで実行できます。
このレート制限を超えると、エラーが発生します。本レシピでは、計２回のAIアクションが実行されますので、単純計算で１日50通しか処理できません。他のレシピでもAI by Workatoコネクタのアクションを使用している場合は、さらに早く上限に達してしまいます。

## その他の注意点

### タイムアウト
Workatoでは、1つのアクションの実行時間が90秒を超えるとエラーになります。
長文のメールや、複雑な構造を持つメール、あるいは専門用語や技術用語を多用しているメールの場合は、AIの処理時間が長くなり、タイムアウトによるエラーが発生しやすくなります。

### 要約の限界 (あくまで補助ツール)
生成AIは、必ずしも人間が重要と判断する情報を正確に捉えられるとは限りません。要約結果に含まれていなくても、実際には重要な情報がメールに含まれている可能性があります。そのため、生成AIによる要約はあくまで内容を把握するための補助として活用し、最終的には元のメールをきちんと確認することを強く推奨します。

## 対策
これらの制限や注意点を考慮し、必要に応じて別途OpenAIやGoogle Geminiなどの生成AIサービスを契約の上、該当アクションを置き換える方法が有効です。


# おわりに

チャンネルに届く大量のメールを、もっと手軽にざっと目を通せるようできたらなと思い、ワンクリックの手間を削りました。

このレシピは、まだ発展の余地を残しています。例えば、今後は以下のような拡張も面白そうです。

- メールの内容から重要度を自動判定し、メッセージに色分け（アタッチメントカラー）して、緊急度の高い情報を一目で認識できるようにする
- メールのカテゴリ（例：障害報告、営業連絡、顧客からの問い合わせなど）をAIに判定させ、そのカテゴリに最適化されたプロンプトで要約を行い、さらに精度を高める

今回のレシピが、皆さんの情報収集やコミュニケーションの効率化に少しでもお役に立てれば幸いです。
ぜひご自身の環境に合わせてカスタマイズし、より便利なボットへと進化させてみてください。