ささみ学習帳 - sasami's study book

ささみ学習帳

Microsoft365 や Power Platform について学んだこと・アイデアのメモ

Outlook on the Web でもメールをファイルとして一括エクスポートする (Power Automate クラウドフロー)

 

はじめに

Outlookデスクトップアプリではメールをデスクトップ等にドラッグ&ドロップする手段でメールをファイルとして保存する事が可能です。

support.microsoft.com

 

しかし、デスクトップアプリを使用せずにOutlook on the Web(Web版Outlook)のみで運用している弊社では手軽にメールをファイルに出力手段がない事が不便なことがありました。

 

1.メールを1通ごとであればOutlook on the Webの標準機能でエクスポート可能

メール1通ごとであればOutlook on the Webの機能でエクスポートすることができます。

 

1-1.メール本文ビューで保存

メール本文ビューの「…」→「保存」でeml形式で保存する事が出来ます。

 

 

1-2.添付ファイルとしてメール転送から

メールを選択し、リボンの「転送」→「添付ファイルとして転送」を選択します。

選択したメールが新規メールにファイルとして添付されるのでこれをダウンロードする事でeml形式でファイルとして保存する事が可能です。

 

 

これら操作でファイルに保存する事は出来ますが、多数のメールを保存したい場合にはちょっと大変です。

 

 

2.複数のメール一括でファイルに保存する(Power Automate クラウドフローで)

そこで、Power Automate をつかって複数のメールを一括でファイル保存する方法を考えてみました。特定のカテゴリが設定されているメールをエクスポートするイメージです。

2-1.使い方イメージ

2-1-1.Outlook on the Webでメールに"export"カテゴリを付加する

2-1-2.フローを実行する

2-1-3.Teams チャットで通知される

2-1-4.OneDrive for Business のフォルダにemlファイルとして保存されてる

2-2.準備作業

2-2-1.OneDrive for Business に保存先フォルダを作成する

エクスポートしたファイルを保存するフォルダを作成します。ここでは「MailExport」というフォルダを作成しました。

 

2-2-2.Outlook on the Webでカテゴリを作成する

⚙→全般→分類 でカテゴリを作成します。このカテゴリが設定されたメールをエクスポート対象とします。

ここでは「export」というカテゴリを作成しました。

 

2-3.フロー全体図

 

2-4.フロー解説

フローの各アクションの解説です。

2-4-1.[トリガー]手動でフローをトリガーします

今回のフローは手動で実行する形を想定しています。

 

 

2-4-2.スコープ-exportカテゴリ付きのメールをエクスポート

2-4-2-1.[Office 365 Outlook]HTTP要求を送信します-exportカテゴリ付き

GRAPH APIで"export"カテゴリ付きのメールを検索します。

 

 

2-4-2-2.[データ操作]JSONの解析-エクスポート対象のメール

2-4-2-1.の出力をJSON解析し後続のアクションから参照しやすくします。

  • コンテンツ
    • @{body('HTTP_要求を送信します-メッセージを取得-exportカテゴリ付き')}
  • スキーマ
    • {
          "type": "object",
          "properties": {
              "@@odata.context": {
                  "type": "string"
              },
              "value": {
                  "type": "array",
                  "items": {
                      "type": "object",
                      "properties": {
                          "@@odata.etag": {
                              "type": "string"
                          },
                          "id": {
                              "type": "string"
                          },
                          "createdDateTime": {
                              "type": "string"
                          },
                          "lastModifiedDateTime": {
                              "type": "string"
                          },
                          "changeKey": {
                              "type": "string"
                          },
                          "categories": {
                              "type": "array",
                              "items": {
                                  "type": "string"
                              }
                          },
                          "receivedDateTime": {
                              "type": "string"
                          },
                          "sentDateTime": {
                              "type": "string"
                          },
                          "hasAttachments": {
                              "type": "boolean"
                          },
                          "internetMessageId": {
                              "type": "string"
                          },
                          "subject": {
                              "type": "string"
                          },
                          "bodyPreview": {
                              "type": "string"
                          },
                          "importance": {
                              "type": "string"
                          },
                          "parentFolderId": {
                              "type": "string"
                          },
                          "conversationId": {
                              "type": "string"
                          },
                          "conversationIndex": {
                              "type": "string"
                          },
                          "isDeliveryReceiptRequested": {},
                          "isReadReceiptRequested": {
                              "type": "boolean"
                          },
                          "isRead": {
                              "type": "boolean"
                          },
                          "isDraft": {
                              "type": "boolean"
                          },
                          "webLink": {
                              "type": "string"
                          },
                          "inferenceClassification": {
                              "type": "string"
                          },
                          "body": {
                              "type": "object",
                              "properties": {
                                  "contentType": {
                                      "type": "string"
                                  },
                                  "content": {
                                      "type": "string"
                                  }
                              }
                          },
                          "sender": {
                              "type": "object",
                              "properties": {
                                  "emailAddress": {
                                      "type": "object",
                                      "properties": {
                                          "name": {
                                              "type": "string"
                                          },
                                          "address": {
                                              "type": "string"
                                          }
                                      }
                                  }
                              }
                          },
                          "from": {
                              "type": "object",
                              "properties": {
                                  "emailAddress": {
                                      "type": "object",
                                      "properties": {
                                          "name": {
                                              "type": "string"
                                          },
                                          "address": {
                                              "type": "string"
                                          }
                                      }
                                  }
                              }
                          },
                          "toRecipients": {
                              "type": "array",
                              "items": {
                                  "type": "object",
                                  "properties": {
                                      "emailAddress": {
                                          "type": "object",
                                          "properties": {
                                              "name": {
                                                  "type": "string"
                                              },
                                              "address": {
                                                  "type": "string"
                                              }
                                          }
                                      }
                                  },
                                  "required": [
                                      "emailAddress"
                                  ]
                              }
                          },
                          "ccRecipients": {
                              "type": "array"
                          },
                          "bccRecipients": {
                              "type": "array"
                          },
                          "replyTo": {
                              "type": "array"
                          },
                          "flag": {
                              "type": "object",
                              "properties": {
                                  "flagStatus": {
                                      "type": "string"
                                  }
                              }
                          }
                      },
                      "required": [
                          "@@odata.etag",
                          "id",
                          "createdDateTime",
                          "lastModifiedDateTime",
                          "changeKey",
                          "categories",
                          "receivedDateTime",
                          "sentDateTime",
                          "hasAttachments",
                          "internetMessageId",
                          "subject",
                          "bodyPreview",
                          "importance",
                          "parentFolderId",
                          "conversationId",
                          "conversationIndex",
                          "isDeliveryReceiptRequested",
                          "isReadReceiptRequested",
                          "isRead",
                          "isDraft",
                          "webLink",
                          "inferenceClassification",
                          "body",
                          "sender",
                          "from",
                          "toRecipients",
                          "ccRecipients",
                          "bccRecipients",
                          "replyTo",
                          "flag"
                      ]
                  }
              }
          }
      }

 

