在 Power Automate 中将电子邮件正文和所有附件转换为一个合并的 PDF 文件:Outlook + PDF4me 的 7 步工作流程

以电子邮件为主导的工作流程中最痛苦的部分不是电子邮件本身,而是…… 以及随之而来的一切邮件正文包含上下文信息(谁发的、为什么发的、该怎么做),附件包含相关文件(发票、表格、已签署的合同),将它们分开存储意味着以后你需要点击三次才能重建邮件。本教程将构建一个精确的模式。 动力自动化 和 PDF4me 转换为 PDF, PDF4me 合并多个 PDF 文件, 前景, Dropbox以及一个“应用到每个”循环。七个流程操作。一封收到的电子邮件被接收。一个合并后的 PDF 文件被发送出去,先发送正文,然后逐个发送附件,自动添加时间戳并放入您的存档文件夹。
展望 当收到新邮件时(V3) 当消息到达时,触发器立即触发。 [email protected]一个名为 的数组变量 电子邮件 打开。PDF4me 转换为 PDF 首先将 HTML 正文转换为 PDF,转换后的正文作为第 1 页添加到数组中。 适用于每个 遍历每个附件(本次运行包含两个 DOCX 文件): 3页.docx, Docx_2Pages.docx),将每个文件转换为 PDF,并依次追加。PDF4me 合并多个PDF文件 Dropbox 会读取整个数组并生成一个合并后的 PDF 文件。 创建文件 将其写回为 merge-20260611-103323.pdf一个带有时间戳且永不冲突的名称。正文在前,附件按顺序排列,一个PDF文件,一个文件夹,随时可供审核。
基于原因的问答
为什么要先把正文转换成PDF格式? 正文是上下文:谁发的,为什么发的,该怎么做。未来的你阅读合并后的PDF文件时,希望第一页能交代清楚背景,然后再查看附件。转换 triggerOutputs()?['body/body'] 首先将 HTML 正文合并到 PDF 中,意味着合并操作会将消息本身视为主要文档,而不是单独的文本转储。
为什么主体和附件都使用同一个数组变量? 合并操作需要一个有序的集合。初始化一次,在步骤 4 中推送正文,在步骤 5 中推送每个转换后的附件,数组就能准确地按照所需的文档顺序排列。如果使用两个独立的数组,后续的撰写操作就必须将它们连接起来,这只会增加实现相同结果所需的额外代码。
为什么 base64 转二进制 每次推动都这样吗? PDF4me 的 PDF 转换功能会将输出结果以 base64 字符串的形式包装。 $contentOutlook 附件以 base64 编码格式接收。 内容字节PDF4me 合并多个 PDF 文件需要二进制缓冲区。 base64ToBinary(...) 调用桥接器会同时调用这两个数据源,只是指向不同的属性名称。跳过转换,合并操作会因“内容无效”而报错。
为什么输出名称要带时间戳? 如果文件名相同,同一发件人在一小时内发送的两封电子邮件将会冲突。 concat('merge-', formatDateTime(utcNow(), 'yyyyMMdd-HHmmss'), '.pdf') 产生诸如 merge-20260611-103323.pdf可按字典序排序,精度为二分之一,可立即读取为 UTC 时间戳。
您将获得
输入: 任何发送到受监控地址(此处为地址)的电子邮件 [email protected])以及一个或多个附件。本教程使用简短的消息正文(“嗨,希望你一切都好……”)和两个 DOCX 附件(3Page.docx, Docx_2Pages.docx)。 输出: 一个单独的合并 PDF 文件被拖放到 /blog data/merge blog template/output/名为 merge-YYYYMMDD-HHmmss.pdf第 1 页是正文。从第 2 页开始,依次显示附件,使用 Aspose Words 渲染。
收到的电子邮件

该流程会监视 Outlook 收件箱。 [email protected]一旦 Gmail 转发邮件或此地址直接收到邮件,触发器就会启动。
两次运行后的输出 Dropbox 文件夹

合并后的PDF文件第1页

