现在,通过将 和 OnAppointmentFromChanged
事件添加到OnMessageFromChanged
基于事件的激活功能,在使用多个 Exchange 帐户时将正确的签名应用于邮件变得更加容易。 当 OnMessageFromChanged
正在撰写的邮件的“ 发件人 ”字段中的帐户发生更改时,将发生该事件,而 OnAppointmentFromChanged
当正在撰写的会议的组织者发生更改时,将发生该事件。 这些事件进一步扩展了签名加载项的功能,并允许它们:
- 为用户提供为其每个帐户应用自定义签名的便利。
- 使邮箱代理能够更准确、更高效地管理来自多个邮箱的传出邮件和会议请求。
- 确保用户的消息和约会符合其组织的通信和营销策略。
以下部分将指导你如何开发基于事件的外接程序,该外接程序处理 OnMessageFromChanged
事件,以在更改“ 发件人 ”字段中的邮件帐户时自动更新邮件的签名。
支持的客户端和平台
下表列出了支持 OnMessageFromChanged
和 OnAppointmentFromChanged
事件的客户端-服务器组合。 选择适用事件的选项卡。
客户端 | Exchange Online | Exchange 2019 本地 (累积更新 12 或更高版本) | Exchange 2016 本地 (累积更新 22 或更高版本) |
---|---|---|---|
Web 浏览器 (新式 UI) 新的 Outlook on Windows |
支持 | 不适用 | 不适用 |
Windows (经典) 版本 2304 (内部版本 16327.20248) 或更高版本 |
支持 | 支持 | 支持 |
Mac 版本 16.77 (23081600) 或更高版本 |
支持 | 不适用 | 不适用 |
iOS 版本 4.2502.0 |
支持 | 不适用 | 不适用 |
Android 版本 4.2502.0 |
支持 | 不适用 | 不适用 |
先决条件
若要测试演练,必须至少有两个 Exchange 帐户。
设置环境
完成 Outlook 快速入门,使用 Office 加载项的 Yeoman 生成器创建加载项项目。
配置清单
打开 manifest.json 文件。
导航到
"authorization.permissions.resourceSpecific"
数组。 在数组对象中,将 属性"MailboxItem.ReadWrite.User"
的值"name"
替换为 。 加载项需要此项才能更新消息的签名。... "authorization": { "permissions": { "resourceSpecific": [ { "name": "MailboxItem.ReadWrite.User", "type": "Delegated" } ] } }, ...
将以下对象添加到
"extensions.runtimes"
数组中。 关于此标记,请注意以下几点。"minVersion"
邮箱要求集的 配置为"1.13"
,因为这是支持OnMessageFromChanged
事件的要求集的最低版本。 有关详细信息,请参阅 配置 Outlook 外接程序进行基于事件的激活中的“支持的事件”表。"id"
运行时的 设置为描述性名称"autorun_runtime"
。属性
"code"
的子"page"
属性设置为 HTML 文件,子"script"
属性设置为 JavaScript 文件。 稍后的步骤将创建或编辑这些文件。 Office 根据平台使用这些值之一。- 经典 Outlook on Windows 在仅限 JavaScript 的运行时中执行事件处理程序,该运行时直接加载 JavaScript 文件。
- Outlook 网页版 和 Mac 上,新的 Outlook on Windows 在浏览器运行时中执行处理程序,这将加载 HTML 文件。 HTML 文件包含随后
<script>
加载 JavaScript 文件的标记。
有关详细信息,请参阅 Office 外接程序中的运行时。
"lifetime"
属性设置为"short"
。 这意味着运行时在事件发生时启动,并在处理程序完成时关闭。需要
"actions"
为OnMessageFromChanged
和OnNewMessageCompose
事件运行处理程序。 你将在后面的步骤中创建处理程序。
{ "requirements": { "capabilities": [ { "name": "Mailbox", "minVersion": "1.13" } ] }, "id": "autorun_runtime", "type": "general", "code": { "page": "https://localhost:3000/commands.html", "script": "https://localhost:3000/launchevent.js" }, "lifetime": "short", "actions": [ { "id": "onMessageFromChangedHandler", "type": "executeFunction", "displayName": "onMessageFromChangedHandler" }, { "id": "onNewMessageComposeHandler", "type": "executeFunction", "displayName": "onNewMessageComposeHandler" } ] }
"autoRunEvents"
将数组添加为数组中"extensions"
对象的属性。 数组"autoRunEvents"
包含具有以下键属性的对象。- 属性
"events"
将处理程序分配给OnMessageFromChanged
和OnNewMessageCompose
事件。 有关统一清单中使用的事件名称的信息,请参阅 为基于事件的激活配置 Outlook 外接程序中的“支持的事件”表。 - 中
"actionId"
提供的函数名称必须与前面配置的数组中"actions"
其相应对象的 属性匹配"id"
。
"autoRunEvents": [ { "requirements": { "capabilities": [ { "name": "Mailbox", "minVersion": "1.13" } ], "scopes": [ "mail" ] }, "events": [ { "type": "messageFromChanged", "actionId": "onMessageFromChangedHandler" }, { "type": "newMessageComposeCreated", "actionId": "onNewMessageComposeHandler" } ] } ]
- 属性
提示
- 若要了解外接程序中的运行时,请参阅 Office 外接程序中的运行时。
- 若要了解有关 Outlook 外接程序清单的详细信息,请参阅 Office 外接程序清单。
实现事件处理程序
必须为 和 OnMessageFromChanged
事件配置OnNewMessageCompose
事件处理程序。 如果当前帐户上尚未配置默认签名,则 onNewMessageComposeHandler
函数会将签名添加到新创建的消息。 更改“ 发件人 ”字段中的帐户时, onMessageFromChangedHandler
函数会基于此新选择的帐户更新签名。
在同一快速入门项目中,导航到 ./src 目录,然后创建名为 startvent 的新文件夹。
在 ./src/startvent 文件夹中,创建一个名为 launchevent.js的新文件。
在代码编辑器中打开文件 ./src/startvent/launchevent.js 并添加以下 JavaScript 代码。
/* * Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. * See LICENSE in the project root for license information. */ // The OnNewMessageCompose event handler that adds a signature to a new message. function onNewMessageComposeHandler(event) { const platform = Office.context.platform; const signature = "<i>This is a sample signature.</i>"; // On supported platforms, check if a default Outlook signature is already configured. if (platform !== Office.PlatformType.Android && platform !== Office.PlatformType.iOS) { Office.context.mailbox.item.isClientSignatureEnabledAsync({ asyncContext: { event: event, signature: signature } }, (result) => { if (result.status === Office.AsyncResultStatus.Failed) { console.log(result.error.message); return; } // Add a signature if there's no default Outlook signature configured. const signatureEnabled = result.value; if (signatureEnabled === false) { const event = result.asyncContext.event; const signature = result.asyncContext.signature; setSignature(signature, event); } }); } else { setSignature(signature, event); } } // The OnMessageFromChanged event handler that updates the signature when the email address in the From field is changed. function onMessageFromChangedHandler(event) { const item = Office.context.mailbox.item; const signatureIcon = "iVBORw0KGgoAAAANSUhEUgAAACcAAAAnCAMAAAC7faEHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAzUExURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMFRskAAAAQdFJOUwAQIDBAUGBwgI+fr7/P3+8jGoKKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABT0lEQVQ4T7XT2ZalIAwF0DAJhMH+/6+tJOQqot6X6joPiouNBo3w9/Hd6+hrYnUt6vhLcjEAJevVW0zJxABSlcunhERpjY+UKoNN5+ZgDGu2onNz0OngjP2FM1VdyBW1LtvGeYrBLs7U5I1PTXZt+zifcS3Icw2GcS3vxRY3Vn/iqx31hUyTnV515kdTfbaNhZLI30AceqDiIo4tyKEmJpKdP5M4um+nUwfDWxAXdzqMNKQ14jLdL5ntXzxcRF440mhS6yu882Kxa30RZcUIjTCJg7lscsR4VsMjfX9Q0Vuv/Wd3YosD1J4LuSRtaL7bzXGN1wx2cytUdncDuhA3fu6HPTiCvpQUIjZ3sCcHVbvLtbNTHlysx2w9/s27m9gEb+7CTri6hR1wcTf2gVf3wBRe3CMbcHYvTODkXhnD0+178K/pZ9+n/C1ru/2HAPwAo7YM1X4+tLMAAAAASUVORK5CYII="; // Get the currently selected From account. item.from.getAsync({ asyncContext: event }, (result) => { if (result.status === Office.AsyncResultStatus.Failed) { console.log(result.error.message); return; } // Create a signature based on the currently selected From account. const name = result.value.displayName; const options = { asyncContext: { event: result.asyncContext, name: name }, isInline: true }; item.addFileAttachmentFromBase64Async(signatureIcon, "signatureIcon.png", options, (result) => { if (result.status === Office.AsyncResultStatus.Failed) { console.log(result.error.message); return; } // Add the created signature to the mail item. const signature = "<img src='cid:signatureIcon.png'>" + result.asyncContext.name; const event = result.asyncContext.event; setSignature(signature, event); }); }); } // Sets the custom signature and adds it to the mail item. function setSignature(signature, event) { Office.context.mailbox.item.body.setSignatureAsync( signature, { asyncContext: event, coercionType: Office.CoercionType.Html }, (result) => { if (result.status === Office.AsyncResultStatus.Failed) { console.log(result.error.message); return; } console.log("Successfully added signature."); const event = result.asyncContext; event.completed(); } ); } // IMPORTANT: To ensure your add-in is supported in Outlook, remember to // map the event handler name specified in the manifest to its JavaScript counterpart. Office.actions.associate("onNewMessageComposeHandler", onNewMessageComposeHandler); Office.actions.associate("onMessageFromChangedHandler", onMessageFromChangedHandler);
重要
- 在经典 Outlook on Windows 中,导入在 JavaScript 文件中不受支持,可在其中实现基于事件的激活的处理。
- 在经典 Outlook on Windows 中,当清单中指定的用于处理事件的 JavaScript 函数运行时,代码不会
Office.onReady()
Office.initialize
运行。 建议改为将事件处理程序所需的任何启动逻辑(例如检查用户的 Outlook 版本)添加到事件处理程序。 - 为确保加载项在事件发生时按预期运行,请在实现处理程序的 JavaScript 文件中调用
Office.actions.associate
。 这会将清单中指定的事件处理程序名称映射到其 JavaScript 对应名称。 清单中处理程序名称的位置因外接程序使用的清单类型而异。-
Microsoft 365 的统一清单:在适用
"autoRunEvents.events"
对象的 属性中指定的"actionId"
值。 - 仅外接程序清单:在适用的 LaunchEvent 元素中指定的函数名称。
-
Microsoft 365 的统一清单:在适用
更新命令 HTML 文件
在 ./src/commands 文件夹中,打开 commands.html。
在现有 脚本 标记下面添加以下代码。
<script type="text/javascript" src="../launchevent/launchevent.js"></script>
保存所做的更改。
更新 webpack 配置设置
从项目的根目录中,打开 webpack.config.js 文件。
plugins
在 对象中找到数组,config
并将以下新对象添加到数组的开头。new CopyWebpackPlugin({ patterns: [ { from: "./src/launchevent/launchevent.js", to: "launchevent.js", }, ], }),
保存所做的更改。
试用
在项目的根目录中运行以下命令。 运行
npm start
时,如果本地 Web 服务器尚未运行) 并且加载项将被旁加载,则本地 Web 服务器将启动 (。npm run build
npm start
注意
- 首次使用 Yeoman 生成器开发 Office 加载项时,默认浏览器会打开一个窗口,提示你登录到 Microsoft 365 帐户。 如果未显示登录窗口,并且遇到旁加载或登录超时错误,请在再次运行
npm start
之前运行atk auth login m365
。
如果加载项未自动旁加载,请按照 旁加载 Outlook 外接程序 中的说明进行测试,在 Outlook 中手动旁加载加载项。
- 首次使用 Yeoman 生成器开发 Office 加载项时,默认浏览器会打开一个窗口,提示你登录到 Microsoft 365 帐户。 如果未显示登录窗口,并且遇到旁加载或登录超时错误,请在再次运行
在首选 Outlook 客户端中,创建新邮件。 如果未配置默认 Outlook 签名,外接程序会将一个添加到新创建的邮件。 在移动设备上的 Outlook 中,即使配置了默认签名,加载项也会添加示例签名。
启用“ 发件人 ”字段(如果适用)。 有关如何启用它的指南,请参阅 更改用于发送电子邮件的帐户的“为什么缺少发件人按钮?”部分。
选择“ 发件人”,然后选择其他 Exchange 帐户。 或者,通过选择“从>其他Email地址”手动输入 Exchange 电子邮件地址。 已更新的签名将添加到消息中,替换上一个签名。
如果要停止本地 Web 服务器并卸载加载项,请按照适用的说明作:
若要停止服务器,请运行以下命令。 如果使用
npm start
了 ,则以下命令还应卸载加载项。npm stop
如果手动旁加载加载项,请参阅 删除旁加载加载项。
排查加载项问题
有关如何排查基于事件的激活加载项的指南,请参阅 基于事件的加载项和垃圾邮件报告加载项疑难解答。
部署到用户
与其他基于事件的外接程序类似,使用 OnMessageFromChanged
和 OnAppointmentFromChanged
事件的加载项必须由组织的管理员部署。 有关如何通过Microsoft 365 管理中心部署外接程序的指南,请参阅配置 Outlook 外接程序进行基于事件的激活的“部署到用户”部分。
事件行为和限制
OnMessageFromChanged
由于 和 OnAppointmentFromChanged
事件通过基于事件的激活功能受支持,因此相同的行为和限制适用于因此事件而激活的加载项。 有关详细说明,请参阅 基于事件的激活行为和限制。
除了这些特征之外,当加载项在这些事件上激活时,以下方面也适用。
- 事件
OnMessageFromChanged
仅在邮件撰写模式下受支持,而OnAppointmentFromChanged
事件仅在约会撰写模式下受支持。 - 在 Outlook 网页版 中,在 Windows (新) 和经典) ,在移动设备上,仅
OnMessageFromChanged
支持事件。 -
OnMessageFromChanged
和OnAppointmentFromChanged
事件仅支持 Exchange 帐户。 如果用户切换到“ 发件人 ”或“组织者”字段中的非 Exchange 帐户,Outlook 客户端会自动清除以前所选帐户设置的签名。 - 根据 Outlook 客户端,在撰写的邮件中,从“ 发件人 ”字段下拉列表中选择 Exchange 帐户或在字段中手动输入。 移动设备上的 Outlook 仅支持从“ 发件人 ”字段下拉列表中选择帐户。 在撰写的约会中,从组织者字段下拉列表中选择 Exchange 帐户。
- 在 Outlook 网页版 中,在 Windows (新) 和经典) ,在 Mac 上,
OnMessageFromChanged
和OnAppointmentFromChanged
事件支持委托和共享邮箱方案。 移动设备上的 Outlook 不支持这些方案。 -
OnAppointmentFromChanged
Microsoft 365 组日历不支持该事件。 如果用户从其 Exchange 帐户切换到组织者字段中的 Microsoft 365 组日历帐户,Outlook 客户端会自动清除 Exchange 帐户设置的签名。 - 在“发件人”或“组织者”字段中切换到另一个 Exchange 帐户时,将终止以前所选帐户的加载项(如果有),并与新选择的帐户关联的外接程序在启动 或
OnAppointmentFromChanged
事件之前OnMessageFromChanged
加载。 - 在 Outlook 网页版 中,在 Windows (新的和经典) ,在 Mac 上,支持电子邮件帐户别名。 在“发件人”或“组织者”字段中选择当前帐户的别名时,
OnMessageFromChanged
将发生 或OnAppointmentFromChanged
事件,而无需重新加载帐户的加载项。Email移动设备上的 Outlook 不支持帐户别名。 - 当错误打开“ 发件人 或组织者”字段下拉列表或重新选择“ 发件人 或组织者”字段中显示的同一帐户时,
OnMessageFromChanged
将发生 或OnAppointmentFromChanged
事件,但不会终止或重新加载帐户的加载项。