Есть ли способ получить всех получателей в полях `to` или` cc`? - PullRequest
0 голосов
/ 08 октября 2019

В документации Office.MessageRead.to упоминается, что:

Свойство to возвращает массив, содержащий объект EmailAddressDetails для каждого получателя, указанного в строке «Кому» сообщения. Коллекция ограничена максимум 100 участниками.

Это ограничение работает правильно, если у меня есть сообщение, которое было отправлено более чем 100 получателям, я могу получить только 100 адресов электронной почты с Office.context.mailbox.item.to.

Подобные ограничения не упоминаются в документации Office.AppointmentRead.requiredAttendees, но я могу получить только 100 адресов электронной почты с Office.context.mailbox.item.requiredAttendees.

Вопрос

Я пытался получить получателей с Office.context.mailbox.item.to и REST API , я могу получить только 100 адресов электронной почты. Есть ли способ получить полный список получателей?

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вы можете попробовать использовать метод GetItem , доступный в EWS.

См. Часто задаваемые вопросы о регулировании и ограничениях Exchange Online для получения дополнительной информации об ограничениях в Exchange.

0 голосов
/ 09 октября 2019

В ответе Евгения было предложено использовать Office.context.mailbox.makeEwsRequestAsync для отправки запросов SOAP XML для получения полного списка получателей. Это работает, если вы указали разрешение ReadWriteMailbox в манифесте надстройки Office.

<Permissions>ReadWriteMailbox</Permissions>

Пример кода для использования Office.context.mailbox.makeEwsRequestAsync:


/**
 * @param {HTMLElement} node The `t:Mailbox` node. As in
 * <t:Mailbox>
 *  <t:Name>At The Table</t:Name>
 *  <t:EmailAddress>atthetable@microstrategy.com</t:EmailAddress>
 *  <t:RoutingType>SMTP</t:RoutingType>
 *  <t:MailboxType>Mailbox</t:MailboxType>
 * </t:Mailbox>
 * @return {string} A string as in `Name (email@address.com)` when success;
 * empty string otherwise.
 */
const parseMailboxNode = (node) => {
  const nameNode = node.getElementsByTagName('t:Name')[0];
  const addressNode = node.getElementsByTagName('t:EmailAddress')[0];
  return {
    displayName: nameNode.textContent,
    emailAddress: addressNode.textContent,
  };
};

const parseEmailAddresses = (doc, messageFieldName) => {
  const fieldNode = doc.getElementsByTagName(`t:${messageFieldName}`)[0];
  if (!fieldNode) {
    return [];
  }

  const emailAddresses = [];
  const mailboxes = fieldNode.getElementsByTagName('t:Mailbox');
  for (let i = 0, l = mailboxes.length; i < l; i += 1) {
    emailAddresses.push(parseMailboxNode(mailboxes[i]));
  }
  return emailAddresses;
};

const parseGetItemSoapResponse = (xml) => {
  try {
    const parser = new DOMParser();
    // https://developer.mozilla.org/en-US/docs/Web/API/XMLDocument
    const doc = parser.parseFromString(xml, 'application/xml');
    const message = {
      ReplyTo: parseEmailAddresses(doc, 'ReplyTo')[0],
    };
    return [
      'ToRecipients',
      'CcRecipients',
      'BccRecipients',
      'RequiredAttendees',
      'OptionalAttendees',
    ].reduce((result, fieldName) => {
      result[fieldName] = parseEmailAddresses(doc, fieldName);
      return result;
    }, message);
  } catch (error) {
    throw new Error('Failed to parse XML response of Office.context.mailbox.makeEwsRequestAsync', xml);
    return null;
  }
};

const getRecipients = async (item) => new Promise((resolve, reject) => {
  const { context } = window.Office || {};
  const { mailbox } = context || {};
  if (!mailbox || !mailbox.makeEwsRequestAsync) {
    const error = new Error('Office.context.mailbox.makeEwsRequestAsync is not available.');
    reject(error);
    return;
  }

  const { itemId } = item || {};
  if (!itemId) {
    const error = new Error('Office.context.mailbox.item.itemId is invalid.');
    reject(error);
    return;
  }

  // See https://docs.microsoft.com/en-us/outlook/add-ins/web-services
  // See https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/getitem-operation-email-message
  // See https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/fielduri
  const request = `<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="https://www.w3.org/2001/XMLSchema"
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
  <soap:Header>
    <RequestServerVersion Version="Exchange2013" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" soap:mustUnderstand="0" />
  </soap:Header>
  <soap:Body>
    <GetItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
      <ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
            <t:FieldURI FieldURI="message:ReplyTo"/>
            <t:FieldURI FieldURI="message:ToRecipients"/>
            <t:FieldURI FieldURI="message:CcRecipients"/>
            <t:FieldURI FieldURI="message:BccRecipients"/>
            <t:FieldURI FieldURI="calendar:RequiredAttendees"/>
            <t:FieldURI FieldURI="calendar:OptionalAttendees"/>
        </t:AdditionalProperties>
      </ItemShape>
      <ItemIds><t:ItemId Id="${itemId}"/></ItemIds>
    </GetItem>
  </soap:Body>
</soap:Envelope>
`;

  mailbox.makeEwsRequestAsync(request, (result) => {
    if (result.error) {
      reject(result.error);
    } else {
      const value = parseGetItemSoapResponse(result.value);
      resolve(value);
    }
  });
});
...