第 1 页是转换后的电子邮件正文。第 2 页及之后是第一个附件(3页.docx第二个附件(Docx_2Pages.docx紧随其后。一份PDF文件,完整信息已重构。
你需要什么
- 动力自动化。 打开 Power Automate任何包含高级连接器的套餐(PDF4me Connect 属于高级套餐)。
- PDF4me API密钥。 获取您的 API 密钥首次添加 PDF4me 操作时进行连接。
- Office 365 Outlook对于 当收到新邮件时(V3) 触发并读取附件
内容字节任何连接器可以进行身份验证的收件箱都可以使用。 - Dropbox (或 SharePoint、OneDrive、Google Drive)。用于生成最终的合并 PDF 文件。
- 一封带有附件的电子邮件本教程使用了两个 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 文件合并成一个 PDF 文件输入数组,输出一个 PDF 文件。
- Dropbox:创建文件文件名表达式会添加 UTC 时间戳。
完整流程概述

七个操作。“应用于每张卡片”按钮显示“1/2”,因为测试邮件有两个附件。PDF4me 在流程中出现三次:转换正文、转换附件、合并所有内容。
步骤 1:Outlook:收到新邮件时(V3)
目前为止的流程: 仅触发。
- 在 动力自动化 点击 创造, 选择 自动化云流。
- 给流程命名(例如:
Email to Consolidated PDF), 挑选 Office 365 Outlook:收到新邮件时(V3) 以点击作为触发器 创造。 - 连接 您的 Office 365 邮箱。
- 扩张 高级参数 和 显示全部 显示筛选选项。
- 配置:
- 到:
[email protected](筛选出只有发送到此地址的邮件才能触发流程) - 包含附件:
Yes - 仅带附件:
Yes
- 到:
触发器配置

提示。 仅限附件 是 正是这一点阻止了流程在每个内部通知、日历邀请或回复时都触发。结合使用 到 对专用别名进行过滤(例如, [email protected]) 创建一个干净的接收地址,该地址只接收您真正想要合并的邮件。
步骤 2:初始化变量电子邮件
目前为止的流程: 触发器加上初始化变量。
打开一个空数组来收集正文 PDF 和所有附件 PDF。
- 点击 + 新步骤, 挑选 初始化变量。
- 配置:
- 姓名:
email - 类型:
Array - 价值:留空
- 姓名:
初始化变量配置

步骤 3:PDF4me:转换为 PDF(正文)
目前为止的流程: 触发器 + 初始化变量 + 转换为 PDF 正文。
Outlook 触发器以 HTML 格式发出邮件正文。 body/bodyPDF4me 转 PDF 功能直接读取 HTML,因此整个转换过程只需一次操作。
- 点击 + 新步骤, 搜索 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'])
- 姓名:

这两个物业名称很重要。 Outlook 附件字节流 内容字节PDF4me 转换为 PDF 输出的功能仍然存在。 $content两者都是 base64 编码。粘贴表达式时请保持名称一致,循环就能正常运行。
步骤 6:PDF4me:合并多个 PDF 文件
目前为止的流程: 触发器 + 初始化变量 + 转换为 PDF 正文 + 追加(正文) + 应用于每个 + 合并多个 PDF。
整个 email 数组(首先是正文 PDF,然后是附件 PDF,按附件顺序)会进入单个 Merge 调用。
- 在“应用到每个循环”下方单击 + 新步骤, 搜索 PDF4me, 挑选 将多个 PDF 文件合并成一个 PDF 文件。
- 配置:
- 正文/文档内容选择
email变量标记 - 输出文件名:
Email Attachment Merge Output.pdf
- 正文/文档内容选择
合并操作配置

步骤 7:Dropbox:创建带时间戳的文件
目前为止的流程: 触发器 + 初始化变量 + 转换为 PDF 正文 + 追加 + 应用于每个 + 合并 + 创建文件。
将合并后的 PDF 文件以带有 UTC 时间戳的文件名写入 Dropbox,以便每次运行都能生成一个全新的、可排序的文件。
- 点击 + 新步骤, 挑选 Dropbox:创建文件。
- 配置:
- 文件夹路径:
/blog data/merge blog template/output - 文件名 (表达式,点击)
fx):concat('merge-', formatDateTime(utcNow(), 'yyyyMMdd-HHmmss'), '.pdf') - 文件内容选择 文件内容 来自“合并多个 PDF”操作的令牌
- 文件夹路径:
文件名表达式

最终操作,文件内容已映射

提示。 想要每个发件人域对应一个文件夹?请将静态文件夹路径替换为 concat('/inbox-pdfs/', split(triggerOutputs()?['body/from'], '@')[1], '/')PDF 文件会自动路由到子文件夹,例如 /inbox-pdfs/yourcompany.com/ 基于发件人的域名。
运行流程并验证
- 节省 右上角的流水。
- 向受监控的地址发送一封包含一个或多个附件的电子邮件(使用的操作指南)。
[email protected])。 - 打开 运行历史记录触发器应在几秒钟内触发。观察每个操作是否变为绿色:转换为 PDF 正文(针对较短的 HTML 正文)大约需要 10 秒;“应用于每个”默认并行运行,并在大约 22 秒内完成两个附件的处理;“合并多个 PDF”大约需要 11 秒。
- 打开 Dropbox
/blog data/merge blog template/output/一个名为merge-YYYYMMDD-HHmmss.pdf有没有。 - 打开PDF文件。第1页是正文。从第2页开始,依次显示所有附件,附件内容完整呈现。
你实际建造了什么? 零接触式邮件归档流程。所有带附件的邮件都会被合并成一个 PDF 文件,先处理邮件正文,然后按顺序处理附件,并添加时间戳以避免冲突,最后放入共享文件夹,方便您的团队或审核人员搜索。同样的流程可以处理两个附件或二十个附件,无需任何修改。该流程也适用于 Make(Outlook 触发器 + 附件迭代器 + PDF4me 合并)和 Zapier(通过 Zapier 发送邮件或 Outlook 触发器 + 循环 + PDF4me 合并)。
无需重建即可添加的常见变体
endsWith(toLower(items('Apply_to_each')?['name']), '.pdf') 或类似功能。能够干净利落地跳过签名和内嵌图片附件。身体/身体合并后的 PDF 第 1 页现在包含一个页眉,您可以稍后对其进行 grep 搜索。PDF/A-2b 合并后,存档的合并PDF文件现已符合ISO 19005标准,可用于法律保留或提交监管机构。故障排除
添加到数组之一 价值 表达式没有被包装 base64ToBinary(...)每次推送(正文和附件)都需要转换。重新打开两个追加操作,切换到表达式编辑器,并确认表达式是否正确。 base64ToBinary(body('Convert_to_PDF_Body')?['$content']) 和 base64ToBinary(body('Convert_to_PDF')?['$content']) 逐字。
“转换为 PDF 正文”操作未接收到实际的 HTML 正文。请检查触发器的 包含附件 留下了“是”(如果没有它,尸体有时会空着),而且 文件内容 解决 triggerOutputs()?['body/body'], 不是 身体/身体预览。
因为邮件没有附件,所以触发了触发器。 仅带附件 设置为“否”。要么将其更改为“是”,要么将“应用到每个”语句包装在一个仅在以下情况下运行的条件语句中: length(triggerOutputs()?['body/attachments']) 大于零。
默认值 适用于每个 并行运行,这可能会打乱追加顺序。打开循环的 设置 并设置 并发控制 与……的平行程度 1现在循环按顺序运行,附件会按照 Outlook 返回的顺序精确地放入数组中。
后续步骤
同样的七步模式(触发、初始化数组、转换正文、循环转换并追加、合并、最后保存并添加时间戳)适用于任何“将电子邮件及其附件合并到一个 PDF 文件中”的自动化流程。只需运行一次,所有收到的邮件都会自动变成一个可搜索、可排序的存档条目。