2-4-2-3.[コントロール]Apply to Each

メール1件つづ処理していきます。

 

2-4-2-4.[Office 365 Outlook]メールのエクスポート

Apply to Each の中でメールを1件づつエクスポートします。

  • メッセージID
    • @{items('Apply_to_each')?['id']}

 

2-4-2-5.[OneDrive for Business]ファイルの作成

2-4-2-4でエクスポートしたファイルをOneDriveに保存します。

  • フォルダーのパス
    • 2-2-1.で作成したフォルダ
  • ファイル名
    • @{items('Apply_to_each')?['subject']}.eml
  • ファイルコンテンツ
    • @{body('メールのエクスポート_(V2)')}

 

2-4-2-6.[データ操作]アレイのフィルター処理-exportカテゴリを除去

処理済みメールのカテゴリから"export"(2-2-2で作成したカテゴリ)を除去した配列を作成します。

  • 差出人
    • @items('Apply_to_each')?['categories']
  • 条件
    • @{item()}
    • 次の値に等しくない
    • export (2-2-2で作成したカテゴリ)

 

2-4-2-7.[Office 365 Outlook]HTTP要求を送信します-カテゴリを更新

2-4-2-6で作ったカテゴリをメールに反映します。

 

2-4-3.スコープ-Teamsで通知

2-4-3-1.[Office 365 Users] マイプロフィールの取得(V2)

次のアクションで使用するメールアドレスを取得します。

 

2-4-3-2.[Microsoft Teams]チャットまたはチャネルでメッセージを投稿する

フロー実行者にチャットで完了通知を投稿します。

  • 投稿者
    • フローボット
  • 投稿先
    • Chat with Flow bot
  • Recipient
    • @{outputs('マイ_プロフィールの取得_(V2)')?['body/mail']}
  • Message
    • @{length(body('JSON_の解析-エクスポート対象のメール')?['value'])}件のメールをOneDrive for Business にエクスポートしました。
      ---
      MailExportフォルダを開く

 

以上でフロー完了です。

 

 

課題事項

  • ファイル名が重複すると上書きされてしまう
    • 単純に[メールの件名].eml としているので件名が重複すると上書きしてしまいます。この為、スレッドのメッセージをまとめてエクスポートしようとするとほとんどが上書きされてしまいます。Outlookでエクスポートする際の動作に倣って件名にしてみましたがもう少し考慮が必要そうです。
  • カテゴリ設定した直後はGRAPh APIでの検索にヒットしない場合がある
    • おそらく反映に時間がかかる場合があるのではないかと思います。
  • フローを実行する為にPower Automateを開かなくてはいけない
    • Teamsであれば[選択したメッセージの場合][作成ボックスから]といったトリガーで任意の場所からフローが起動できるのですが、Outlookにはそういったものがありません。代わりになりそうな手段を検証中です。

 

関連記事

このフローで使用しているGRAPH APIについて

sasami-axis.hatenablog.com

 

新しいOutlook(Windows)もmsg形式でエクスポートできない!?

新しいOutlookデスクトップアプリではmsg形式のファイルで保存する機能がなくなっています。メニューがないですし、ドラッグ&ドロップしてもエクスポートされません。エクスポート済みのmsgファイルをダブルクリックしても下記のようなメッセージが表示されます。”まだ”なのでビューアー今後サポートされるのかもしれませんが、エクスポート機能はどうなのでしょう…少なくとも現時点ではこのフローが活用できそうです。

※新しいOutlook for Macには「名前を付けて保存」がありeml形式でファイルに保存可能でした。

 

 

さいごに

メールをファイルにエクスポートする事はそうそうないのですが、必要な時にはまとめてエクスポートしたくなるので作ってみました。