Este artigo foi traduzido por máquina.

Microsoft Office

Explorando a API JavaScript para Office: um aplicativo de email de exemplo

Angela Chu-Hatoun

Baixar o código de exemplo

Este artigo acompanha o MSDN Magazine artigo, "explorando o JavaScript API para escritório: Apps de correio"(msdn.microsoft.com/magazine/dn201750). Apresentarei aqui, de construção de uma aplicação de mail do grupo IM amostra utilizando as técnicas explicadas no artigo.

Iniciar o grupo IM de uma mensagem

O grupo IM mail app permite que você convenientemente iniciar uma sessão de mensagens instantâneas do grupo com o remetente, destinatário ou quaisquer pessoas cujos endereços de email são incluídos no corpo de uma mensagem selecionada, sem deixar o Outlook ou o Outlook Web App. Figura 1 mostra o usuário ter selecionado os destinatários Jeff e Ben e estar pronto para iniciar uma sessão de mensagens instantâneas usando o grupo IM mail app de Belinda. O painel de app inclui os endereços SMTP de todos os destinatários da mensagem atual no painel de leitura, bem como quaisquer endereços SMTP (para Vernon, Sam e romana) no corpo da mensagem para Belinda iniciar uma sessão de mensagens instantâneas com.

Selecionar destinatários de mensagem no grupo IM Mail App para iniciar uma sessão de bate-papo do grupo
Figura 1 Selecionar destinatários de mensagem no grupo IM Mail App para iniciar uma sessão de bate-papo do grupo

O grupo IM mail app assume Lync como o cliente IM, que suporta o protocolo de iniciação de sessão (SIP) e uma abordagem de linha de comando para iniciar o IM. Você pode modificar a função de checkAddress no arquivo JavaScript deste app de e-mail, InstantMessage.js, mostrado na Figura 2 (você pode baixar o conjunto completo de arquivos de fonte para o aplicativo de e-mail no code.msdn.microsoft.com/Mail-apps-for-Outlook-2b20fc16), para personalizar o aplicativo para um cliente de mensagens instantâneas diferente.

Figura 2 o arquivo de JavaScript InstantMessage.js

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>";
}

O cenário

Ao ler um e-mail, você quer ir adiante uma discussão por mensagens instantâneas os destinatários da mensagem, ou com pessoas cujo email endereços é incluídas no corpo da mensagem. Você pode escolher o grupo IM mail app, selecionar os destinatários de painel de app ou endereços da mensagem de email e, sem sair do Outlook, inicie uma sessão de mensagens instantâneas do grupo em seu cliente IM.

Este cenário pressupõe o uso do Outlook 2013 (ou uma versão posterior) e Exchange Online ou Exchange Server 2013 (ou uma versão posterior). Os participantes e seus endereços SMTP também devem ser suportados pelo cliente IM.

Tentando o App Mail

Siga as instruções no arquivo, "Leia-me para o grupo IM mail app," com o download do código fornecido (code.msdn.microsoft.com/Mail-apps-for-Outlook-2b20fc16), para baixar e instalar o aplicativo de email para sua caixa de correio. Outlook ativa este aplicativo de email para qualquer mensagem de email em sua caixa de entrada, então você pode tentar este aplicativo de email com qualquer mensagem que você está vendo no painel de leitura ou Inspetor de email. Alternativamente, para um ambiente mais controlado de teste, você pode criar uma mensagem de email de teste especial, incluem-se e alguns outros destinatários, especificar alguns outros endereços SMTP no corpo da mensagem e enviar a mensagem.

Para testar, abra a mensagem de teste especial no painel de leitura e escolha o botão de app "Grupo IM". O painel de app lista os endereços de email dos destinatários e endereços SMTP no corpo da mensagem. No painel de app, escolha dois ou mais endereços de e-mail e escolha o link "Iniciar uma conversa de mensagem instantânea." Seu cliente IM abre uma janela de mensagens instantâneas para começar a sessão de chat de grupo.

O restante deste artigo descreve o manifesto XML, arquivos HTML e JavaScript para o app de email do grupo IM. Ao longo do caminho, eu vou destacar pontos de interesse.

O manifesto XML

Cada aplicação de mail deve definir um manifesto que segue os apps para o esquema XML do Office, conforme documentado no artigo da Biblioteca MSDN , **'**mapa de esquema (aplicativos para escritório), "em bit.ly/13bPpWH. Um manifesto de aplicativo de correio define os seguintes metadados para o app:

  • Identidade
  • Suporte de localidade
  • Capacidade necessária dos aplicativos host
  • Fatores de forma
  • Arquivo HTML correspondente para cada fator de forma (se necessário)
  • Exibir os requisitos
  • Permissões necessárias
  • Regras de ativação

