Power Automateで受信メールをすべて監査対応PDFアーカイブに変換する:Outlookの7ステップワークフロー

メールからPDFへのアーカイブ これは、新しいOutlookメールを受信するたびに実行されるPower Automateフローです。メッセージ本文とすべての添付ファイルをPDFに変換し、タイムスタンプ付きの統合PDFにマージし、結果をDropboxに書き込んで長期的なコンプライアンス保持に利用します。アクションは7つ。コードは不要です。メールごとに1つのファイルが作成され、本文が最初に、次に添付ファイルが順番に処理されます。出力ファイル名は merge-YYYYMMDD-HHmmss.pdf そのため、すべてのアーカイブエントリは一意にソート可能です。
監査チーム、記録管理責任者、コンプライアンス担当者は、Exchange の保持ポリシーをクリアし、改ざん防止機能付きで検索可能な形式で保存されたメール証拠を必要としています。Outlook のネイティブエクスポートは手動で、ファイルごとに処理されるため、添付ファイルが別のファイルに分割されてしまいます。このチュートリアルでは、コード不要の代替手段を構築します。受信したすべてのメールが、元のファイルとともに自動的に単一の統合 PDF ファイルに変換されます。 .eml 添付ファイルは法的保管のためOutlookに残されていますが、アーカイブされたPDFファイルは正式な記録コピーとして扱われます。
Outlook トリガーは、監視対象のアドレスへの受信メールごとに起動します。 メール PDF4meを開く。 PDFに変換 HTML本文を最初にPDFに変換します(1ページ目になります)。 それぞれに適用する PDF4meは、添付ファイルを一つずつ走査し、Aspose Words / Cells / Slidesレンダラーを使用してそれぞれをPDFに変換し、順番に追加します。 複数のPDFファイルを結合する 配列全体を消費し、1つの統合されたPDFを出力します。Dropboxはそれを次のように書き込みます。 merge-20260611-103323.pdf本体が先、添付ファイルは順番通り、タイムスタンプ付き、アーカイブ品質。
なぜ?という問いに対する質疑応答
アーカイブ用に.emlファイルを保存する代わりに、なぜPDFに変換するのですか? EMLファイルは、Outlookまたは互換性のあるリーダーで開く必要があり、監査担当者が検索できないバイナリストリームに添付ファイルが埋め込まれており、送信者のメールクライアントのフォーマットに依存します。一方、単一の統合PDFファイルは、普遍的に読み取り可能で、OCRに対応しており、添付ファイルも含まれており、ほとんどの法的証拠開示やSOX/GDPR監査で求められる保存フォーマットに準拠しています。
なぜ本文と添付ファイルを一つの配列変数にまとめるのか? 複数の PDF ファイルを結合するアクションでは、順序付けされた単一のコレクションが必要です。一度初期化し、ステップ 4 で本文をプッシュし、ステップ 5 で変換された各添付ファイルをプッシュすると、配列はアーカイブに必要なドキュメントの順序 (送信順序で本文が最初、次に添付ファイル) と完全に一致します。2 つの別々の配列を使用すると、後でそれらを連結するためだけに Compose アクションを実行する必要が生じます。
なぜ base64tobinal 毎回のプッシュで? PDF4me Convert to PDF は出力を base64 文字列として返します。 $contentOutlook の添付ファイルは base64 形式で届きます コンテンツバイト複数の PDF ファイルを結合するには、base64 文字列ではなくバイナリ バッファが必要です。 base64ToBinary(...) この呼び出しは両方のソースを橋渡ししますが、異なるプロパティ名を指定します。変換とマージアクションはスキップされ、「無効なコンテンツ」というエラーが発生します。
なぜタイムスタンプ付きの出力名を使うのか? 同じアドレスに同じ1分以内に送信された2通のメールは、同じファイル名で競合することになる。 concat('merge-', formatDateTime(utcNow(), 'yyyyMMdd-HHmmss'), '.pdf') 次のような秒精度のUTC名を生成します merge-20260611-103323.pdf辞書式順序で並べ替え可能、瞬時に読み取れる、構造的に独自性がある。監査担当者はこの形式を高く評価している。
得られるもの
入力: 監視対象のOutlookアドレス(ここ)に届く受信メール [email protected])に 1 つ以上の添付ファイルがあります。このチュートリアルでは、短いメッセージ本文(「こんにちは、お元気ですか…」)と 2 つの DOCX 添付ファイル(3Page.docx、 Docx_2Pages.docx) 出力: 単一の統合アーカイブ PDF /blog data/merge blog template/output/名付けられた merge-YYYYMMDD-HHmmss.pdf1ページ目は本文です。2ページ目以降は、Aspose Wordsでレンダリングされた添付ファイルが添付ファイルの順序で表示されます。
受信したメール

