Power Automate 中的电子邮件归档:使用 PDF4me 将一封 Outlook 邮件转换为 SharePoint 中的一个压缩 PDF/A 文件

PDF4me 创建 PDF 这是一个 Power Automate 操作,可将 PDF 文件重写为 ISO 19005 归档标准。它位于 Outlook 流程的末尾,该流程会转换邮件正文、转换所有附件并合并它们,从而将电子邮件归档转换为 SharePoint 永久存储的单个压缩 PDF/A 文件。
搜索邮件归档服务,第一页都是卖存储服务的产品。Proofpoint、Mimecast、Barracuda、GoDaddy,它们都回答了“邮件会保存在哪里,保存多久”这个问题。但没有一家公司回答真正决定邮件归档是否值得保留的问题: 它是什么格式的? 邮箱导出文件只有在仍然可以打开的情况下才能读取。这种流程首先将归档视为格式问题,其次才是存储问题,这与结果页面上的所有其他流程的顺序正好相反。
一封邮件到达受监控的邮箱。Power Automate 会将邮件正文转换为 PDF,将所有附件转换为 PDF,并按邮件到达顺序合并成一个文档,然后进行压缩,再转换为 PDF/A-2b 格式,最后将结果归档到 SharePoint 中。邮件正文位于第一页,附件紧随其后。整个过程共执行 11 个操作,平均每封邮件耗时约 56 秒,最终生成的文档即使在邮箱关闭很久之后仍然可以正常打开。
基于原因的问答
为什么要把主体和附件合并在一起,而不是分开存储? 因为只有结合上下文和物品才能产生意义。物品本身说明了是谁寄的以及寄送的原因,而附件则是物品本身。如果将它们分别存储为单独的文件,之后再去重构信息就成了一项小型研究项目。而一个PDF文件就能完整地保存所有证据。
为什么PDF/A格式对电子邮件来说很重要? 电子邮件的保留期限很长,通常为七年,有时甚至是永久的。普通的PDF文件可能会引用文件外部的字体和颜色配置文件。 PDF/A 禁止这样做,因此渲染页面所需的一切都会随之迁移。这正是保留策略中“在保留期内可读”的要求。
为什么要在PDF/A转换之前进行压缩? 原因有二,而且都指向同一个方向。PDF/A 转换会嵌入字体和配置文件,因此会增加文件大小;先压缩可以抵消这种影响。此外,压缩会重写图像流,所以对刚刚通过认证的文件进行压缩可能会破坏您付费获得的合规性。因此,请先压缩,再进行认证。
为什么使用数组变量而不是链式执行操作? 因为附件数量在邮件到达之前是未知的。数组是唯一能够容纳一个邮件正文和 N 个附件并保持其顺序的结构。合并操作一次性接受整个数组,因此无论最终有多少个文件,循环都只需执行两次操作。
您将获得
输入: 一封带有一个或多个附件的 Outlook 电子邮件。 输出: SharePoint 中有一个压缩的 PDF/A-2b 文件,其中包含邮件正文(第一页)以及所有附件(按顺序排列)。

触发流程的消息:简短的正文和一个 PDF 附件。

EmailArchive.pdf 由流程帐户在邮件到达后约一分钟内写入。
你需要什么
- 动力自动化。 打开 Power Automate基于标准层连接器的云流。无需高级套餐,也无需网关。
- Office 365 Outlook 邮箱 您可以进行监控。共享邮箱可行,通常是存档的更佳选择。
- PDF4me API密钥。 获取您的 API 密钥此流程使用两个 PDF4me 连接:PDF4me Connect 和 PDF4me PDF。一个密钥即可同时授权这两个连接。
- 包含存档文件夹的 SharePoint 网站在构建之前创建它,以便文件夹选择器有东西可以指向。
- 附件示例。 demo-attachment.pdf随测试邮件一起发送的单页PDF文件。
- 已完成的档案。 电子邮件存档输出.pdf两页,PDF/A-2b,正是流程生成的内容。
请先下载这两个文件。 将附件发送给自己,然后将结果与最终生成的压缩文件进行比较。打开文档属性,您应该会看到 PDF/A-2b 标识。了解正确的输出格式是判断您的运行是否真正成功的最快方法。
流程概览
- 当收到新邮件时(V3) (Outlook 触发器)包含附件。
- 初始化变量
email类型为数组。 - 转换为 PDF 在 HTML 邮件正文中(PDF4me Connect)。
- 追加到数组变量 推动改装后的车身。
- 适用于每个 扳机上方
Attachments。 - 转换为 PDF 2 每个附件的
contentBytes。 - 追加到数组变量 2 推送每个转换后的附件。
- 将多个 PDF 文件合并成一个 PDF 文件 (PDF4me Connect)。
- PDF压缩 使用优化配置文件
Web。 - PDF - 创建 PDF 合规
PdfA2b。 - 创建文件 (SharePoint)
/Shared Documents/EmailArchive。
完整流程概述