Esta seção destaca pontos específicos de interesse no manifesto, IM.xml de Lync, que caracterizam o grupo IM mail app. Para uma listagem completa do manifesto, consulte Figura 3 (você pode baixar o conjunto completo de arquivos de fonte para o aplicativo de e-mail no (code.msdn.microsoft.com/Mail-apps-for-Outlook-2b20fc16).

Figura 3 arquivo de manifesto XML App

<?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>

O elemento de raiz OfficeApp especifica o namespace e o tipo de app MailApp e é o elemento raiz que inclui elementos filho aplicáveis aos aplicativos de email em ordem sequencial. MailApp estende OfficeApp, e seus elementos filho ainda Definirm metadados para aplicativos de email:

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

Um identificador exclusivo o Id do elemento especifica um identificador universalmente exclusivo (UUID) que diferencia este app de outros aplicativos para o Office para o aplicativo host:

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

Um rótulo App DisplayName o elemento identifica o aplicativo como "Grupo IM" na barra de ferramentas app. Outlook ativa este app, exibindo o "Grupo IM" na barra de ferramentas app, se as regras especificadas no manifesto sejam atendidas em relação ao item selecionado (consulte o "Regras de ativação" seção):

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

Localidade suporte DefaultLocale o elemento especifica o nome de cultura da localidade, no presente caso EN-US, das cadeias de caracteres da interface do usuário no manifesto do aplicativo. Você pode usar o elemento filho de substituição para suportar nomes de exibição localidade específica (como o nome "Mensagem instantané" para a localidade de FR-FR, no exemplo anterior), descrições, imagens de ícone ou arquivos de origem:

<DefaultLocale>EN-US</DefaultLocale>

Uma descrição detalhada o elemento normalmente especifica a finalidade do app. O atributo DefaultValue corresponde a localidade especificada pelo elemento DefaultLocale. Você pode usar um elemento filho de substituição para apoiar uma descrição de uma localidade diferente, como 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>

Recursos elementos a recursos e capacidade de especificarem a funcionalidade em seu aplicativo funciona com — neste caso, o recurso de caixa de correio. Em vez de especificar explicitamente os aplicativos de host seu aplicativo requer, você usar esses elementos para contar os apps para a plataforma Office como combinar aplicativos de host elegíveis que podem oferecer suporte a seu aplicativo. Um aplicativo que suporta o recurso de caixa de correio pode tornar-se um host para este app:

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

Porque a API JavaScript para escritório é uma API integrada compartilhado por todos os aplicativos do Office e aplicativos de host, o suporte de apoio para determinados objetos ou membros difere de um hospedeiro para outro. Mais um desses casos ocorrerem com aplicativos de painel de tarefas (por exemplo, Bindings.addFromPromptAsync). Um exemplo para aplicativos de e-mail é a propriedade de Diagnostics.OWAView, que é destinada para depuração no Outlook Web App, mas não o Outlook. Em tais casos, você deve garantir que a API é definida antes de usá-lo.

Arquivo de fonte dependente do dispositivo e Display o DesktopSettings e TabletSettings elementos especificarem que este app pode correr no ambiente de trabalho e fatores de formulário da tabuleta. Você pode usar os elementos SourceLocation e RequestedHeight para especificar os arquivos de fonte HTML mesmos ou dependentes de dispositivo e exibir a altura (em pixels) para o aplicativo. O grupo IM mail app usa o mesmo arquivo de origem HTML para os fatores de forma de desktop e tablet, e especifica um painel de app mais alto para a área de trabalho do que o tablet.

Esta é a URL para o arquivo HTML:

https://webserver/GroupIM/InstantMessage.htm

Antes de tentar o app IM de grupo, você deve substituir a URL para o arquivo HTML com a localização real do arquivo HTML na sua configuração:

<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>

Permissão permissões o elemento especifica o nível de permissão que este aplicativo requer. Neste caso, o grupo IM mail app requer permissão de leitura item porque o app acessa entidades (endereços SMTP) que troca extrai o assunto da mensagem e o corpo:

<Permissions>ReadItem</Permissions>

Regras de ativação este aplicativo especifica uma regra de ItemIs com a mensagem como o tipo de item. Isso significa que Outlook exibirá o grupo IM na barra de ferramentas app sempre que o usuário visualiza uma mensagem no painel de leitura ou inspector:

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

Note-se que existem determinados tipos de mensagens que não oferecem suporte a aplicativos de e-mail. Consulte a seção "Ativação de itens de apoio" (bit.ly/11n0hNE) de artigo da Biblioteca MSDN , "definindo regras para mostrar uma aplicação de mail no Outlook 2013," para obter mais informações.

Implementação de HTML

O arquivo HTML, InstantMessage.htm, especifica a interface do usuário do aplicativo, conforme exibido no painel de app. Esta seção destaca alguns pontos de interesse. Para uma lista completa de InstantMessage.htm, consulte Figura 4 (você pode baixar o conjunto completo de arquivos de origem para o app de e-mail da code.msdn.microsoft.com/Mail-apps-for-Outlook-2b20fc16).

Figura 4 o arquivo 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>

Usando o modo mais alto disponível Internet Explorer Apps para o Office requerem um mínimo de Internet Explorer 9 no computador cliente. Use a seguinte marca meta para permitir que seu aplicativo para usar o modo do Internet Explorer mais alto disponível no computador proporcionar que a melhor experiência do usuário pode obter:

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

Observação: Coloque sempre o elemento meta como um elemento filho do elemento principal, antes de todos os outros elementos, com exceção do título e outros elementos de meta.

Especificando um CSS para o App o grupo IM mail app especifica um CSS inline no arquivo HTML para controlar o design visual e o layout do aplicativo, como mostrado na Figura 5.

Figura 5 especificando um 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>

Para mais orientações, consulte a seção "Estilo diretrizes para aplicativos de escritório" (bit.ly/XEwfED) de artigo da Biblioteca MSDN , "Apps para o Office UX design diretrizes".

Incluindo a API JavaScript para biblioteca do escritório a API JavaScript para escritório, office.js, é fornecido em um local de rede (CDN) de entrega de conteúdo. Sempre use a seguinte instrução para fazer referência a office.js daquele local:

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

Este aplicativo de email usa elementos de script semelhante para incluir outros ficheiros de biblioteca de JavaScript, incluindo o seu próprio arquivo de JavaScript acima mencionado, InstantMessage.js.

Implementação de JavaScript

Como visto na seção anterior que descreve a regra de ativação para este aplicativo de email, este app está disponível na barra de ferramentas app sempre que o usuário visualiza uma mensagem no painel de leitura ou Inspetor. Se o usuário escolhe o aplicativo, o arquivo de JavaScript (InstantMessage.js) exibe os destinatários e os endereços de email incluíam no corpo da mensagem, obtém as opções do usuário e inicia uma sessão de mensagens instantâneas do grupo com as pessoas selecionadas.

Ao invés de andar como InstantMessage.js exibe os endereços de e-mail e obtém opções do usuário para mensagens instantâneas, o restante desta seção ilustra como este aplicativo de e-mail usa os recursos listados na seção "Fundamentais características do JavaScript API para escritório" de acompanhamento MSDN Magazine artigo (msdn.microsoft.com/en-us/magazine/dn201750).

Sincronizando o Initialize e eventos DOM-Loaded todos os aplicativos para escritório devem manipular o evento Office.initialize. Como mostrado no manipulador de evento initialize a seguir, tão logo os apps para o Office tempo de execução está pronto, este aplicativo de email recebe a mensagem atual selecionada pelo usuário e todas as entidades bem conhecidas que existem na mensagem:

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

O app armazena até que o DOM é carregado, quando ele chama a função initIM para prosseguir com a exibição do aplicativo interface do usuário com endereços de email.

Acessando Propriedades de mensagem remetente, para e cc este app mail usa o remetente, para e cc propriedades disponíveis no objeto de mensagem para deixar o usuário escolher um ou mais destinatários ou o remetente da mensagem. Cada uma dessas propriedades retorna um ou mais EmailAddressDetails objetos, cada um que mapeia para uma pessoa e inclui o endereço de SMTP da pessoa.

Figura 6 mostra a parte da função initIM que recebe o email detalhes de endereço para o para e cc destinatários.

Figura 6 obter detalhes de endereço de E-Mail

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;
  }