2回実行後のアーカイブフォルダ

統合アーカイブPDFの1ページ目

必要なもの
- パワーオートマタ。 Power Automateを開くプレミアムコネクタ付きのプラン(PDF4me Connectはプレミアムプランです)。
- PDF4me APIキー。 APIキーを取得してくださいPDF4meアクションを初めて追加する際に接続してください。
- Office 365 Outlook新しいメールが届いたときに V3 トリガーを使用して添付ファイルの contentBytes を読み取る場合。コネクタが認証できる受信トレイであればどれでも動作します。
- Dropbox (またはSharePoint、OneDrive、Google Drive)。アーカイブの保存先として指定してください。
- 添付ファイル付きのテストメールこのチュートリアルでは、2つのDOCXサンプルを使用します。 3ページ.docx そして Docx_2Pages.docx。
まず、サンプルデータと期待される出力結果を入手してください。 両方の DOCX ファイルをダウンロードし、監視対象のアドレスに簡単なメールに添付して、フローを公開します。最初の実行では、 merge-YYYYMMDD-HHmmss.pdf これはリンク先のサンプルと全く同じです(タイムスタンプだけが異なります)。
フローの概要
- Outlook: 新しいメールが届いたとき (V3) (トリガー)。
- 変数を初期化する 名前
email(配列)。 - PDF4me: PDFへの変換(本文)HTML本文を読み込み、PDFを返します。
- 配列変数に追加 と
base64ToBinary改造された車体上で。 - それぞれに適用する の上
triggerOutputs()?['body/attachments']:- PDF4me: PDFに変換 添付ファイル。
- 配列変数に追加 と
base64ToBinary変換されたPDFファイル上で。
- PDF4me:複数のPDFファイルを1つのPDFファイルに結合する配列を入力として、1つのPDFを出力します。
- Dropbox: ファイルの作成ファイル名式はUTCタイムスタンプを付与します。
フローの概要全体

