Power Apps からメール送信する(共有メールボックス、M365Groups)

皆さん、Power Apps のアプリから Office 365（Microsoft 365）＝ Exchange Online を利用してメール送信を実施したいという状況ありますよね。しかも、送信する際の”送信者”は「操作しているユーザー」ではなく「共有メールボックス」や「Microsoft 365 Groups（＝Microsoft 365 グループ）」（以降、M365グループ）のように複数ユーザーが共有でメール受信ができる仕組みでメール送信したい、なんて要望ありませんか。

今回は、Power Apps のアプリから送信者（From）を所謂”偽装”して送信する方法です。

# なぜ送信者を偽造したいのか？
ピンとこない方向けに簡単な説明をしておきます。把握できている方は次の章へジャンプしてください。

普段ご利用のメールアドレス、おそらく大半の方は”個人”のアドレスですよね？（よもや複数名で共用しているアドレスです、みたいなのは・・・うん。これ以上はやめておきましょう。）そのアドレスから他人へメールを送信した場合、その返信メールはどこに届きますか？相手が返信時の宛先を変更しない限り、送信者である貴方のアドレスです。

例えば、システムから送信するメールに返信された場合は”システム部の複数人が受信あるいは内容を確認したい”といった状況があります。また、単純に”送信者は個人ではなくて info だとかソレっぽいヤツにしたい”という大人の事情もあるでしょう。

共有メールボックスや、M365グループ を利用することで、

　- 返信された場合、複数人で返信メールを確認することができる
　- 送信メールの送信者（From）を特定ユーザーではないアドレスにできる

というメリットが提供できるんです。このメリットを享受できると嬉しいコトがお仕事してるとあるんですよ。

当記事では「Power Apps のアプリから複数の宛先へメール送信する。ただし、宛先（To）は利用せず BCC を利用する」という要件を満たす仕組みで解説を進めます。

# 必要な事前準備
共有メールボックス、または M365グループ からメール送信したい場合、事前に実施すべき設定があります。どちらも Exchange 管理センターから操作する必要があります。

## 共有メールボックスの場合
Exchange 管理センターにて［受信者］→［共有］の画面から、該当の共有メールボックスを編集で開きます。アプリでメール送信するユーザーが［メールボックスの委任］を選択して[代理人として送信]が可能な状況にしておきましょう。なお、この設定は反映に時間を要する場合があるのでご注意ください。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/b4a3a9d8-8d34-bb5f-2b8a-89b0625bde46.png)

【Docs】[Exchange Online の共有メールボックス](https://docs.microsoft.com/ja-jp/exchange/collaboration-exo/shared-mailboxes?WT.mc_id=M365-MVP-5004053)

## M365グループの場合
こちらも同様に代理送信の権限を付与します。Exchange 管理センターにて［受信者］→［グループ］の画面から該当のグループを編集で開きます。［グループ委任］を選択してアプリでメール送信するユーザーが［メールボックス所有者として送信する］が可能な状況にしておきましょう。なお、こちらの設定も反映に時間を要する場合があります。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/415b38d7-e7dd-b5c3-039e-e39c94b0ceb2.png)

【Docs】[メンバーがグループとしてメールを送信する](https://docs.microsoft.com/ja-jp/microsoft-365/solutions/allow-members-to-send-as-or-send-on-behalf-of-group?view=o365-worldwide&WT.mc_id=M365-MVP-5004053#allow-members-to-send-email-as-a-group)

# サンプルアプリ
キャンバスアプリで、件名、宛先、本文を入力できる簡単なアプリを作ってみました。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/10dcc548-87c2-f7cd-c429-aa3eb7d32393.png)
■主なコントロール

| 項目   | コントロールの種類    | コントロール名    |
|------|--------------|------------|
| 件名   | テキスト入力       | txtSubject |
| To   | テキスト入力       | txtTo      |
| Body | リッチテキストエディター | txtBody    |

ラベルは見ればわかると思うので割愛です。件名のラベルが Subject じゃないのはご愛敬ってことでｗ
上記の各コントロールを利用してメール送信する、という前提で以降をご確認ください。

# Office 365 Outlook コネクター
Power Apps から Exchange Online 経由でメール送信する際に利用するコネクターは「Office 365 Outlook」になります。詳しくは Docs をご確認ください。Power Apps から Automate 等を介さずにメール送信する場合は該当コネクターを追加する必要があります。

【Docs】[Power Apps から Office 365 Outlook に接続する](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/connections/connection-office365-outlook?WT.mc_id=BA-MVP-5004053)

# メール送信するアクション
記事投稿時点で、2つのメール送信用アクションが提供されています。

## Send an email (V2)
Power Apps上のアクションだと「SendEmailV2」です。

```SendEmailV2
Office365Outlook.SendEmailV2(To, Subject, Body, {From:Text, Cc:Text, Bcc:Text, Attachments:Table, ReplyTo:Text, Importance:Text})
```

