Microsoft Office

探讨 JavaScript API for Office:示例邮件应用程序

Angela Chu-Hatoun

下载代码示例

伴随着这篇文章 MSDN 杂志第条,"探索 JavaScript API 为办公室:邮件应用程序"(msdn.microsoft.com/magazine/dn201750)。 在这里,我走过去建设样例组 IM 邮件应用程序使用该文章中解释的技术。

从一条消息启动组 IM

组 IM 邮件应用程序允许您方便地启动组即时消息会话与发件人、 收件人或无需离开 Outlook 或 Outlook Web 应用程序,其电子邮件地址包括在所选邮件的正文中的任何人。 图 1 贝琳达选定后的杰夫和 Ben 和正在准备好开始使用组 IM IM 会话邮件应用程序的收件人为用户显示。 应用程序窗格中的阅读窗格,以及任何 SMTP 地址 (弗农,Sam 和罗马) 在邮件正文中的贝琳达要启动 IM 会话与包括当前邮件的所有收件人的 SMTP 地址。

Selecting Message Recipients in the Group IM Mail App to Start a Group Chat Session
图 1 组 IM 邮件应用程序来启动组聊天会话中选择邮件收件人

组 IM 邮件应用程序假定 Lync 作为 IM 客户端,它支持会话初始协议 (SIP) 和命令行的方法来启动 IM。 您可以修改此邮件 app,InstantMessage.js 中, 所示的 JavaScript 文件中的 checkAddress 函数图 2 (你可以下载在邮件应用程序的源文件的完整集 code.msdn.microsoft.com/Mail-apps-for-Outlook-2b20fc16),为不同的 IM 客户端自定义应用程序。

图 2 InstantMessage.js JavaScript 文件