整个运行过程中,四项文档操作耗时十到十一秒,占据了大部分时间。对于包含一个附件的邮件,预算大约需要五十六秒;每增加一个附件,大约需要增加十秒。
步骤 1:如何触发 Outlook 传入邮件的流程?
目前为止的流程: 目前还没有什么,这是触发点。
触发器决定哪些内容会被存档,因此务必谨慎设置。它的两个高级参数才是真正起作用的。
- 创建一个 自动化云流 并挑选 Office 365 Outlook > 当收到新邮件时(V3)。
- 打开 高级参数 并进行配置:
- 到:
[email protected] - 包含附件:
Yes - 重要性:
Any - 仅带附件:
Yes - 文件夹:
Inbox
- 到:
Outlook 触发器配置

“包含附件”是人们经常忽略的选项。如果关闭此选项,循环仍然会运行,但每个附件的内容都将为空。
提示。 包含附件 和 仅带附件 听起来像是同一个设置,但实际上并非如此。第一个设置控制附件字节是否随触发有效负载一起下载。第二个设置控制流程是否触发。几乎总是需要将第一个设置设为“是”。 Yes是否需要第二个选项,取决于你是否认为不带附件的电子邮件值得存档。
步骤 2:为什么流程需要一个数组变量?
目前为止的流程: Outlook触发器。
直到收到邮件时,附件的数量才知道,因此流程需要某个地方来累积未知数量的 PDF 文件,同时保持它们的顺序。
- 添加 变量 > 初始化变量。
- 配置:
- 姓名:
email - 类型:
Array - 价值留空
- 姓名:
初始化变量配置

值保持为空。正文随后会被追加到循环之前,因此它会出现在第一页。
步骤 3:如何将电子邮件正文转换为 PDF?
目前为止的流程: Outlook 触发器加上初始化变量。
Outlook 触发器会将邮件正文以 HTML 格式传递。PDF4me Convert to PDF 会将其渲染成 PDF 格式,这就是为什么文件名会包含一个 .pdf 文件。 .html 即使返回的是 PDF 文件,也需要扩展名。
- 添加 转换为 PDF 从 PDF4me Connect 联系。
- 配置:
- 内容: 这
Body令牌,解析为triggerOutputs()?['body/body'] - 文件名:
email-body.html
- 内容: 这
转换为 PDF 配置

文件名中的扩展名告诉转换器它接收到的文件类型。输入的是 HTML 文件,所以即使输出是 PDF 文件,email-body.html 也是正确的。
步骤 4:如何将邮件正文放在第一页?
目前为止的流程: Outlook触发器,初始化变量,转换为PDF。
合并文档中的顺序就是元素进入数组的顺序。将主体内容添加到循环之前,就是确保它始终位于最前面的机制。
- 添加 变量 > 追加到数组变量。
- 配置:
- 姓名:
email - 价值: 这 文件内容 来自令牌 转换为 PDF,其结果为
body('Convert_to_PDF')
- 姓名:
追加到数组变量配置

值必须是文件内容标记,即 body('Convert_to_PDF')。此处填写其他值是导致后续合并失败的最常见原因。
这个字段正是典型的故障点。 该值必须是 文件内容 转换操作的输出。如果选择不同的标记,或者将其包装在返回文件内容以外的值的表达式中,则数组将填充错误的形状,并且 合并多个PDF文件 要么直接失败,要么返回一个无法打开的 PDF 文件。运行历史记录在合并步骤之前一直保持绿色,因此错误是在出错很久之后才出现的。
步骤 5:如何将每个电子邮件附件转换为 PDF?
目前为止的流程: Outlook 触发器,初始化变量,转换为 PDF,追加到数组变量。
遍历附件集合一次,循环内执行两个操作。这就是全部流程,即使附件数量增加,流程也不会改变。
- 添加 控制 > 适用于每个。
- 从之前的步骤中选择一个输出。: 这
Attachments令牌,解析为triggerBody()?['Attachments']。
应用于每个配置