### パラメーター
| 日本語         | Key         | 必須   | 型      | 補足                                                                                                                                                                                     |
|-------------|-------------|------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 宛先          | To          | TRUE | email  |                                                                                                                                                                                        |
| 件名          | Subject     | TRUE | string |                                                                                                                                                                                        |
| 本文          | Body        | TRUE | html   |                                                                                                                                                                                        |
| 送信者         | From        |      | email  |                                                                                                                                                                                        |
| CC          | Cc          |      | email  |                                                                                                                                                                                        |
| BCC         | Bcc         |      | email  |                                                                                                                                                                                        |
| 添付ファイル      | Attachments |      | Table  | [添付ファイル付きのメッセージを送信する](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/connections/connection-office365-outlook?WT.mc_id=BA-MVP-5004053#send-a-message-with-an-attachment) |
| 返信される際のアドレス | ReplyTo     |      | email  |                                                                                                                                                                                        |
| 重要度         | Importance  |      | string | High<br/>Low<br/>Normal                                                                                                                                                                |

コネクターの Docs は下記(だと思うの)ですが、上記とパラメーターを比較するとチョッとだけ差異があります。添付ファイルがテーブルで受け渡し必須になっているのでご注意ください。

【Docs】[Send an email (V2)](https://docs.microsoft.com/ja-jp/connectors/office365/?WT.mc_id=BA-MVP-5004053#send-an-email-(v2))

### BCC利用でメール送信する関数の例
With 関数を利用して、共有メールボックス または M365グループ のアドレスを”そのアクション内だけで利用可能な変数”として指定しています。[With 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-with?WT.mc_id=BA-MVP-5004053) については今回の主題ではないので説明は割愛します。覚えるとメッチャ便利なので是非チャレンジしてください。

```
With(
    {sendMail: "共有メールボックス or M365グループ のアドレス"},
    Office365Outlook.SendEmailV2(
        sendMail,
        txtSubject.Text & Text( Now(), "[$-ja]yyyy/mm/dd hh:mm" ),
        txtBody.HtmlText,
        {
            From: sendMail,
            Bcc: txtTo.Text,
            Importance: "Normal"
        }
    )
)
```
"From"の値をキチンと指定しておきましょう。また、BCC のみで送信することができません。そのため、送信者と同じアドレスを受信者にも指定しています。

## Send an email from a shared mailbox (V2)
Power Apps上のアクションだと「SharedMailboxSendEmailV2」です。なんと、SharedMailbox ＝ 共有メールボックス専用のアクションが用意されてるんです。

```
Office365Outlook.SharedMailboxSendEmailV2(MailboxAddress, To, Subject, Body, {Cc:Text, Bcc:Text, Attachments:Table, ReplyTo:Text, Importance:Text})
```
### パラメーター
| 日本語            | Key            | 必須   | 型      | 補足                                                                                                                                                                                     |
|----------------|----------------|------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 共有メールボックスのアドレス | MailboxAddress | TRUE | email  |                                                                                                                                                                                        |
| 宛先             | To             | TRUE | email  |                                                                                                                                                                                        |
| 件名             | Subject        | TRUE | string |                                                                                                                                                                                        |
| 本文             | Body           | TRUE | html   |                                                                                                                                                                                        |
| CC             | Cc             |      | email  |                                                                                                                                                                                        |
| BCC            | Bcc            |      | email  |                                                                                                                                                                                        |
| 添付ファイル         | Attachments    |      | Table  | [添付ファイル付きのメッセージを送信する](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/connections/connection-office365-outlook?WT.mc_id=BA-MVP-5004053#send-a-message-with-an-attachment) |
| 返信される際のアドレス    | ReplyTo        |      | email  |                                                                                                                                                                                        |
| 重要度            | Importance     |      | string | High<br/>Low<br/>Normal                                                                                                                                                                |

【Docs】[Send an email from a shared mailbox (V2)](https://docs.microsoft.com/ja-jp/connectors/office365/?WT.mc_id=BA-MVP-5004053#send-an-email-from-a-shared-mailbox-(v2))

前述の SendEmailV2 と比較すると、From がオプションではなくて”MailboxAddress”として明示的に必須項目になっていますね。これはアプリを利用しているユーザーと、メール送信する際のユーザーが完全に異なる前提のアクションだから、というのがわかります。

### BCC利用でメール送信する関数の例
```
With(
    {sharedMail: "共有メールボックス or M365グループ のアドレス"},
    Office365Outlook.SharedMailboxSendEmailV2(
        sharedMail,
        sharedMail,
        txtSubject.Text & Text(Now(), "[$-ja]yyyy/mm/dd hh:mm" ),
        txtBody.HtmlText,
        {
            Bcc: txtTo.Text,
            Importance: "Normal"
        }
    )
)
```

既に紹介したように SendEmailV2 でも同様のことが実現可能です。なお、SharedMailboxSendEmailV2 の MailboxAddress に M365グループを指定するとエラーになります。厳密に「共有メールボックスからのみ送信させたい」といった用途であればコッチを利用するほうが安全かもしれません。

# おまけ
ちゃんと本文は HTML で受信されます。（というか、テキストモードで送信する選択肢が現状ない）
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/3cf07a8d-a708-5c75-92ef-bb5dc403372e.png)

# まとめ
- Exchange Online を利用してメール送信したい場合は「Office 365 Outlook コネクター」を利用
    - 「SendEmailV2」と「SharedMailboxSendEmailV2」の2つメール送付アクションがある
    - 「SharedMailboxSendEmailV2」は共有メールボックスを利用した送信専用
- 送信されるメールは現状HTMLメールのみ（テキストモードが選択肢としてない）
- 共有メールボックス、M365グループ から送信したい場合は事前設定が必須

事前準備が必要ですが、ここまでわかってしまえば Power Apps からメール送信するのはさほど難しくないかな、と思います。説明を端折っていますが、V2がついてない無印のアクションもありますが非推奨になっておりますので利用しないようにしましょう。

個人的には Power Automate のフローを1クッション噛ませた状態でメール送信する仕組みのが好みなのですが、この話しはまたの機会に。

それでは、皆さま。2021年も素晴らしい Power Platform Life を！