PowerAutomate: Mail から Teams への転送で、添付ファイルを投稿する

# 背景
社内で初めて Power Automate を使う方に、Mail to Teams のテンプレートを紹介したところ、

「添付ファイルも転送できないです？」

という相談があったので、参考フローを用意

# 元のテンプレート
[Post message to Microsoft Teams when an email arrives in Office 365 Outlook](https://japan.flow.microsoft.com/en-us/galleries/public/templates/04d1cbbd3e4f412d838fefccaad8058e/post-message-to-microsoft-teams-when-an-email-arrives-in-office-365-outlook/)

# 概要
添付ファイルを展開先の Teams にアップロードして、そのリンク文字列を生成して、展開時に付加する
1. [メール受信のトリガー設定](#メール受信のトリガー設定)
1. [添付ファイル(Attachements) のアップロードとファイルリンク文字列作成](#添付ファイル処理)
1. [Teams 用のメッセージ作成と投稿](#teams-用メッセージ作成と投稿)

## フロー全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f957262d-979a-83c8-4039-a8c15c67d301.png)

# 動作例
受信メールでこんなのが来たら・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f7ca78e9-17a9-cc64-0541-57d68485d73e.png)

Teams でこんな感じで受ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/cbbe6844-754c-f3e3-e5d0-8c8ac9c6b657.png)


# 詳細
## メール受信のトリガー設定
転送したいメールに合わせて設定
気にする箇所は以下ぐらいかな
- 受信フォルダーや、送信者などで出来るだけフィルターしておく
- 添付ファイルも含める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/09a7ae21-02c7-0294-6818-333bfa2b6607.png)

## 添付ファイル処理
添付ファイル(Attachments) をループ処理<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/141eafd8-8ae3-ad4a-23fc-614cc81745a5.png)
展開する Team 内でファイル生成
- ファイルコンテンツ(File Content) には、contentBytes を base64ToBinary() 変換したものを設定
```json:ファイルコンテンツ
@{base64ToBinary(items('Apply_to_each')?['contentBytes'])}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/2f7784da-7717-2a29-66cd-0353caead0f3.png)

今回は、初心者でも使いやすい Post Message 用に HTML の A Tag で生成
- href に生成したファイルへのリンク
    - 今回は生成時に取得可能な パス(path) を利用する。パスは、サイト内の相対アドレスなので、サイトまでの絶対アドレスとして、ファイル生成(Create File) アクションの入力で渡した サイトアドレス(dataset) を利用。二つを合成すれば完成
        - ファイル生成の入力値であるサイトアドレス: <code>actions('Create_file').inputs.parameters.dataset</code>
        - ファイル生成の出力にあるパス(Path): <code>outputs('Create_file')?['body/Path']</code>
- 表示は、元の添付ファイル名

```html:ファイルリンク A タグの例
<a href="@{actions('Create_file').inputs.parameters.dataset}@{outputs('Create_file')?['body/Path']}">@{items('Apply_to_each')?['name']}</a><p/>
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/cb183901-3d20-8fe2-b082-1f82d308fbb2.png)

:::note info
ファイルのプロパティを取得アクションを追加すれば、たぶん Web Link が直接取れたと思います。
:::

## Teams 用メッセージ作成と投稿
投稿は、Reply message: [チャネル内のメッセージで応答します](https://docs.microsoft.com/ja-jp/connectors/teams/#%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E5%86%85%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%A7%E5%BF%9C%E7%AD%94%E3%81%97%E3%81%BE%E3%81%99) で、HTML 形式を利用する。
この際、直接書くと壊れることがよくあるので、Compose で生成して、その出力を Teams のアクション内のメッセージで使います

投稿形式はこんな感じ
- {件名} from {送信者表示}
- {引用で、メール内容を表示}
- {添付ファイル一覧：[添付ファイル処理](#添付ファイル処理) で生成したやつ}

:::note info
送信者表示は、外部からのメール受信も考えて mailto: にしているが、社内とか限定なら以下などにしても
1. msteams: を使ってチャット送信へ誘導
1. [Delveのユーザー表示へ](https://qiita.com/baku2san/items/613db0b4f07fca7a9c80)
:::

```html:Teams 投稿用のメッセージ例
@{triggerOutputs()?['body/subject']} from <a href="mailto:@{triggerOutputs()?['body/from']}">@{triggerOutputs()?['body/from']}</a>
<p><blockquote>@{triggerOutputs()?['body/body']}</blockquote></p>
<p><br></p>
<p>@{variables('Attachments')}</p>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/5192c58a-dedc-4bce-0a6d-81620e430eda.png)

# あとがき
社内の場合、ファイル添付ではなくリンク展開にしようって話なので、本来は外部受信だけのはず
で、そうなると、無条件に適用するとやばいファイルもある可能性があるのでご利用は計画的に :laughing: 

# keyword
how to transfer attachments from mail to teams