循环内有两个操作,无论附件是一个还是二十个,这个结论都成立。
现在将第一个动作添加到循环中。
- 添加 转换为 PDF (PDF4me Connect)在循环内部。Power Automate 将其命名为 转换为 PDF 2。
- 配置:
- 文件内容:表达式
base64ToBinary(items('Apply_to_each')?['contentBytes']) - 文件名: 这
name附件中的令牌
- 文件内容:表达式

Outlook 会以 base64 编码方式传输附件。base64ToBinary 函数会将 contentBytes 转换回转换器可以读取的文件格式。
然后是循环内的第二个操作。
- 添加 追加到数组变量 在循环内部,名为 追加到数组变量 2。
- 配置:
- 姓名:
email - 价值: 这 文件内容 来自令牌 转换为 PDF 2,其结果为
body('Convert_to_PDF_2')
- 姓名:

与步骤 4 相同的数组和模式。每次循环都会向最终存档中添加一个页面范围。
两个循环表达式
| 场地 | 表达 | 它的作用 |
|---|---|---|
| 适用于每个 输入 | triggerBody()?['Attachments'] | 触发消息中的附件集合。 |
| 转换为 PDF 2 文件内容 | base64ToBinary(items('Apply_to_each')?['contentBytes']) | 将当前附件的 base64 有效载荷解码为二进制数据。 |
| 转换为 PDF 2 文件名 | 附件 name 令牌 | 转换过程中保留原始文件名。 |
| 追加到数组变量 2 价值 | body('Convert_to_PDF_2') | 转换后的PDF文件附加到同一位置 email 大批。 |
base64ToBinary 和 items() 两者都来自 工作流定义语言函数参考这是表达式字段可接受内容的权威列表。
步骤 6:如何将数量不明的 PDF 文件合并成一个 PDF 文件?
目前为止的流程: 所有内容都通过“应用到每个”循环进行处理。
当循环结束时, email 数组包含正文 PDF 文件以及所有附件 PDF 文件。合并操作会在一次调用中处理整个数组。
- 添加 将多个 PDF 文件合并成一个 PDF 文件 从 PDF4me Connect循环结束后。
- 配置:
- 文档内容:
@variables('email') - 输出文件名:
EmailArchive.pdf
- 文档内容:
代码视图使形状一目了然:
{
"type": "OpenApiConnection",
"inputs": {
"parameters": {
"body/docContent": "@variables('email')",
"body/document/Name": "EmailArchive.pdf"
},
"host": {
"apiId": "/providers/Microsoft.PowerApps/apis/shared_pdf4meconnect",
"connection": "shared_pdf4meconnect",
"operationId": "Merge_V1"
}
},
"runAfter": {
"Apply_to_each": [
"Succeeded"
]
}
}
合并操作代码视图

runAfter Apply_to_each Succeeded 保证合并操作会等待每个附件完成转换。
提示。 合并操作只需对整个数组进行一次调用,而不是对每个文件都进行一次调用。这就是为什么添加附件时运行时间几乎不变的原因。一封包含 15 个附件的电子邮件的开销在于循环内的 15 次转换,而不是 15 次合并操作。
步骤 7:如何使电子邮件存档符合 PDF/A 标准?
目前为止的流程: 所有操作均通过 Merge 完成。
按此顺序,采取以下两项行动: PDF4me PDF 联系。这种秩序并非表面功夫。
- 添加 PDF压缩。
- 文件内容合并后的文件内容
- 文件名: 这
headers/FileName从上一次操作继承的令牌 - 优化配置文件:
Web
- 添加 PDF - 创建 PDF。
- 文件内容压缩文件的内容
- 文件名: 这
headers/FileName令牌 - 遵守:
PdfA2b - 允许升级:
Yes - 允许降级:
Yes
压缩并创建 PDF 参数
| 行动 | 范围 | 此处使用的值 | 它控制着什么 |
|---|---|---|---|
| PDF压缩 | 优化配置文件 | Web | 在文件大小和清晰度之间取得平衡。如果附件是需要仔细阅读的扫描件,请使用更高清晰度的配置文件。 |
| PDF - 创建 PDF | 遵守 | PdfA2b | ISO 19005-2 B 级。保证视觉再现,这是大多数保存政策所指的级别。 |
| PDF - 创建 PDF | 允许升级 | Yes | 当请求的操作无法执行时,允许操作执行到更高的级别。 |
| PDF - 创建 PDF | 允许降级 | Yes | 让它降级而不是直接失败,通常是在字体无法嵌入时。 |

