MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

メール受信をトリガーとする場合の検討事項

Power Automate に限らず iPaaS を使って何らかの自動化を行う場合、メールの受信をトリガーにするケースはよくあるかと思います。例えばメールに添付されてきたファイルをストレージに保存したり、重要度:高 で届いたら自分のToDoに登録したり。

しかし個人のメールボックスを利用する場合には対象とするメールの条件に該当しないメールも多数届くはずですし、専用のメールボックスを用意した場合でも期待する内容かどうかをある程度判定する必要があるかと思います。

(例えば問合せのメールで、決まったフォーマットになっているかのチェックをして、期待通りならトリガーしたいというケース)

このようなメールを起点にした自動化を行う場合の、特に『どうやってトリガーさせないか』について Power Automate で考えてみます。

業務の数だけパターンがありそうなので、今回はよくあるだろうケースとして以下の5つを題材を取り上げます。

  1. 特定の人・アカウント
  2. 特定の会社 (ドメイン)
  3. 件名の部分一致
  4. 本文に特定の文字列が含まれる
  5. 添付ファイル名が特定の形式 (xlsx等)

1. 特定の人・アカウントからの受信時

特定のアカウントからメールを受信した時のみフローを実行したいのであれば標準で提供されている設定項目で対応できます。

トリガーの左下のメニューをクリックして設定項目を表示し、Fromに対象のアドレスをしていしてください。

f:id:mofumofu_dance:20201028115929p:plain

複数のアドレスを指定したい場合にはセミコロン ( ; ) つなぎで、いずれかの条件にマッチした場合にトリガーされます。

f:id:mofumofu_dance:20201028122839p:plain

2. 特定の会社 (ドメイン) をトリガーにする場合

Fromで指定するのが難しい場合、例えば特定のサービスから自動で送られてくるメールなのだけど@より前が変わるようなケースでは、ドメイン (あるいはアドレスの一部) を使ってトリガー条件を指定することができます。

この場合には標準の設定項目で対応できないため、トリガー全般の設定にある「トリガー条件 (Trigger Conditions)」を利用します。 ※トリガー条件の詳しい説明は以前の投稿をご覧ください。

f:id:mofumofu_dance:20201028124958p:plain

ここではトリガー条件の詳細には踏み込まず、具体的なパターンの設定値を紹介します。

パターン1. ドメインの完全一致

差出人のドメインが指定のドメインと完全一致した場合にフローを実行するのであればトリガー条件には以下を設定します。

@equals(last(split(triggerBody()?['from'],'@')),'example.com')

差出人のアドレス (from) を @マークで分割した後半部分が example.com と一致しているかを判定しています。実際に利用する場合には example.com を変えて利用します。

パターン2. ドメインの部分一致

関連会社などでドメインの一部が共通しているようなケースでは部分一致を取るのが効果的です。この場合には

@contains(last(split(triggerBody()?['from'],'@')),'onmicrosoft.com')

contains()関数を使って差出人のアドレス (from) を @マークで分割した後半部分が onmicrosoft.com を含むかを判定します。

いずれのパターンも、@マークを含めて上の式をトリガー条件の入力ボックスにコピペしていただければ、設定できます。

3. 件名の部分一致を判定

件名の部分一致、うちの会社のチケットシステムだと『XXXXをITグループにアサインしました』 (XXXXはチケット番号) のような件名のメールが送られてくるのですが、これをトリガーにしたい場合にはSubject Filterに一致させたい件名を入力します。

f:id:mofumofu_dance:20201028132457p:plain

ただしこの場合には「ITグループにアサインしました」という文字が件名に含まれていればいつでもトリガーしてしまうので、さらに条件を絞りたい場合にはトリガー条件で件名に関するフィルターを複数指定することも有効です。

トリガー条件は複数設定できて、ANDで適用されるので、件名の部分一致を複数設定したい場合には以下のようなトリガー条件を複数設定してください。

@contains(triggerBody()?['subject'],'XXXXXX')

あるいは件名完全一致の場合には

@equals(triggerBody()?['subject'],'XXXXXX')

4. 本文に特定の文字列が含まれる場合

メールを問い合わせフォームのように使うときにはおおよそ、ボタンクリック→メールの新規作成 (テンプレートの本文入り) みたいな流れになるかと思います。 受け付けるメールはこのテンプレートに従うものだけにしたい!というようなケースでは本文でのフィルターが必要になってきます。

トリガーの標準的な設定では本文を指定する部分がありません。ゆえに、本文に対するフィルターを行いたい場合にはトリガー条件を利用する必要があります。

トリガーには本文に関する値が2箇所 bodyPreviewbody 含まれています。もし本文がHTML形式で送られてくる可能性があるのならばフィルターにはプレーンテキストな bodyPreview を利用することをお勧めします。

f:id:mofumofu_dance:20201028134403p:plain

この bodyPreview に特定の文字列が入っていることを検出するにはトリガー条件に以下のような式を設定してください。

@contains(triggerBody()?['bodyPreview'],'XXXXXX')

もしテンプレートが 複数のブロックで構成されている場合には (例えば氏名を書く部分と、問い合わせ内容を書く部分がある)、件名の場合と同様に複数のトリガー条件を設定すれば、より厳しい条件でのみ発動するフローになります。

f:id:mofumofu_dance:20201028134956p:plain

5. 添付ファイルの拡張子・ファイル形式の指定

標準の設定項目でも「添付ファイルがあるかないか」は設定できます。

f:id:mofumofu_dance:20201028135542p:plain

ここではもう少し踏み込んで、添付ファイルの拡張子、あるいはファイル形式 (MIME type)を指定する方法を記載します。

トリガー内容のデータ(JSON)には添付ファイルに関する情報は下図のように配列形式で含まれています。(複数ファイルがありうるので)

f:id:mofumofu_dance:20201028135824p:plain

残念ながらトリガーの段階では『添付ファイルのどれかがExcelだったら』というような指定はできません。 その場合にはトリガー後にApply to eachを利用するなどして、フローを進行/終了させる必要があります。

単純に1つのファイルだけを対象にして判定するのであれば、トリガー条件に以下のように設定すれば、添付ファイルの拡張子、ファイル形式を判定できます。

ファイルの拡張子

@equals(last(split(triggerBody()?['attachments']?[0]?['name'],'.')),'xlsx')

ファイル形式

@equals(triggerBody()?['attachments']?[0]?['contentType'],'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')

ここで triggerBody()?['attachments']?[0]?['name']triggerBody()?['attachments']?[0]?['contentType'] は、添付ファイルの最初の1つの ファイル名 / ファイルのコンテンツタイプ を表しています。

ファイル名についてはこれをピリオド ( . )で分割して拡張子部分だけを取り出して判定しています。

このように指定すれば、何らかのシステムからExcelでレポートが送られてきたのに限ってトリガー→ファイル保存・データ抽出 のようなフローを作れます。

おわり

今回は Power Automate でメール受信をトリガーにする場合の各種フィルターについて紹介しました。

色々な方法で目的に合わせたフィルターをかけることができますが、もし難しい場合にはメールサービス側の仕分けルールで対応 (特定のフォルダーに移動) して、フォルダーを指定したトリガーにしても良いかもしれません。

使い方はいろいろあるので、ぜひ標準の設定以外にも試してみてください。