var _Item; var itemEntities; var myEntities = new Array(); var uniqueNumInRecipientsAndBody=0; Office.initialize = function () {   _Item = Office.context.mailbox.item;   itemEntities = _Item.getEntities();   $(document).ready(function () {    initIM();   });  } var checkedItems; checkedItems = ""; // This function verifies if the user has checked any of the // checkboxes for the SMTP addresses, and if so, constructs a hyperlink // for starting an IM session.
function checkAddress(emailForm) {   var anychecked;   anychecked = 0;   checkedItems = "im:";   // See if the e-mail sender address is checked.
if (emailForm.checkbox0.checked == true) {     checkedItems += "<sip:" + _Item.sender.emailAddress + ">";     anychecked = 1;   }   for (var i=1; i<=uniqueNumInRecipientsAndBody; i++) {     var tempy;     // Determine if each checkbox is checked.
// Each checkbox name is a variable depending on value of i.
tempy = "checkbox" + i;     // Use JavaScript square bracket notation instead of dot notation to access     // emailForm.tempy.checked, because tempy is a variable.
tempy = emailForm[tempy]["checked"];     if (tempy)  {       // If the checkbox is checked, construct an SIP address       // for that e-mail address.
checkedItems += "<sip:" + myEntities[i-1] + ">";       anychecked = 1;      }   }   // Clear the variable if none of the checkboxes is checked.
// UI phrase remains not a hyperlink.
if (anychecked == 0) {     checkedItems = "";     document.getElementById("mySpan").innerHTML = "Start an instant message conversation";   }    else {     // If one or more checkboxes are checked, then turn the UI phrase into a hyperlink.
document.getElementById("mySpan").innerHTML =       "<A HREF = \"" + checkedItems + "\">Start an IM conversation</A>";   }     } // This function counts the unique number of e-mail addresses.
// The first such count number of array cells in myEntities // contain the unique e-mail addresses.
function makeMyAddressesUnique (addressArray) {   var emailAddress;   var j=0;   for (var i in addressArray) {     emailAddress = addressArray[i];     // Check if e-mail address is not the same as the sender's address     // or the current user's address, is new and     // has not occured in the first i number of cells in addressArray.
if ((emailAddress.toLowerCase() !== _Item.sender.emailAddress.toLowerCase()) &&       (emailAddress.toLowerCase() !==         Office.context.mailbox.userProfile.emailAddress.toLowerCase()) &&       (emailAddrIsNew (i, emailAddress, addressArray))) {       myEntities[j] = emailAddress.toLowerCase();       j++;     }     // Otherwise e-mail address already occurred in sender or addressArray, so ignore it.
// The next new e-mail address will overwrite cell j in myEntities.
}     // Tallied the number of unique addresses in the body.
uniqueNumInRecipientsAndBody = j;    } function emailAddrIsNew (index, address, array) {   var counter = 0;   while (counter < index) {     if (address.toLowerCase() === array[counter].toLowerCase()) {       return (false);     }     counter++;   }   return (true); } function initIM() {   var myHTMLString;   var myCell;   var tempEntities;   var toRecipients;   var ccRecipients;   var recipientsAddresses = new Array ();   var recipientsAndBodyAddresses = new Array();   toRecipients = _Item.to;   ccRecipients = _Item.cc;   myHTMLString = "";   // Assign first the To recipients addresses, followed by   // the cc recipients addresses.
for (var i=0; i<toRecipients.length; i++) {     recipientsAddresses[i] = toRecipients[i].emailAddress;   }   for (var i=0; i<ccRecipients.length; i++) {     recipientsAddresses[i+toRecipients.length] = ccRecipients[i].emailAddress;   }   recipientsAndBodyAddresses = recipientsAddresses.concat(itemEntities.emailAddresses);   makeMyAddressesUnique (recipientsAndBodyAddresses);   myCell = document.getElementById('extensionspace');   myHTMLString += "<form><span id=\"mySpan\">Start an instant message conversation</span>" +     " with the following persons:<BR>";   myHTMLString += "<input type=checkbox name='checkbox0" + "' value='" +     _Item.sender.emailAddress + "' onClick='checkAddress(this.form)' />" +     _Item.sender.emailAddress + "<br>";   for (var i=0; i<uniqueNumInRecipientsAndBody; i++) {     myHTMLString += "<input type=checkbox name='checkbox" + (i+1) + "' value='" +       myEntities[i] + "' onClick='checkAddress(this.form)' />" +       myEntities[i] + "<br>";     }     myCell.innerHTML = myHTMLString + "</form>"; }

应用场景

同时阅读一封电子邮件,你想要向前移动一次讨论的即时消息的收件人的邮件,或与人的电子邮件地址包含在消息的正文中。 你可以选择组 IM 邮件应用程序、 选择中的应用程序窗格收件人或电子邮件从邮件地址和,无需离开 Outlook,在您的 IM 客户端启动组 IM 会话。

此方案假设 Outlook 2013 (或更高版本) 的使用和交流在线或 Exchange 服务器 2013年 (或更高版本)。 与会者和其 SMTP 地址也应由 IM 客户端支持。

尝试邮件应用程序

按照该文件,"自述为组 IM 邮件 app,"中的说明与附带的代码下载 (code.msdn.microsoft.com/Mail-apps-for-Outlook-2b20fc16),下载和安装您的邮箱的邮件应用程序。 Outlook 激活这个邮件应用程序的任何电子邮件收件箱中,以便您可以尝试此邮件应用程序与您在阅读窗格中查看或邮件检查器的任何消息。 或者,一个更容易控制的测试环境,你可以创建特殊测试电子邮件消息、 包括你自己和几个其他收件人、 指定的邮件正文中,几个其他 SMTP 地址和发送邮件。

若要测试,在阅读窗格中打开特殊测试消息和选择的"组 IM"应用程序按钮。 应用程序窗格中列出的收件人的电子邮件地址和邮件正文中的 SMTP 地址。 在应用程序窗格中,选择两个或多个电子邮件地址并选择链接"启动 IM 会话"。IM 客户端打开 IM 窗口,用来启动组聊天会话。

