Невозможно запросить календари других людей в exchangelib

#python #exchangelib

#python #exchangelib

Вопрос:

Я пытаюсь получить доступ к календарю других пользователей через:

 account = Account(
    primary_smtp_address=user,
    autodiscover=False,
    config=config,
    access_type=DELEGATE
)
items = account.calendar.filter(start__range=(start_date, end_date))
  

Однако я получаю Access is denied. Check credentials and try again., Cannot query rows in a table. доступ к их календарям через пользовательский интерфейс, поэтому я не уверен, что проблема именно в разрешениях (их календарь общедоступен в организации), и я также уже могу запрашивать свой собственный календарь просто отлично, просто когда дело доходит до других пользователей, я сталкиваюсь с этим. Есть идеи?

Редактировать 1: это сбой XML-вызова:

 Response data: <?xml version='1.0' encoding='utf-8'?>
<s:Envelope
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo
    xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="20" MajorBuildNumber="3305" MinorBuildNumber="32" Version="V2018_01_08"/>
  </s:Header>
  <s:Body>
    <m:FindItemResponse
    xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:FindItemResponseMessage ResponseClass="Error">
          <m:MessageText>Access is denied. Check credentials and try again., Cannot query rows in a table.</m:MessageText>
          <m:ResponseCode>ErrorAccessDenied</m:ResponseCode>
          <m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
        </m:FindItemResponseMessage>
      </m:ResponseMessages>
    </m:FindItemResponse>
  </s:Body>
</s:Envelope>
  

Кроме того, не уверен, насколько полезно, но account.calendar.filter(start__range=(start_date, end_date)) возвращает просто

 QuerySet(q=start >= EWSDateTime(2020, 8, 26, 12, 18, 40, 194001, tzinfo=<DstTzInfo 'Europe/London' BST 1:00:00 DST>) AND start <= EWSDateTime(2020, 8, 28, 0, 0, tzinfo=<DstTzInfo 'Europe/London' BST 1:00:00 DST>), folders=[Calendar (Calendar)])
  

Запрос XML:

 <?xml version='1.0' encoding='utf-8'?>
<s:Envelope
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
    xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
  <s:Header>
    <t:RequestServerVersion Version="Exchange2016"/>
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="GMT Standard Time"/>
    </t:TimeZoneContext>
  </s:Header>
  <s:Body>
    <m:FindItem Traversal="Shallow">
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
      </m:ItemShape>
      <m:IndexedPageItemView MaxEntriesReturned="100" Offset="0" BasePoint="Beginning"/>
      <m:Restriction>
        <t:And>
          <t:IsGreaterThanOrEqualTo>
            <t:FieldURI FieldURI="calendar:Start"/>
            <t:FieldURIOrConstant>
              <t:Constant Value="2020-08-27T09:22:23 01:00"/>
            </t:FieldURIOrConstant>
          </t:IsGreaterThanOrEqualTo>
          <t:IsLessThanOrEqualTo>
            <t:FieldURI FieldURI="calendar:Start"/>
            <t:FieldURIOrConstant>
              <t:Constant Value="2020-08-28T00:00:00 01:00"/>
            </t:FieldURIOrConstant>
          </t:IsLessThanOrEqualTo>
        </t:And>
      </m:Restriction>
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="calendar">
          <t:Mailbox>
            <t:EmailAddress>censored@company.com</t:EmailAddress>
            <t:RoutingType>SMTP</t:RoutingType>
            <t:MailboxType>Mailbox</t:MailboxType>
          </t:Mailbox>
        </t:DistinguishedFolderId>
      </m:ParentFolderIds>
    </m:FindItem>
  </s:Body>
</s:Envelope>
  

Комментарии:

1. Попробуйте включить ведение журнала отладки, чтобы увидеть, какой XML-запрос вызывает эту ошибку на сервере. Поиск в Google сообщения об ошибке не дает много подсказок, кроме ошибок разрешения и возможной ошибки в Exchange 2016: support.microsoft.com/en-ca/help/3196521 /…

2. Вы могли бы попробовать ограничить поля, которые вы извлекаете, добавив, например, .only('start', 'end', 'subject') в запрос. Возможно, что календарь содержит личные встречи с полями, к которым у вас нет доступа.

3. Я прикрепил XML неудачного вызова к основному вопросу. Я пытался фильтровать через начало и конец безрезультатно (зная, что у меня есть доступ к просмотру этих событий). API version "Exchange2016" worked but server reports version "V2018_01_08". Using "Exchange2016" Имеет какое-либо значение?

4. Обновленный основной вопрос с дополнительной информацией.

5. Вы опубликовали XML-ответ, но вам все еще не хватает XML-запроса. Вы можете опубликовать это? Версия API не причиняет вреда.