压缩操作在合并文档上进行,在进行任何认证之前完成。

创建 PDF 是处理文档的最后一个操作,这才是它应该在的位置。
步骤 8:完成的存档存储在哪里?
目前为止的流程: 所有操作均通过 Create PdfA 完成。
最后一步操作是将认证文件写入 SharePoint。
- 添加 SharePoint > 创建文件。
- 配置:
- 网站地址:
PDF4me Sharepoints - https://ynoox1.sharepoint.com/sites/PDF4meSharepoints - 文件夹路径:
/Shared Documents/EmailArchive - 文件名:
EmailArchive.pdf - 文件内容: 这 文件内容 来自令牌 PDF - 创建 PDF,其结果为
body('PDF_-_Create_PdfA')
- 网站地址:
SharePoint 创建文件配置

文件内容解析为 body('PDF_-_Create_PdfA')。如果改用压缩方式,则可以得到一个有效的 PDF 文件,而不是一个压缩文件。
上线前请修改此设置。 此处的文件名是静态文本。 EmailArchive.pdf完全按照捕获的内容来写。这对于测试来说没问题,但对于归档来说就不对了:每封邮件都写入同一个名称,因此每封新邮件要么覆盖之前的归档邮件,要么与之冲突。应该将其替换为每封邮件唯一的名称。时间戳就可以: concat('EmailArchive-', formatDateTime(utcNow(), 'yyyyMMdd-HHmmss'), '.pdf')邮件主题也是如此。只保留一个文件的归档文件不能称之为归档文件。
运行流程并验证
向监控地址发送至少带有一个附件的测试邮件,然后检查三件事而不是一件事。
- 运行历史记录。 所有 11 个操作均显示绿色,并且“应用到每个操作”都显示了正确的迭代次数。捕获的运行结果显示
1 of 1适用于单附件电子邮件。 - SharePoint文件夹。
EmailArchive.pdf存在于/Shared Documents/EmailArchive,其中“修改者”显示流程的帐户。 - 文件本身。 这是很多人会忽略的步骤。打开文档属性,确认 PDF/A 声明确实存在。
捕获的运行生成的归档文件大小为 32,088 字节。 两页:第一页是邮件正文,第二页是附件。其嵌入的 XMP 元数据声明: pdfaid:part 作为 2 和 pdfaid:conformance 作为 B这就是 PDF/A-2b 文件的内部结构。如果您的输出文件可以正常打开,但没有包含此类声明,则“创建文件”操作几乎肯定是从错误的上游操作读取的。
你实际建造了什么? 邮件归档流程会在无需任何人为操作的情况下,生成一份独立、符合标准的邮件及其所有附件的记录。邮箱保持不变。归档文件是一个独立的文档,其格式设计为即使在数十年后仍可读取,而这正是邮箱导出和存储层级所无法提供的。
无需重建即可添加的常见变体
放 仅带附件 到 不循环只运行了零次,合并操作接收一个包含一个元素的数组,因此归档文件只剩下正文。
使用触发器的主题和接收时间(而非仅使用时间戳)构建文件名。首先移除 SharePoint 拒绝的字符,否则创建文件操作会因主题行中的标点符号而失败。
添加 验证 PDF 在创建 PDF 并根据结果进行分支之后,故障会显示在运行历史记录中,而不是在三年后的审计中才被发现。
根据触发器的“发件人”地址或接收日期生成文件夹路径。一个流程无需任何条件即可处理整个文件夹树。
与通常方法相比,这种方法有何不同?
| 比较 | 另一种选择保留了什么 | 格式保证 | 自动运行 |
|---|---|---|---|
| Outlook 存档按钮与此流程 | 该邮件被移至同一邮箱中的另一个文件夹。 | 没有。它仍然是 Exchange 中的邮件项目。 | 不,得有人点击才行。 |
| 日志设备与此流程 (Mimecast,Proofpoint) | 所有东西都存放在供应商商店里。 | 供应商自己的格式,可通过他们的产品读取。 | 是的,需要支付许可费。 |
| Microsoft 365 存档与此流程 | 同样大小的字节,使用更便宜的存储层。 | 无。文件未作任何更改。 | 是的,但这是存储,不是格式。 |
| 这种流程 | 正文及附件,合并为一个文档 | PDF/A-2b,独立式 | 是的,使用标准连接器。 |
关键的区别在于:前三个问题回答了邮件的存储位置。只有最后一个问题回答了当生成邮件的软件消失后,邮件是否还能正确显示。
常见问题
什么是电子邮件归档?
电子邮件归档是指将邮件保存到单独的、持久的存储空间中,使其免受邮箱清理、员工离职和数据保留期限的影响。大多数产品将其定义为一种存储问题:将邮件复制到安全的地方并建立索引以便于搜索。
这个定义并不完整。只有当邮件存档仍然可以打开时,它才有用;邮件也必须与其所在的系统关联。将邮件及其附件转换为固定的文档格式,才能将副本转化为正式记录。
电子邮件归档是如何工作的?
传统上,日志设备位于邮件服务器旁边,接收所有内容的副本,并将其存储在具有自己搜索界面的专有存储库中。
此流程的工作方式不同。邮件到达时触发一个事件,正文和附件被转换为 PDF 格式,按顺序合并成一个文档,压缩后再转换为 PDF/A-2b 格式,最后写入 SharePoint。此流程无需任何专用设备或专有存储,输出文件无需您的软件即可被任何人打开。
如何将电子邮件归档到 SharePoint?
指向 Office 365 Outlook 在邮箱触发,在流程中执行文档工作,并结束。 SharePoint 创建文件 指向目标文件夹。它的形状就是这样。
真正值得做好的是你写的内容。保存 .msg 或者 .eml 从技术上讲,将文件归档到文档库相当于归档到 SharePoint,但最终生成的是一个需要邮件客户端才能访问的邮件项目。PDF/A 文件是一种 SharePoint 可以像处理其他文档一样对其进行索引、预览和应用保留标签的文档。
可以在 SharePoint 中保存电子邮件吗?
是的,可以通过多种方式实现,但它们并不等同。您可以将邮件从 Outlook 拖到同步库中,也可以对单封邮件使用“保存到 OneDrive”功能,或者像本流程一样使用 Power Automate 实现自动化。
手动路由会将邮件以其原始格式保存,因此附件会嵌入到只有邮件客户端才能打开的文件中。自动路由允许您选择输出格式,因此,如果目的是保存邮件而非方便操作,则应优先选择自动路由。
邮件归档的最佳实践是什么?
第四点无论使用何种工具都适用。邮件到达后立即归档,而不是按计划归档,这样就不会依赖于某人的记忆。邮件正文及其附件应保持在一起,因为将它们分开会破坏邮件作为证据的上下文。使用有规范支持的格式,实际上指的是 PDF/A。并且为每个归档项目指定一个唯一的名称,因为覆盖前一天文件的归档实际上是一个多了步骤的单一文档。
这里的流程按结构遵循前三个步骤。第四个步骤是上线前必须修改的,与捕获的配置有所不同。
故障排除
检查 价值 在“追加数组变量”操作中,每个字段都必须是 文件内容 从其 Convert 操作中获取令牌,解析为 body('转换为PDF') 和 body('转换为PDF_2')任何其他标记都会以错误的形状填充数组,并且 Merge 之前的每个操作仍然会报告成功。
包含附件 设置为 不 触发后,附件集合仍然包含名称和元数据,因此循环迭代的次数正确,但是 内容字节 为空,没有东西需要转换。
创建文件 文件名 是静态文本 电子邮件存档.pdf每次运行都针对同一个名称。按照步骤 8 中的说明,通过时间戳或主题行使每个消息的名称唯一。
创建文件正在读取 PDF压缩 而不是 PDF - 创建 PDF结果生成了一个更小、完全有效的 PDF 文件,但它未能通过所有合规性检查,而且运行历史记录中没有任何异常。请确认表达式是否正确。 body('PDF_-_Create_PdfA')。
相关阅读
本文介绍电子邮件自动化流程中的归档格式部分。接下来的三篇教程将介绍其他相关部分:
- 将电子邮件正文及其所有附件合并成一个PDF文件。 详细介绍了合并模式本身,并将其存储到 Dropbox。
- 将每封收到的电子邮件转换为可用于审计的 PDF 存档。 从记录管理角度出发,采取同样的七项措施。
- 在 Power Automate 中使用无人值守的 SharePoint 文件夹进行 PDF 归档 将压缩和 PDF/A 对应用于 SharePoint 中已有的文档,不涉及电子邮件。
后续步骤
存储决定了邮件的存放位置。格式决定了邮件是否还能被他人阅读。这个流程解决了第二个问题,而这个问题在搜索结果的第一页上根本没人问。