7つのアクション。PDF4meは、本文の変換、各添付ファイルの変換、すべての結合という3つのフローに分かれています。
Outlookの添付ファイルフィールド(参考)
展望 新しいメールが届いたとき V3 トリガーは、コンバーターにマッピングするこれらの添付ファイルフィールドを公開します。
| 分野 | タイプ | ソース式 | 何を運ぶか |
|---|---|---|---|
name | 弦 | items('Apply_to_each')?['name'] | 拡張子を含む元のファイル名(Invoice.docx) |
contentBytes | base64文字列 | items('Apply_to_each')?['contentBytes'] | 添付ファイルのバイナリコンテンツ(base64エンコード済み) |
contentType | 弦 | items('Apply_to_each')?['contentType'] | MIMEタイプ(application/vnd.openxmlformats-officedocument.wordprocessingml.document) |
size | 整数 | items('Apply_to_each')?['size'] | バイト単位、大きな添付ファイルをフィルタリングするのに便利 |
isInline | ブール値 | items('Apply_to_each')?['isInline'] | 本文に埋め込まれたインライン画像の場合に当てはまります。通常はフィルタリングされます。 |
PDF4me Convert to PDF はファイル拡張子を読み取りません name 適切なレンダラーを選択する(.docx → 言葉を攻撃する、 .xlsx → Aspose Cells、 .pptx → Asposeのスライド、画像、PDFはネイティブに処理されます。
ステップ1:Outlookの受信トレイで受信メールを監視するにはどうすればよいですか?
これまでの流れ: トリガーのみ。
- で パワーオートマタ クリック 作成する、 選ぶ 自動化されたクラウドフロー。
- フローに名前を付けます(例:
Email Archive to PDF)、 選ぶ Office 365 Outlook: 新しいメールが届いたとき (V3) トリガーとしてクリック 作成する。 - 接続する あなたのOffice 365メールボックス。
- 拡大する 詳細パラメータ そしてクリック すべて表示 フィルタリングオプションを表示します。
- 設定する:
- に:
[email protected](このアドレス宛のメールのみがフローをトリガーするようにフィルタリングする) - 添付ファイルを含める:
Yes - 添付ファイルのみ:
Yes
- に:
トリガー設定

ヒント。 添付ファイルのみ はい は、すべての内部通知、カレンダー招待、または自動返信でフローが発火するのを防ぎます。 に 専用のアーカイブエイリアスでフィルタリングします (例: [email protected]実際にアーカイブしたいメールだけを受信する、クリーンな受信アドレスを作成します。
ステップ2:変数emailを初期化する
これまでの流れ: トリガーと変数の初期化。
空の配列を開いて、本文のPDFファイルとすべての添付ファイルのPDFファイルを取得します。
- クリック + 新しいステップ、 選ぶ 変数を初期化する。
- 設定する:
- 名前:
email - タイプ:
Array - 価値: 空欄のままにしてください
- 名前:
変数設定を初期化する

ステップ3:PDF4meはどのようにしてメール本文をPDFに変換するのですか?
これまでの流れ: トリガー、変数の初期化、PDF本文への変換。
Outlook トリガーはメッセージ本文を HTML として出力します body/bodyPDF4me Convert to PDFはHTMLを直接読み込むため、変換処理全体が1回のアクション呼び出しで完了します。
- クリック + 新しいステップ、 検索 PDF4me、 選ぶ PDFに変換。
- 名前を変更する アクション PDF本文に変換 そのため、ステップ5の「PDFに変換」アクションには、後で独自の分かりやすい名前が付けられます。
- 接続する PDF4meにAPIキーで接続します(初回のみ)。
- 設定する:
- ファイルの内容 (表現、クリック)
fx):triggerOutputs()?['body/body'] - ファイル名:
email-body.html
- ファイルの内容 (表現、クリック)
PDF本文構成に変換

の .html ファイル名の拡張子は、PDF4me が使用するレンダラーを指定します。 .docx、 .xlsx、 .png、 または .jpg 同様に簡単に、同じ操作で全てを処理できます。
ステップ4:配列変数(メール本文)に追加する
これまでの流れ: トリガー、変数の初期化、PDF本文への変換、追加(メール本文)。
変換された本文PDFを押して email 配列をページ 1 として表示します。
- クリック + 新しいステップ、 選ぶ 配列変数に追加。
- 名前を変更する アクション 配列変数(メール本文)に追加する 分かりやすくするために。
- 設定する:
- 名前:
email - 価値 (表現):
base64ToBinary(body('Convert_to_PDF_Body')?['$content'])
- 名前:
メール本文設定の追加

ステップ5:すべての添付ファイルをループ処理して、それぞれを変換するにはどうすればよいですか?
これまでの流れ: トリガー + 変数の初期化 + PDF本文への変換 + 追加(メール本文) + 各項目に適用。
すべての添付ファイルをループ処理し、それぞれをPDFに変換して順番に追加することで、最終的なマージ時に添付ファイルの順序が尊重されるようにします。
ステップ5a:それぞれに適用する(ソースを選択)
- クリック + 新しいステップ、 選ぶ それぞれに適用する。
- 設定する:
- 前の手順から出力を選択します (表現):
triggerOutputs()?['body/attachments']
- 前の手順から出力を選択します (表現):

ステップ5b:PDFに変換する(添付ファイル)
- ループの内側をクリック アクションを追加する、 選ぶ PDF4me: PDFに変換。
- 設定する:
- ファイルの内容 (表現):
base64ToBinary(items('Apply_to_each')?['contentBytes']) - ファイル名 (動的コンテンツ):選択 名前 各現在のアイテムに適用する
- ファイルの内容 (表現):

の 名前 実行時に動的コンテンツトークンは次のように解決されます。 items('Apply_to_each')?['name']そのため、各添付ファイルは元のファイル名を使用して変換されます。PDF4meは拡張子を読み取って適切なレンダラーを選択します。

ステップ5c:配列変数に(変換された添付ファイルを)追加する
- 以下、同じループ内でPDFに変換する。 アクションを追加する、 選ぶ 配列変数に追加。
- 設定する:
- 名前:
email - 価値 (表現):
base64ToBinary(body('Convert_to_PDF')?['$content'])
- 名前:

その2つの物件名は重要です。 Outlook 添付ファイルのバイトは コンテンツバイトPDF4me Convert to PDF出力は存続しています $contentどちらもbase64形式です。式を貼り付ける際は名前を間違えないように注意してください。そうすればループは正常に動作します。
ステップ6:複数のPDFファイルを1つのアーカイブPDFに結合する
これまでの流れ: トリガー、変数の初期化、PDF本文への変換、追加(本文)、各項目への適用、複数のPDFの結合。
全体 email 配列(本文PDFが最初、次に添付ファイルのPDFが添付ファイルの順序で)は、単一のマージ呼び出しに渡されます。
- 「各ループに適用」の下にある + 新しいステップ、 検索 PDF4me、 選ぶ 複数のPDFファイルを1つのPDFファイルに結合する。
- 設定する:
- 本文/ドキュメントコンテンツ: 選ぶ
email変数トークン - 出力ファイル名:
Email Attachment Merge Output.pdf
- 本文/ドキュメントコンテンツ: 選ぶ
マージアクションの設定

ステップ7:アーカイブにタイムスタンプ付きのファイル名を使用する理由とは?
これまでの流れ: トリガー、変数の初期化、PDF本文への変換、追加、各項目への適用、結合、ファイルの作成。
統合されたPDFファイルをUTCタイムスタンプ付きのファイル名でDropboxに書き込むことで、アーカイブの各エントリが常に新しい、並べ替え可能なファイルになります。同じアドレスに同じ秒内に2通のメールが送信されることは非常にまれなので、メッセージIDを埋め込む必要なく、効果的な一意性を確保できます。
- クリック + 新しいステップ、 選ぶ Dropbox: ファイルの作成。
- 設定する:
- フォルダパス:
/blog data/merge blog template/output - ファイル名 (表現、クリック)
fx):concat('merge-', formatDateTime(utcNow(), 'yyyyMMdd-HHmmss'), '.pdf') - ファイルの内容: 選ぶ ファイルの内容 複数のPDFを結合するアクションからのトークン
- フォルダパス:
ファイル名式