本文的其余部分描述的 XML 清单、 HTML 文件和 JavaScript 文件组 IM 邮件应用程序。 一路走来,我就会突出显示兴趣的点。

XML 清单

每个邮件应用程序必须定义一个清单,如下为 Office XML 架构的应用程序记录在 MSDN 库文章中, **"**架构映射 (办公室应用程序),"在 bit.ly/13bPpWH。 邮件应用程序清单定义应用程序的下列元数据:

  • 表达式的值相同
  • 区域设置的支持
  • 所需的主机应用程序的能力
  • 外观设置
  • 相应的 HTML 文件,为每个窗体因子 (如果需要) 的
  • 显示要求
  • 必需的权限
  • 激活规则

本节重点介绍了在清单中,Lync IM.xml,感兴趣的渐次组 IM 邮件应用程序的特定点。 有关清单的完整列表,请参见图 3 (你可以下载在邮件应用程序的源文件的完整集 (code.msdn.microsoft.com/Mail-apps-for-Outlook-2b20fc16)

图 3 应用程序的 XML 清单文件

<?xml version="1.0" encoding="utf-8"?> <OfficeApp xmlns="https://schemas.microsoft.com/office/appforoffice/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="MailApp">   <Id>0DA74E27-C945-47A0-9857-64268DEF6542</Id>   <Version>1.0</Version>   <ProviderName>Microsoft</ProviderName>   <DefaultLocale>EN-US</DefaultLocale>   <DisplayName DefaultValue="Group IM">     <Override Locale="FR-FR" Value="Message instantané"/>   </DisplayName>   <Description DefaultValue="Start a group instant message session using Lync.">     <Override Locale="FR-FR" Value="Démarrer un message instantané appel directement à partir de Outlook ou Outlook Web App à l'aide de Lync."/>   </Description>   <IconUrl DefaultValue="https://exchangemoe.redmond.corp.microsoft.com/ext/ach/GroupIM/mslync-logo_small.png"/>   <Capabilities>     <Capability Name="Mailbox"/>   </Capabilities>   <DesktopSettings>     <!-- Change the following line to specify the web server -->     <!-- that hosts the HTML file.
-->     <SourceLocation DefaultValue=       "https://exchangemoe.redmond.corp.microsoft.com/ext/ach/GroupIM/InstantMessage.htm"/>     <RequestedHeight>216</RequestedHeight>   </DesktopSettings>   <TabletSettings>     <!-- Change the following line to specify the web server -->     <!-- that hosts the HTML file.
-->     <SourceLocation DefaultValue=       "https://exchangemoe.redmond.corp.microsoft.com/ext/ach/GroupIM/InstantMessage.htm"/>     <RequestedHeight>180</RequestedHeight>   </TabletSettings>   <Permissions>ReadItem</Permissions>   <Rule xsi:type="ItemIs" ItemType="Message"/> </OfficeApp>

根元素 OfficeApp 指定命名空间和 app 类型 MailApp,而是按顺序包含适用于邮件应用程序的子元素的根元素。 MailApp 扩展 OfficeApp,和其子元素进一步定义的邮件应用程序元数据:

<OfficeApp xmlns="https://schemas.microsoft.com/office/appforoffice/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="MailApp">

一个唯一的标识符的 Id 元素指定区分这个应用程序从其他应用程序为办公室,宿主应用程序的通用唯一标识符 (UUID):

<Id>0DA74E27-C945-47A0-9857-64268DEF6542</Id>

应用程序标签显示名称元素标识应用程序作为"组 IM"的应用程序栏上。 Outlook 通过在应用程序栏上,显示的"组 IM"激活此应用程序,如果在清单中指定的规则符合中所选的项目 (见"激活规则"一节):

<DisplayName DefaultValue="Group IM">   <Override Locale="FR-FR" Value="Message instantané"/> </DisplayName>

区域设置支持 DefaultLocale 元素指定区域性名称的区域设置,在此案例 EN-US,UI 中的字符串的应用程序清单中。 您可以使用重写子元素来支持 (如"消息 instantané"在前面的示例中的 FR-FR 语言环境名称) 的区域设置特定的显示名称、 说明、 图标图像或源代码文件:

<DefaultLocale>EN-US</DefaultLocale>

详细说明描述元素通常指定应用程序的目的。 默认值属性对应于指定的 DefaultLocale 元素的区域设置。 你可以使用重写子元素来为不同的区域设置,如 FR-FR 支持说明:

<Description DefaultValue="Start a group instant message session using Lync.">   <Override Locale="FR-FR"     Value="Démarrer un message instantané appel directement     à partir de Outlook ou Outlook Web App à l'aide de Lync."/> </Description>

功能功能和能力的元素指定与您的应用程序工作的功能 — — 在此情况下,邮箱的能力。 而不是显式指定的主机应用程序您的应用程序要求,您可以使用这些元素来告诉为办公平台的应用程序如何与匹配的合资格的宿主应用程序可以支持您的应用程序。 支持邮箱功能的应用程序可以成为这个应用程序的宿主:

<Capabilities>   <Capability Name="Mailbox"/> </Capabilities>

因为用于办公室的 JavaScript API 是一个综合的 API 为办公室由所有应用程序共享和支持主机应用程序,支持对某些对象或成员不同从主机到主机。 更多的这种情况下会出现的任务窗格的应用程序 (例如,Bindings.addFromPromptAsync)。 为邮件应用程序的一个例子是 Diagnostics.OWAView 属性,其目的是为在 Outlook Web App 但不是 Outlook 中进行调试。 在这种情况下,您应该确保在使用它之前定义的 API。

设备相关源代码文件和显示 DesktopSettings 和 TabletSettings 的元素指定这个应用程序可以运行在台式机和平板形式因素。 您可以使用的 SourceLocation 和 RequestedHeight 的元素指定相同或设备相关的 HTML 源文件,并为应用程序显示高度 (以像素为单位)。 组 IM 邮件应用程序的桌面和平板电脑的形式因素,使用相同的 HTML 源代码文件,它指定更高的应用程序窗格以桌面比平板电脑。

这是 HTML 文件的 URL:

https://webserver/GroupIM/InstantMessage.htm

组 IM 应用程序之前,你应当用替换 HTML 文件的 URL 的 HTML 文件的实际位置在您的配置:

<DesktopSettings>   <!-- Change the following line to specify the Web server -->   <!-- that hosts the HTML file.
-->   <SourceLocation DefaultValue="https://webserver/GroupIM/InstantMessage.htm"/>   <RequestedHeight>216</RequestedHeight> </DesktopSettings> <TabletSettings>   <!-- Change the following line to specify the Web server -->   <!-- that hosts the HTML file.
-->   <SourceLocation DefaultValue="https://webserver/GroupIM/InstantMessage.htm"/>   <RequestedHeight>180</RequestedHeight> </TabletSettings>

权限权限元素指定的这个应用程序要求的权限级别。 在这种情况下,组 IM 邮件应用程序需要读取的项目权限,因为这款应用程序访问交流从邮件主题和正文中提取的实体 (SMTP 地址):

<Permissions>ReadItem</Permissions>

激活规则这个应用程序指定 ItemIs 规则与作为的项类型的消息。 这意味着 Outlook 将显示组 IM 应用程序栏中,每当用户在阅读窗格或检查器中查看一条消息:

<Rule xsi:type="ItemIs" ItemType="Message"/>

请注意有某些类型的邮件不支持邮件的应用程序。 请参见"项目支持激活"一节 (bit.ly/11n0hNE) 的 MSDN 库文章,"定义规则,以显示在 Outlook 2013 年的邮件应用程序"的详细信息。

HTML 执行

HTML 文件中,InstantMessage.htm,指定在应用程序的用户界面,在应用程序窗格中所显示。 本节重点介绍几个的兴趣点。 InstantMessage.htm 的完整列表,请参见图 4 (你可以下载从邮件应用程序的源文件的完整集 code.msdn.microsoft.com/Mail-apps-for-Outlook-2b20fc16).

图 4 InstantMessage.htm 文件

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <style type="text/css">   .title{     font-family: arial, sans-serif;     color: blue;     font-size: 12pt;     text-decoration:none;     font-weight:bold;   }   .property{     font-family:Segoe UI;     color: black;     font-size: 10pt;     text-decoration:none;   }   .value{     font-family:Segoe UI;     color: gray;     font-size:  10pt;     text-decoration:none;   }   .valuesmall{     font-family: Segoe UI;     color: gray;     font-size:  8pt;     text-decoration:none;   } </style>   <title>Send Instant Messages with Lync</title>   <script type="text/javascript"     src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js"></script>   <script type="text/javascript"     src="https://appsforoffice.microsoft.com/lib/1.0/hosted/office.js"></script>   <script type="text/javascript" src="InstantMessage.js"></script> </head> <body>   <img src='mslync-logo.png' alt='Microsoft Lync'/>   <div id="extensionspace" style="font-family: 'Segoe UI'; font-size: 10pt"> </div> </body> </html>

使用最高可用的互联网资源管理器模式用于 Office 应用程序需要在客户端计算机上的 Internet Explorer 9 最低。 使用以下 meta 标记允许您的应用程序的计算机上使用的最高可用的互联网资源管理器模式,以提供最好的体验,用户可以得到:

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge">

注:始终将 meta 元素作为子元素的头元素,除标题外的其他所有元素和所有其他 meta 元素之前。

为应用程序指定 CSS 组 IM 邮件应用程序中所示,控制的视觉设计和布局该应用程序的 HTML 文件中指定 CSS 内联图 5

图 5 指定 CSS

<style type="text/css">   .title{     font-family: arial, sans-serif;     color: blue;     font-size: 12pt;     text-decoration:none;     font-weight:bold;   }   .property{     font-family:Segoe UI;     color: black;     font-size: 10pt;     text-decoration:none;   }   .value{     font-family:Segoe UI;     color: gray;     font-size:  10pt;     text-decoration:none;   }   .valuesmall{     font-family: Segoe UI;     color: gray;     font-size:  8pt;     text-decoration:none;   } </style>

更多指南,请参阅"为办公室的样式的应用程序的指导方针"节 (bit.ly/XEwfED) 的 MSDN 库文章,"用于 Office 用户体验的应用程序设计指南"。

办公室图书馆包括 JavaScript API JavaScript API 为办公室,office.js,提供的内容传送网络 (CDN) 位置。 总是使用下面的语句来引用 office.js 从该位置:

<script type="text/javascript"   src="https://appsforoffice.microsoft.com/lib/1.0/hosted/office.js"></script>

此邮件应用程序使用类似的脚本元素来包括其他 JavaScript 库文件,包括它自己上述的 JavaScript 文件,InstantMessage.js。

JavaScript 执行

看出在上节中描述了此邮件应用程序的激活规则,这个应用程序是可用的应用程序栏中,每当用户在阅读窗格或检查器中查看一条消息。 如果用户选择的应用程序,JavaScript 文件 (InstantMessage.js) 显示的收件人,任何电子邮件地址包含在邮件正文中,从用户获取的任何选择和启动与所选的人员组 IM 会话。

而不是通过 InstantMessage.js 如何显示电子邮件地址和获取用户的选择为 IM 散步,本节的其余部分说明了此邮件应用程序如何使用所附的"基本功能的 JavaScript API 为办公室"部分中列出的功能 MSDN 杂志 条 (msdn.microsoft.com/en-us/magazine/dn201750)。

初始化和 DOM-Loaded 事件同步到办公室为每个应用程序必须处理 Office.initialize 事件。 中所示的以下初始化事件处理程序,尽快为办公室运行库的应用程序准备就绪,此邮件应用程序获取选定的用户并在邮件中存在的所有知名实体的当前消息:

Office.initialize = function () {   _Item = Office.context.mailbox.item;   itemEntities = _Item.getEntities();   $(document).ready(function () {    initIM();   });  }

这款应用程序持有直到加载 DOM,当它然后调用 initIM 函数来进行显示应用程序用户界面的电子邮件地址。

访问消息属性 发件人cc 这个邮件应用程序使用发件人cc 可用来让用户选择一个或多个邮件发件人或收件人的消息对象上的属性。 每个属性返回一个或多个 EmailAddressDetails 对象、 哪些映射到一个人的每个以及包括该人的 SMTP 地址。

图 6 显示的 initIM 函数的获取电子邮件地址的详细信息部分cc 收件人。

图 6 获取电子邮件地址详细信息

function initIM() {   var myHTMLString;   var myCell;   var tempEntities;   var toRecipients;   var ccRecipients;   var recipientsAddresses = new Array ();   var recipientsAndBodyAddresses = new Array();   toRecipients = _Item.to;   ccRecipients = _Item.cc;   myHTMLString = "";   // Assign first the To recipients addresses, followed by   // the cc recipients addresses.
for (var i=0; i<toRecipients.length; i++) {     recipientsAddresses[i] = toRecipients[i].emailAddress;   }   for (var i=0; i<ccRecipients.length; i++) {     recipientsAddresses[i+toRecipients.length] = ccRecipients[i].emailAddress;   } ...

下面的代码片断显示了的 initIM 函数的可访问的邮件发件人地址,并将其显示在列表中选择应用程序窗格中的一部分:

myHTMLString +=   "<form><span id=\"mySpan\">Start an instant message conversation</span>" +   " with the following persons:<BR>"; myHTMLString += "<input type=checkbox name='checkbox0" + "' value='" +   _Item.sender.emailAddress + "' onClick='checkAddress(this.form)' />" +   _Item.sender.emailAddress + "<br>";

访问 SMTP 地址的邮件正文中的实体作为下面的代码片断显示了获取完整的邮件主题和正文中的知名实体集的初始化函数的一部分:

Office.initialize = function () {   _Item = Office.context.mailbox.item;   itemEntities = _Item.getEntities(); ...

请注意 getEntities 函数返回一套完整的知名实体 — — 包括任何 SMTP 地址 — — 那存在于主题或邮件的正文中。 itemEntities.emailAddresses 返回只有一个交流认识到作为 SMTP 地址的字符串数组。 下面的代码段显示了如何的 initIM 函数结合的收件人电子邮件地址的任何电子邮件地址中的邮件主题或正文,存在一组,然后调用 makeMyAddressesUnique 函数来排除任何等效的 SMTP 地址,稍后为用户提供一个独特的选项列表:

recipientsAndBodyAddresses =   recipientsAddresses.concat(itemEntities.emailAddresses); makeMyAddressesUnique (recipientsAndBodyAddresses);

访问获取用户的地址到用户配置文件为了避免将用户的 SMTP 地址作为一种选择提供的 IM 会话,makeMyAddressesUnique 函数进行比较在 UserProfile.emailAddress 属性中存储的用户的地址与电子邮件地址。 图 7 显示了相应代码。

图 7 比较与用户的地址的电子邮件地址

// This function counts the unique number of e-mail addresses.
// The first such count number of array cells in // myEntities contains the unique e-mail addresses.
function makeMyAddressesUnique (addressArray) {   var emailAddress;   var j=0;   for (var i in addressArray) {     emailAddress = addressArray[i];     // Check if e-mail address is not the same as the sender's address     // or the current user's address, is new, and     // has not occurred in the first i number of cells in addressArray.
if ((emailAddress.toLowerCase() !==       _Item.sender.emailAddress.toLowerCase()) &&         (emailAddress.toLowerCase() !==         Office.context.mailbox.userProfile.emailAddress.toLowerCase()) &&         (emailAddrIsNew (i, emailAddress, addressArray))) {           myEntities[j] = emailAddress.toLowerCase();           j++;     }     // Otherwise e-mail address occurred in     // sender or addressArray already, ignore it.
// The next new e-mail address will overwrite cell j in myEntities.
}

IM 客户端依赖关系请注意这个应用程序假定用户设置了 IM 客户端支持 IM 和 SIP 协议,并使用下面的格式启动 IM 与指定的 SMTP 地址:

im:<sip:user1@host><sip:user2@host>

如前所述,这种 IM 客户端的一个例子是 Lync。 在 Lync,与前面的命令 IM 为打开窗口的用户和指定的 SMTP 地址如果用户已经签署了到 Lync 或已成立了 Lync,自动登录。 否则,该命令会打开登录窗口中。

或者,您可以修改此示例以支持不同的 IM 客户端,并生成相应的命令为该客户端启动组 IM 中的 checkAddress 函数。

有关为 Lync 支持的详细信息,请参阅 MSDN 库文章,"从另一个应用中开始 Lync"(bit.ly/ZvbTvc)。

替代手段来激活

请注意我执行使用只有一个激活规则 (正在一条消息的选定项) 和 JavaScript API (Message.getEntities 方法和 Entities.emailAddresses 属性) 以在邮件正文中获取任何 SMTP 地址。 我就会显示一个可选的实现来说明正则表达式激活规则的一个示例,如何获取正则表达式匹配在应用程序中。

在应用程序清单中,结合现有的 ItemIs 规则使用模式 = 和属性,与第二条规则将项正文必须包含一个或多个电子邮件地址,如由名为 reg1 的正则表达式过滤:

<Rule xsi:type="RuleCollection" Mode="And">   <Rule xsi:type="ItemIs" ItemType="Message"/>   <Rule xsi:type="ItemHasRegularExpressionMatch" RegExName="reg1"     RegExValue="[-\w.]+@([A-z0-9][-A-z0-9]+\.)+[A-z]{2,3}"     PropertyName="BodyAsPlaintext"/> </Rule>

然后,在 JavaScript 文件中,而不是访问交换的任何知名实体已从中提取选定的邮件,像这样:

itemEntities = _Item.getEntities();

你可以使用 Message.getRegExMatches 方法获取匹配 reg1 的任何电子邮件地址:

myEntities = _Item.getRegExMatches();

修改 makeMyEntitiesUnique 函数来处理 myEntities.reg1 数组中存储的电子邮件地址。

两种方法,使用知名实体被首选,避免任何额外的开销,在评价试图激活邮件应用程序时的正则表达式。 无论激活规则的应用程序清单中指定的类型,交流总是提取任何知名实体从主题或正文所选项目,所以无需额外开销而招致的实体作为获取在邮件正文中的任何电子邮件地址。 另一方面,如果电子邮件正文是相对较长,并且包含多个电子邮件地址评价激活规则中的正则表达式的开销可以是重大的。 若要为邮件应用程序的用户提供令人满意的体验,有某些阈值,您应该知道的如果您使用正则表达式。 请参阅 MSDN 库文章,"激活与用于 Outlook 的邮件应用程序中的数据的范围"(bit.ly/170WAQf),有关详细信息。

Angela Chu-Hatoun 最初是一名软件开发者,后来出于对介绍软件工作原理的强烈兴趣而转为写作。她担任 Office 部门的程序员已有 12 年,负责为开发者编写关于如何创建 Office 应用程序和其他 Outlook 解决方案的文章。她喜爱阅读时事、园艺、旅游、美食和时装。

衷心感谢以下技术专家对本文的审阅:Andrew Salamatov (Microsoft) 和 Tim Wan (Microsoft)

Tim Wan 2003 年毕业于加州理工学院,持有“工程和应用科学”学位。 在过去九年中,他一直是一名 Outlook 软件开发者。 他大量参与了 Outlook 2013 的邮件应用程序功能开发和以前版本的 Outlook 对象模型开发。 他期望为世界各地的客户带来新的功能和改进。

安德鲁萨拉马托夫生物 tk (或其他会省略掉)