「Power Automate で組織外へメール送信」を検知・ブロック・許可する

2/19/2022

Microsoft 365 Office 365 Power Automate

Power Automate のメール送信はいろいろと便利なのですが、大量に外部にメールを送れてしまうことに懸念があり、というケースも。そんなシーンがあれば、「Power Automate で組織外へメール送信」を検知・ブロック・許可する、ということで役立つかもしれません。



検知する

Power Automate でメールを送信するとき、メールのヘッダーに特定の文字列が含まれています。Exchange 管理センターのルールで、その文字列を含んでいる場合は、BCCでメールを転送する、という設定を組みます。


これで、BCC先のメールボックスに、PowerAutomateで送信したメールが蓄積され、検知できるようになりました。


検知したメールを、リストに追記する

可視化・調査しやすいように、リストへ追記したいところです。日時、差出人、件名、宛先があればよいのですが、「フローの固有ID」を取得しておくと後々便利です。


Office 365 Outlook には、「電子メールの取得」と「メールのエクスポート」というアクションがあります。

前者のほうが簡単で、日時、件名、差出人、宛先などを取るだけなら十分です。
ヘッダーを取得したいなら後者で、この方法だと、ひと手間かける必要があります。フロー固有IDを取得するなら、こちらを使います。


 メールのエクスポートで取得すると、メールのヘッダー情報をまとめて取得できます。そこから、以下のような文字列を探します。

x-ms-mail-application: Microsoft Power Automate; User-Agent: azure-logic-apps/1.0 (workflow afa0fb167803450aa650267e95d43287; version 08586093372199532216) microsoft-flow/1.0 

そのうえで、固有IDを表す

afa0fb167803450aa650267e95d43287

を探します。

エクセルで実施するなら

  • Find関数で、x-ms-mail-applicationという文字列が何文字目かを取得
  • 同じくFind関数でそこから「+92文字目以降の最初の"; version "」が何文字目かを取得
  • mid関数で、開始文字位置と文字数指定して抜き出す
という方法で実現できます。


Power Automate で同様にできればよいのですが、思うような方法が見つけれれなかったのでしたが、
  • indexOf関数、x-ms-mail-applicationという文字列が何文字目かを取得…1
  • add関数で、上記1の値+92+44する…2
  • substring関数で、開始文字位置(1)、文字数指定(2)で、抜き出す…3

  • 上記3で取得した文字列から、同様の手法で "; version "が何文字目かを取得し
  • 上記3で取得した文字列から、"; version "までの文字数-1までを取得する
と、少しステップは多いですが、実現できます。
上記3つの関数は、【Power Automate】メールから関数で文字列を抽出する方法!! - デジラボを参考にさせてもらいました。



92なのは、x-ms-mail-application: Microsoft Power Automate; User-Agent: azure-logic-apps/1.0 (workflow (最後のスペース含む)が92文字だから。

44なのは、"; version "が10文字、私が知る範囲でフローは32文字だけど確実なソースを見つけられなかったので、2ケタ余剰持たせていったん、いったん抜き出してから余分な文字を削除するためです。


送信元や件名などをエクセルファイルに書き込むのであれば、上記1~3だけPower Automateで実施して、残りはエクセルに書き込んでから関数で処理するほうがフロー自体はシンプルです。私はこれで処理しました。(エクセルの関数のほうが私は扱いやすかった)Power AutomateでもFind関数が使えたらなぁ…。


追記:テキスト関数というコネクタがあり、[テキストの位置を検索する][部分文字列]というアクションがあります。関数より、こっちを使うほうがラクかもしれません。


ブロックする・許可する

先ほどのトランスポートルールでは、BCCで送信する、にしました。条件に当てはまる場合は、説明してブロックする、を選べばOK。これでメール送信元にコメントともに通知されます。


特定のフローから送信したいものを許可するなら、例外条件で、ヘッダー文字列に特定のフローIDを含むものを許可すればよいでしょう。送信元メールアドレスでもよいですが、目的に応じて設定すればよいと思います。


もっと確実にするために

トランスポートルールでブロックる処理で差出人にメッセージを返信できますが、1行テキストしか入れられません。詳しいメッセージを送りたいなら、


  • 先ほどの検知用メールボックスにとどいたらリストに書き込む処理のあとに
  • 登録済みフローIDか否か判定し、
  • 登録済みでない場合はメールを送信する


・・・という処理を使えばリッチなメッセージが送信できるようになりますね。




参考にしたもの

【Power Automate】メールから関数で文字列を抽出する方法!! - デジラボhttps://www.teijitaisya.com/powerautomate-substring/


Office 365 Outlook - Connectors | Microsoft Docs
https://docs.microsoft.com/ja-jp/connectors/office365/


コネクタのメール流出制御 - Power Platform | Microsoft Docs
https://docs.microsoft.com/ja-jp/power-platform/admin/block-forwarded-email-from-power-automate