...

O trecho de código a seguir mostra a parte da função initIM que acessa o endereço de remetente de mensagem e o exibe na lista de opções no painel de app:

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>";

Acessando os endereços SMTP no corpo da mensagem como entidades o trecho de código a seguir mostra a parte da função initialize que obtém o conjunto completo de entidades conhecidas no assunto da mensagem e corpo:

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

Observe que a função getEntities retorna um conjunto de entidades conhecidas — incluindo quaisquer endereços de SMTP — que existe no assunto ou no corpo da mensagem. itemEntities.emailAddresses retorna apenas uma matriz de seqüências de caracteres que Exchange reconhece como endereços SMTP. O trecho de código a seguir mostra como a função de initIM combina o conjunto de endereços de email dos destinatários com quaisquer endereços de e-mail existentes no corpo ou assunto da mensagem e, em seguida, chama a função makeMyAddressesUnique para excluir qualquer equivalentes endereços SMTP para fornecer uma lista de opções exclusivas para o usuário mais tarde:

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

Acessando o perfil de usuário para endereço obter usuário para evitar oferecendo o endereço de SMTP do usuário como uma escolha para a sessão de mensagem instantânea, a função makeMyAddressesUnique compara os endereços de email com o endereço do usuário armazenado na Propriedade UserProfile.emailAddress. A Figura 7 mostra o código.