ファイルコンテンツをマッピングした最終アクション

受信トレイのメール量が多い場合のヒント。 1分間に10通以上のメールを受信するメールボックスの場合、メッセージの一意性を保証するために、メッセージのインターネットメッセージIDの短いハッシュ値を付加してください。 concat('merge-', formatDateTime(utcNow(), 'yyyyMMdd-HHmmss'), '-', substring(triggerOutputs()?['body/internetMessageId'], 0, 8), '.pdf')監査証跡は依然として読み取り可能であり、衝突は発生しない。
フローを実行して検証する
- 保存 右上の流れ。
- 監視対象のアドレスに、添付ファイル付きのメールを送信する。
- 開ける 実行履歴トリガーは数秒以内に作動するはずです。
- Dropboxを開く
/blog data/merge blog template/output/. という名前のファイルmerge-YYYYMMDD-HHmmss.pdfありますか。 - PDFファイルを開いてください。1ページ目は本文です。2ページ目以降は、添付ファイルが添付順に完全に表示されます。
実際に何を作ったのですか? 一切の手間をかけずにメールをアーカイブできるパイプライン。添付ファイル付きのメッセージはすべて、本文を先頭に添付ファイルを順番に並べた統合PDFファイルに変換され、タイムスタンプが付与されるため重複することなく、記録管理チームや監査担当者が検索できる共有フォルダに保存されます。添付ファイルが2つでも20個でも、同じ手順で処理できます。
再構築せずに追加できる一般的なバリエーション
endsWith(toLower(items('Apply_to_each')?['name']), '.pdf')メールの署名とインライン画像添付ファイルをスキップします。PDF/A-2b 合併後。アーカイブされたPDFファイルはISO 19005に準拠しており、法的保管および規制当局への提出に適しています。メールアーカイブ:PDFとEMLの比較
| 側面 | 統合PDF(このフロー) | 生のEMLエクスポート |
|---|---|---|
| 普遍的に読みやすい | はい、どのPDFリーダーでも大丈夫です | いいえ、Outlookまたは互換性のあるクライアントが必要です |
| コンテンツで検索 | はい、OCR対応です | 限定品、ボディのみ |
| 添付ファイルが含まれています | はい、ページとしてインラインで | はい、バイナリストリームとして |
| 監査フォーマットの一致 | SOX、GDPR、HIPAA、FINRAに準拠 | しばしば拒否される |
| 改ざん防止機能付き | はい、デジタルサインが追加された場合 | どのエディタでも簡単に編集できます |
| ファイルサイズ | 拡大表示(すべてのページを表示) | より小さい(レンダリングなし) |
| 顧客維持パイプライン | メール1通につきPDF1枚、簡単にリンクできます | EMLにはコンテナ形式が必要です |
よくある質問
個人用受信トレイではなく、共有メールボックスでこのフローをトリガーするにはどうすればよいですか?
交換する 新しいメールが届いたとき(V3) トリガー 共有メールボックスに新しいメールが届いたとき(V2)メールボックスアドレスを 元の郵便受けの住所 フィールド。フローの残りの部分は同一のままで、すべてのアタッチメント参照とボディ式は同じように解決されます。
メールに添付ファイルがない場合はどうすればいいですか?
トリガーは 添付ファイルのみ はい フィルターは、本文のみのメールではフローが実行されないようにします。本文のみのメールもアーカイブしたい場合は、そのフィルターを「いいえ」に設定し、「各項目に適用」ループを「条件: 特定の条件を満たす場合にのみ実行」で囲みます。 length(triggerOutputs()?['body/attachments']) 0より大きい値です。配列内の本文PDFが1つだけでもマージ処理は正常に動作し、1ページのアーカイブが生成されます。
アーカイブの1ページ目に、送信者、件名、受信日を含めるにはどうすればよいですか?
ステップ3の前に、 作曲する HTMLのプレアンブル付きアクション:
<h2>From: @{triggerOutputs()?['body/from']}</h2>
<h2>Subject: @{triggerOutputs()?['body/subject']}</h2>
<p>Received: @{triggerOutputs()?['body/receivedDateTime']}</p>
<hr>
@{triggerOutputs()?['body/body']}
次に、手順3の「ファイルコンテンツ」を「Compose」の出力先に設定します。これで、ページ1に検索可能なヘッダーメタデータが含まれるようになります。
これは、インライン画像を含むHTMLメールでも機能しますか?
はい。PDF4me Convert to PDFはインラインHTMLをレンダリングします。 <img src="cid:..."> 参照と埋め込みbase64画像。Outlookの body/body インラインコンテンツを含む完全なHTMLが含まれているため、レンダリングされたPDFは、受信者が見たものと同じ視覚的な忠実度を維持します。
処理の実行にはどれくらい時間がかかりますか?
1ページのDOCXファイルの場合、添付ファイル1つあたり約10~15秒、トリガーと最終アップロードに5~10秒かかります。添付ファイルが2つあるメールは、通常、エンドツーエンドで35~45秒で完了します。Power Automateの「各ファイルに適用」は、デフォルトでは順番に実行され、出力が順序付けられます。順序が重要ではなく、速度が必要な場合は、設定してください。 並行性制御 ループの設定で20に設定します。
トラブルシューティング
配列に追加する項目の1つ 価値 式はラップされていません base64ToBinary(...)各プッシュ(本文と添付ファイル)には変換が必要です。両方の追加アクションを再度開き、式エディタに切り替えて、式が正しいことを確認します。 base64ToBinary(body('Convert_to_PDF_Body')?['$content']) そして base64ToBinary(body('Convert_to_PDF')?['$content']) 原文のまま。
「PDF本文に変換」アクションで実際のHTMLが受信されませんでした。トリガーを確認してください。 添付ファイルを含める はい(それがなければ、体は時々空っぽで到着します)そして ファイルの内容 解決する triggerOutputs()?['body/body']、 ない body/bodyPreview。
デフォルト それぞれに適用する 並列実行されるため、追加順序が乱れる可能性があります。ループを開きます 設定 そして設定する 並行性制御 並列性の度合い 1ループは順次実行され、添付ファイルは配列の順序で配置されます。
タイムスタンプの解像度は1秒です。受信トレイの容量が大きい場合は、インターネットメッセージIDハッシュを追加してください。 concat('merge-', formatDateTime(utcNow(), 'yyyyMMdd-HHmmss'), '-', substring(triggerOutputs()?['body/internetMessageId'], 0, 8), '.pdf')。
次のステップ
同じ7つのステップ(トリガー、配列の初期化、本文の変換、ループ変換と追加、マージ、タイムスタンプ付き保存)は、「メールと添付ファイルを1つのPDFにまとめる」自動化処理に有効です。これを実行すれば、受信メッセージはすべて自動的に検索可能、ソート可能、監査対応のアーカイブエントリになります。