🔌

Power Automate Desktopでメール 下書きメッセージを作成する

2023/09/10に公開

Graph API を使ってみる

はじめに

職場に、ノーコード/ローコードで簡単に作れるというふれこみで Power Automate (& Desktop)が導入されたのでツールを触っているのですが正直難しいです。アクションにないことをしようとしたら途端に難易度が高くなりませんか?

「メールを作成して下書き保存したい(送信はしたくない)」というニーズもそのひとつで。……いやほんと、メールを作成して送信するアクションはあるのになんで下書き保存ができないのでしょうね。追加してくれるのを待っています。望み薄でしょうか?

一応、クラウドフローでは、HTTP 要求を送信するアクションから Microsoft Graph API を使うことで下書きメールを作成する方法を紹介されている記事を見つけたのですが、デスクトップフローの方はというと…………。でも、HTTP で Web サービスを呼び出したら同じことができるのでは?
ということで作ってみました。

[2024/3/29 追記]
メールの下書き保存ができるようになりました。

https://zenn.dev/pfirsich/articles/fbe87ba3209528


手順

  • アクセストークンを入手する
  • デスクトップフローでアクションを追加する

アクセストークンを入手する

調べると、まずアプリの登録をするとあるのですが、権限がないため初手から積んでいます。
なので、ひとまずここは飛ばして一時的に使える方法でここからは試していこうと思います。
https://developer.microsoft.com/graph/graph-explorer/
Graph エクスプローラーを使用して、次のことを行います。

  • アカウントにサインイン
  • Mail.ReadWrite パーミッションの許可を取る
  • アクセストークンをコピー
  1. Outlook メッセージを作成するために、まずサインインします。
  2. サンプルを選択します。Sample queries → Outlook Mail → send an email
  3. URL を https://graph.microsoft.com/v1.0/me/sendMailhttps://graph.microsoft.com/v1.0/me/messages のように、sendMail を messages に変更
  4. Modify permissions タブに切り替えて Mail.ReadWrite を Consent (同意)する
  5. 動作確認をします。Request body タブに切り替えてサンプル文を書き換え、Run query

"message": { }を取る

Request body
{
-    "message": {
        "subject": "Meet for lunch?",
        "body": {
            "contentType": "Text",
            "content": "The new cafeteria is open."
        },
        "toRecipients": [
            {
                "emailAddress": {
                    "address": "garthf@contoso.com"
                }
            }
        ]
-    }
}
{
  "subject": "Meet for lunch?",
  "body": {
    "contentType": "Text",
    "content": "The new cafeteria is open."
  },
  "toRecipients": [
    {
      "emailAddress": {
        "address": "garthf@contoso.com"
      }
    }
  ]
}
  1. 成功したら、「Created - 201 - 300ms」のようなメッセージが表示されます。
  2. Outlook の下書きフォルダーに、いま作成したメッセージが保存されたら OK
  3. Acces token タブに切り替えてコピー

Power Automate Desktop でフローを作成

デスクトップフローで使用するアクションは、HTTP → 「Web サービスを呼び出します」です。

パラメーター
URL https://graph.microsoft.com/v1.0/me/messages
メソッド POST
受け入れる application/json
コンテンツタイプ application/json
カスタムヘッダー Authorization: Bearer %accessToken%
要求本文 %requestBody%
要求本文をエンコードします Off

要求本文に変数を使い、だいたいこのような形に。

%requestBody%
{
    "subject": "%subject%",
    "body": {
        "contentType": "%bodyContentType%",
        "content": "%bodyContent%"
    },
    "toRecipients": [
        {
            "emailAddress": {
                "address": "%toRecipients%"
            }
        }
    ],
}

Cc と Bcc も、To と同様です。

    "ccRecipients": [
        {
            "emailAddress": {
                "address": "%ccRecipients%"
            }
        }
    ],
    "bccRecipients": [
        {
            "emailAddress": {
                "address": "%bccRecipients%"
            }
        }
    ],

実行結果

成功すると、以下のような応答が返ってきます。 (一部書き換えています)
StatusCode 201
WebServiceResponse (改行は、見やすさのために入れています)

WebServiceResponse
{"@odata.context":"https://graph.microsoft.com/v1.0/$metadata#users('{account}')/
messages/$entity","@odata.etag":"W/\"....\"","id":"....","createdDateTime":
"2023-09-10T05:18:04Z","lastModifiedDateTime":"2023-09-10T05:18:04Z",
"changeKey":"....","categories":[],"receivedDateTime":"2023-09-10T05:18:04Z",
"sentDateTime":"2023-09-10T05:18:04Z","hasAttachments":false,"internetMessageId":
"<....outlook.com>","subject":"title","bodyPreview":"test mail",
"importance":"normal","parentFolderId":"....","conversationId":"....",
"conversationIndex":"....","isDeliveryReceiptRequested":false,
"isReadReceiptRequested":false,"isRead":true,"isDraft":true,
"webLink":"https://outlook.live.com/owa/?ItemID=....",
"inferenceClassification":"focused","body":{"contentType":"html","content":
"<html><head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html;
charset=utf-8\"></head><body>test mail </body></html>"},
"toRecipients":[{"emailAddress":{"name":"hogehote@test","address":"hogehote@test"}}],
"ccRecipients":[],"bccRecipients":[],"replyTo":[],"flag":{"flagStatus":"notFlagged"}}

WebServiceResponseHeaders

# アイテム
0 Transfer-Encoding: chunked
1 Strict-Transport-Security: max-age=31536000
2 request-id: {guid}
3 client-request-id: {guid}
4 x-ms-ags-diagnostic: {"ServerInfo":{....}}
5 Cache-Control: private
6 Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; IEEE754Compatible=false; charset=utf-8
7 Date: Sun, 10, Sep 2023 05:18:04 GMT
8 Location: https://graph.microsoft.com/v1.0/users('{account}')/messages('....')

後続処理

作成されたメッセージ ID が応答で返ってくるので、これを使って後から添付ファイルの追加が出来ます。もちろん、メッセージの作成と同時にファイルの添付も可能です。
ファイルの添付方法は次で書きます。

メッセージ ID を取得するには

「テキストのトリミング」アクションが同じ名前で 2 つ存在しますが、「指定のテキスト内で指定されたテキスト フラグの前、後、または間に存在するテキスト値を取得します」となっているものを使用します。

パラメーター
元のテキスト %WebServiceResponseHeaders[8]%
モード 指定された 2 つのフラグの間にあるテキストを取得する
開始フラグ messages('
終了フラグ ')

WebServiceResponseHeaders 8 行目のアイテムをトリミングします。

感想

デスクトップフローからでも Graph API を使用できるというのは感じとれたので良かったかな。
今のままだと実際の業務には組み込めなさそうですが。。。

添付ファイルの追加は次の記事で書きました。

Power Automate Desktop でメール メッセージに添付ファイルを追加する


参考

https://learn.microsoft.com/ja-jp/graph/api/user-post-messages?view=graph-rest-1.0&tabs=http

Discussion