Figura 7 comparando endereços de email com o endereço do usuário

// 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.
}

Dependências do cliente IM Note que este app assume que o usuário criou-se um cliente IM que ofereça suporte a mensagens instantâneas e protocolos de SIP e usa o seguinte formato para iniciar IM com endereços SMTP especificados:

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

Como mencionado, um exemplo de um cliente de mensagens instantâneas é Lync. No Lync, o comando anterior abre uma janela de mensagens instantâneas para o usuário e endereços de SMTP especificados se o usuário já tem assinado para Lync ou setup Lync para logar-se automaticamente. Caso contrário, o comando abre a janela de início de sessão.

Como alternativa, você pode modificar a função de checkAddress neste exemplo para oferecer suporte a um cliente de mensagens instantâneas diferente e construir o comando apropriado para que o cliente iniciar o grupo IM.

Para obter mais informações sobre o suporte para Lync, consulte o artigo da Biblioteca MSDN , "A partir de outro aplicativo Lync" (bit.ly/ZvbTvc).

Meios alternativos para ativar

Observe que a minha implementação usa ativação apenas uma regra (o item selecionado, sendo uma mensagem) e a API JavaScript (o método de Message.getEntities e Entities.emailAddresses Propriedade) para obter os endereços SMTP no corpo da mensagem. Eu vou mostrar uma implementação alternativa para ilustrar um exemplo de uma regra de ativação da expressão regular e como obter a expressão regular corresponde no app.

No manifesto do aplicativo, combine a regra de ItemIs existente usando o modo = e atributo, com uma segunda regra que o corpo do artigo deve conter um ou mais endereços de email, como filtrado pela expressão regular chamado 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>

Em seguida, no arquivo de JavaScript, em vez de acessar quaisquer entidades bem conhecidas que trocam tiver extraído a mensagem selecionada, como este:

itemEntities = _Item.getEntities();

Você pode usar o método Message.getRegExMatches para obter quaisquer endereços de email que correspondem reg1:

myEntities = _Item.getRegExMatches();

Modifica a função makeMyEntitiesUnique para lidar com endereços de e-mail armazenados na matriz myEntities.reg1.

Das duas abordagens, usar entidades well-known é preferível evitar qualquer sobrecarga extra na avaliação de uma expressão regular ao tentar ativar o aplicativo de email. Independentemente do tipo de regras de ativação especificado no manifesto do aplicativo, troca sempre extratos quaisquer entidades bem conhecidas do assunto ou corpo do item selecionado, então não há sem adicional sobrecarga incorridos, obtendo todos os endereços de e-mail no corpo da mensagem como entidades. Por outro lado, a sobrecarga de avaliar expressões regulares em uma regra de ativação pode ser significativa se o corpo do email é relativamente longo e contém muitos endereços de email. Para fornecer uma experiência satisfatória para email usuários do app, há certos limites que você deve estar ciente de que se você usar expressões regulares. Consulte o artigo da Biblioteca MSDN , "Limites para ativação e dados em aplicativos de e-mail para Outlook" (bit.ly/170WAQf), para obter detalhes.

Angela Chu-Hatoun começou como desenvolvedora de software e mudou para a redação devido ao seu grande interesse em explicar como funcionam os softwares. Ela é redatora de programação na Divisão do Office há 12 anos e escreve para os desenvolvedores sobre a criação de aplicativos para o Office e sobre outras soluções para o Outlook. Gosta de ler sobre assuntos atuais, jardinagem, viagem, gastronomia e moda.

Agradecemos aos seguintes especialistas técnicos pela revisão deste artigo: Andrew Salamatov (Microsoft) e Tim Wan (Microsoft)

Tim WAN graduado de Caltech em 2003 e é formado em engenharia e ciências aplicadas. Nos últimos nove anos, trabalha como desenvolvedor de software no Outlook. Trabalhou amplamente no recurso de aplicativos de email no Outlook 2013, bem como no modelo de objeto do Outlook nas versões anteriores. Ele está ansioso para lançar novos recursos e melhorias para os clientes no mundo inteiro.

Andrew Salamatov bio tk (ou outra coisa vai ficar)