新しいOutlookではできない高度なメールの振り分けをPower Automate で実現する - アドレス帳に登録されている場合 -

# はじめに
最近Outlook のデスクトップアプリが新しくなりました！
Web版(ブラウザ版)と機能が統一され、画面がすっきりした印象があります。

ただし、一部すっきりしすぎてしまったのか、従来のOutlook で使用できた機能が新しいOutlookでは使用できないことがあります。

https://support.microsoft.com/ja-jp/office/windows-用の新機能と従来の-outlook-機能の比較-de453583-1e76-48bf-975a-2e9cd2ee16dd

例えば、メールの仕訳ルールで使用できる条件が、大きく変わっています。
（従来のクライアントルールはすべて実行できないと思った方がいいです）

- 従来のOutlook
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/49abda88-1abf-8740-36cc-654c9eefedb4.png)
<br>

- 新しいOutlook
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b2f9782d-d947-434f-6aaa-b26b36cb2330.png)

この記事では、新しいOutlookでは現在設定できないルール、**「差出人がアドレス帳に登録されている場合」** をPower Automate を使って実現します。

# フローの作成
フローの全体像です。比較的シンプルに実装できたと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ff4aeaf8-90ab-a648-7d45-5c02e9c926de.png)

<br>

トリガーは新しいメールを受信したときにします。
特に設定は変えていませんが、フォルダーの設定は確認しておいた方がいいと思います。(既定では**Inbox: 受信トレイ**になっています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/3b51a406-073b-418c-b3d9-e5510875384d.png)

<br>

次に、アドレス帳に登録されているかどうかを確認するために、連絡先の一覧を取得します。
いったん全件取得してから、メールの差出人アドレスと一致するかを確認する方法もあるのですが、確認作業が煩雑になるため、あらかじめフィルタークエリを設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ce0d4d79-25f1-ba6a-e801-0641cdf27ffa.png)

```plaintext:フィルタークエリ
emailAddresses/any(a:a/address eq '@{triggerOutputs()?['body/from']}')
```

フィルタークエリを設定しておいたことで、差出人のアドレスと同じメールアドレスの連絡先がそもそも登録されていない場合は、`連絡先の取得 (V2)`アクションの結果は空になります。(何も取得できない)

何も取得できなかったかを条件として判定し、何か取得できた＝アドレス帳に登録されていた場合はフローを途中で終了させることで、その後の処理を実行しないようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/876b0585-4491-df78-bfb8-4a23f890ed84.png)

あとは、フォルダに移動などの処理を最後に設定してあげて終了です。
フォルダに移動の他には、開封済みにマーク・フラグの設定あたりなら、用意されたアクションがあるので簡単ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/733cd732-f533-3c36-25d0-664e4379c9ab.png)

逆に、アクションが用意されていないもの、例えば分類項目の設定なんかは可能ですが難しいです。

https://sasami-axis.hatenablog.com/entry/2023/11/06/093420


# 注意点
Power Automate を使えば、M365ライセンス内でも、複雑なルールを設定することが可能です。
また、従来のOutlook でもできなかった複雑な条件・複雑な処理を行うこともできます。

ただし、フローを作成する難易度に目をつむったとしても、まだ他にも注意すべき点があります。

Power Automate フローは、フロー・アクションの実行が多くなると、**要求の制限**にあたる可能性があります。

https://learn.microsoft.com/ja-jp/power-platform/admin/api-request-limits-allocations

https://tana-techlog.net/?p=212

メールの受信は1日に何度も起こる事象ですので、メールの受信ごとに実行されるこちらのフローは、要求の制限に引っかかる可能性が高いフローと言えます。

フローがやたらに実行されないよう、新しいOutlook でも実装できる仕訳ルールによってメールのフォルダ分けをしておき、限られたメール以外は受信トレイに残らないようにしておくことで、フローの実行を抑えるなどの工夫が必要になるかと思います。

:::note info
たとえば既知のドメインからのメールを特定のフォルダに移動させて、受信トレイに残さないなど
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b4beb233-bd2c-b527-5a47-ba8ebf5c1611.png)

:::

# フローの解説
ここから先は気になる人向けの詳しい解説です。

このフローで難しいところは連絡先を取得するときの、フィルタークエリだと思いますので、この部分を解説します。
```plaintext:フィルタークエリ
emailAddresses/any(a:a/address eq '@{triggerOutputs()?['body/from']}')
```
## フィルタークエリ

このクエリの書き方はMicrosoft Graph API の解説ページで解説されています。

https://learn.microsoft.com/ja-jp/graph/filter-query-parameter?tabs=http

とはいえ、ここで説明を終えてしまうのも不親切かと思うので、Copilotくんの解説を記載しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a8e5229c-c510-984c-e19a-26ac732352bf.png)


>このクエリは、特定の条件に基づいてデータをフィルタリングするためのものです。具体的には、メールアドレスのリストの中から特定のメールアドレスを持つエントリを探すために使用されます。
>
>クエリを分解して説明します：
>1. **$filter=emailAddresses/any(a:a/address eq '@{triggerOutputs()?['body/from']}')**:
>   - **$filter**: データをフィルタリングするための演算子です。
>   - **emailAddresses**: フィルタリング対象のプロパティです。ここでは、メールアドレスのリストを指します。
>   - **any(a:a/address eq '@{triggerOutputs()?['body/from']}')**:
>     - **any(a:a/address eq '...')**: リスト内の任意の要素が条件を満たすかどうかをチェックします。
>     - **a:a/address**: リスト内の各要素のアドレスプロパティを指します。
>     - **eq '@{triggerOutputs()?['body/from']}'**: アドレスが特定の値（ここではトリガーの出力から取得した送信者のアドレス）と等しいかどうかを確認します。
>
>このクエリは、例えば、特定の送信者からのメールをフィルタリングするシナリオで使用されることが多いです。何か他に知りたいことがあれば教えてください！

## フィルタークエリを使わない場合
こんなややこしいフィルタークエリを使わなくても、フローの中で判定処理を組めばいいじゃないか！
と思われる方もいるかもしれませんが、やってみるとかなり面倒な処理が必要になると思います。

というのも、まず`連絡先の取得 (V2)`アクションの結果取得できた連絡先が、登録されている連絡先の全てかどうかはわかりません。
返り値にはサイズ上の制限があるため、登録している連絡先の件数が多い場合は、一度のアクションで取得しきれない可能性があります。

また、仮に全件取得できていたとしても、その後の判定も難しいです。
連絡先には、1つの連絡先に対して複数のメールアドレスを設定することができます。
そのため、取得したすべての連絡先に対して、それぞれが持つすべてのメールアドレスを確認するという、二重の配列構造が必要になります。

また、仮に仮にそれが実現できたとして、1回のフローに対する、判定のためのアクション実行回数が多くなりますので、先の注意点で述べた要求の制限にもかかりやすくなります。

# おわりに
新しいOutlook、良い面もあれば悪い面もあり、賛否が分かれるといったところでしょうか？
（特に日本人の使い方にはまだ不十分な点が多いように感じます）

Power Automate を使っていろいろと補填することはできるのですが、注意点もありますので、サービスの特性に気を付けてあまり凝りすぎないようにしておきましょう！