Mithilfe von EWS in Exchange Termine löschen und Besprechungen absagen

Erfahren Sie, wie Sie Termine und Besprechungen mit Hilfe der EWS Managed API oder EWS in Exchange löschen können.

Der wesentliche Unterschied zwischen Besprechungen und Terminen besteht darin, dass Besprechungen über Teilnehmer verfügen und Termine nicht. Termine und Besprechungen können einzelne Instanzen oder teil einer Terminserie sein, da Termine jedoch keine Teilnehmer, Räume oder Ressourcen umfassen, muss dafür keine Nachricht gesendet werden. Intern verwendet Exchange dasselbe Objekt für Besprechungen und Termine. Sie verwenden die EWS Managed API Appointment-Klasse oder das EWS [CalendarItem](https://msdn.microsoft.com/library/Title Topic ID Project Name Writer Editor Publish Preview.aspx)-Element, um mit Besprechungen und Terminen zu arbeiten.

Tabelle 1. Verwaltete EWS-API-Methoden und EWS-Vorgänge zum Löschen von Terminen und Besprechungen

Von EWS verwaltete API-Methode EWS-Vorgang Funktion der Einstellung
Appointment.Delete
DeleteItem
Löscht einen Termin.
Appointment.Delete
CreateItem (Kalendereintrag)
Löscht eine Besprechung.

Beachten Sie, dass Sie beim Löschen eines Termins mithilfe von EWS die Operation DeleteItem verwenden, aber wenn Sie eine Besprechung löschen, verwenden Sie die Operation CreateItem. Dies mag kontraintuitiv erscheinen, aber es ist so, weil Sie ein Besprechungsantwortobjekt erstellen müssen, um Besprechungsabsagen an die Teilnehmer zu senden.

Löschen eines Termins mit Hilfe der EWS Managed API

Das folgende Codebeispiel zeigt, wie Sie mit der Delete-Methode einen Termin aus dem Kalenderordner löschen und mit der ExchangeService.FindItems-Methode überprüfen, ob der Termin gelöscht wurde, indem Sie im Ordner „Gelöschte Einträge“ nach ihm suchen.

In diesem Beispiel wird davon ausgegangen, das Sie sich an einem Exchange-Server angemeldet haben und das ExchangeService-Objekt service erhalten haben. Die lokale Variable appointmentId ist eine Kennung, die einem vorhandenen Termin zugeordnet ist.

// Instantiate an appointment object by binding to it by using the ItemId.
// As a best practice, limit the properties returned to only the ones you need.
Appointment appointment = Appointment.Bind(service, appointmentId, new PropertySet());
// Delete the appointment. Note that the item ID will change when the item is moved to the Deleted Items folder.
appointment.Delete(DeleteMode.MoveToDeletedItems);
// Verify that the appointment has been deleted by looking for a matching subject in the Deleted Items folder's first entry.
ItemView itemView = new ItemView(1);
itemView.Traversal = ItemTraversal.Shallow;
// Just retrieve the properties you need.
itemView.PropertySet = new PropertySet(ItemSchema.Id, ItemSchema.ParentFolderId, ItemSchema.Subject);
// Note that the FindItems method results in a call to EWS.
FindItemsResults<Item> deletedItems = service.FindItems(WellKnownFolderName.DeletedItems, itemView);
Item deletedItem = deletedItems.First();
Folder parentFolder = Folder.Bind(service, deletedItem.ParentFolderId, new PropertySet(FolderSchema.DisplayName));
Console.WriteLine("The appointment " + "\"" + deletedItem.Subject + "\"" + " is now in the " + parentFolder.DisplayName + " folder.");

Dieses Beispiel zeigt eine einfache Möglichkeit, um zu überprüfen, ob der Termin gelöscht wurde, indem überprüft wird, ob der Betreff des ersten Elements im Ordner „Gelöschte Objekte“ mit dem des gelöschten Termins übereinstimmt. Die Art und Weise, wie Sie überprüfen, ob Ihr Termin gelöscht wurde, hängt von den Anforderungen Ihrer Anwendung ab.

Wie Sie sehen, ist das Löschen eines Termins ganz einfach und entspricht in etwa dem, was Sie erwarten. Beachten Sie bei der Erstellung Ihres Überprüfungsschritts, dass das Terminelement im Ordner „Gelöschte Objekte“ eine andere ItemId hat als das Terminelement im Kalenderordner. Das Element wird kopiert und gelöscht, anstatt einfach in den Ordner „Gelöschte Elemente“ verschoben zu werden.

Löschen eines Termins mithilfe von EWS

Die Anforderungs- und Antwort-XML in den folgenden Beispielen entsprechen Aufrufen, die vom EWS Managed API-Code in Delete an appointment by using the EWS Managed API (Löschen eines Termins mithilfe der verwalteten EWS-API) ausgeführt werden. Der Anforderungs- und Antwort-XML-Code, der überprüft, ob sich das Terminelement im Ordner "Gelöschte Elemente" befindet, wird ebenfalls angezeigt.

Das folgende Beispiel zeigt das Anfrage-XML für die DeleteItem-Operation zum Löschen eines Termins.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
       xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Pacific Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:DeleteItem DeleteType="MoveToDeletedItems" SendMeetingCancellations="SendToAllAndSaveCopy">
      <m:ItemIds>
        <t:ItemId Id="AAMkA" ChangeKey="DwAAA" />
      </m:ItemIds>
    </m:DeleteItem>
  </soap:Body>
</soap:Envelope>

Das folgende Beispiel zeigt die XML-Antwort, die von der DeleteItem-Operation zurückgegeben wird. Die Attribute ItemId und ChangeKey sind zur besseren Lesbarkeit gekürzt.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="800" MinorBuildNumber="5" Version="V2_6" 
 xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types" 
 xmlns="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:DeleteItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
  xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:DeleteItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
        </m:DeleteItemResponseMessage>
      </m:ResponseMessages>
    </m:DeleteItemResponse>
  </s:Body>
</s:Envelope>

Das folgende Beispiel zeigt das Anfrage-XML für den Vorgang FindItem, der das erste Element im Ordner „Gelöschte Elemente“ abruft, um den Betreff des Elements mit dem des gelöschten Terminobjekts zu vergleichen.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages
" xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Pacific Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:FindItem Traversal="Shallow">
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="item:ItemId" />
          <t:FieldURI FieldURI="item:ParentFolderId" />
          <t:FieldURI FieldURI="item:Subject" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:IndexedPageItemView MaxEntriesReturned="1" Offset="0" BasePoint="Beginning" />
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="deleteditems" />
      </m:ParentFolderIds>
    </m:FindItem>
  </soap:Body>
</soap:Envelope>

Das folgende Beispiel zeigt den Antwort-XML-Code, der von der Operation FindItem während des Überprüfungsschritts zurückgegeben wird.

Hinweis

Die Attribute ItemId und ChangeKey sind zur besseren Lesbarkeit gekürzt.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="800" MinorBuildNumber="5" Version="V2_6" 
 xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types" 
 xmlns="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:FindItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:FindItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootFolder IndexedPagingOffset="1" TotalItemsInView="10748" IncludesLastItemInRange="false">
            <t:Items>
              <t:CalendarItem>
                <t:ItemId Id="AAMkA=" ChangeKey="DwAAA" />
                <t:ParentFolderId Id="AAMkA" ChangeKey="AQAAA" />
                <t:Subject>Tennis lesson</t:Subject>
              </t:CalendarItem>
            </t:Items>
          </m:RootFolder>
        </m:FindItemResponseMessage>
      </m:ResponseMessages>
    </m:FindItemResponse>
  </s:Body>
</s:Envelope>

Löschen einer Besprechung mithilfe der EWS Managed API

Wenn Sie eine Besprechung löschen, möchten Sie möglicherweise nicht nur das Terminelement aus dem Kalenderordner entfernen, sondern auch Besprechungsabsagen an die Teilnehmer senden. Sie können die folgenden drei Methoden verwenden, um eine Besprechung abzusagen:

Welche Methode Sie wählen, hängt davon ab, wie detailliert Sie Ihre Absagenachricht gestalten wollen. Appointment.CancelMeeting macht es einfach, die Absagenachricht zu aktualisieren, indem eine aktualisierte Nachricht als Parameter übergeben wird. CancelMeetingMessage ermöglicht es Ihnen, die Eigenschaften Ihrer Nachricht zu ändern, bevor Sie eine Absage senden, so dass Sie z. B. eine Empfangsbestätigung anfordern können.

Die Codebeispiele in diesem Abschnitt zeigen die verschiedenen Möglichkeiten zum Löschen einer Besprechung und zum Senden von Besprechungsabsagen. In diesen Beispielen wird davon ausgegangen, das Sie sich an einem Exchange-Server authentifiziert haben und das ExchangeService-Objekt mit dem Namenservice erhalten haben. Die lokale VariablemeetingId ist eine Kennung, die mit einer bestehenden Besprechung verknüpft ist, bei der der Zielnutzer der Organisator der Besprechung ist.

Das folgende Codebeispiel zeigt, wie Sie eine Besprechung mithilfe der Appointment.Delete-Methode löschen.

// Instantiate an appointment object for the meeting by binding to it using the ItemId.
// As a best practice, limit the properties returned to only the Appointment ID.
            
Appointment meeting = Appointment.Bind(service, meetingId, new PropertySet());
// Delete the meeting by using the Delete method.
meeting.Delete(DeleteMode.MoveToDeletedItems, SendCancellationsMode.SendToAllAndSaveCopy);
// Verify that the meeting has been deleted by looking for a matching subject in the Deleted Items folder's first entry.
ItemView itemView = new ItemView(1);
itemView.Traversal = ItemTraversal.Shallow;
// Just retrieve the properties you need.
itemView.PropertySet = new PropertySet(ItemSchema.Id, ItemSchema.ParentFolderId, ItemSchema.Subject);
// Note that the FindItems method results in a call to EWS.
FindItemsResults<Item> deletedItems = service.FindItems(WellKnownFolderName.DeletedItems, itemView);
Item deletedItem = deletedItems.First();
Folder parentFolder = Folder.Bind(service, deletedItem.ParentFolderId, new PropertySet(FolderSchema.DisplayName));
Console.WriteLine("The meeting " + "\"" + deletedItem.Subject + "\"" + " is now in the " + parentFolder.DisplayName + " folder.");

Das folgende Codebeispiel zeigt, wie Sie eine Besprechung mithilfe der CancelMeeting-Methode löschen.

// Instantiate an appointment object by binding to it using the ItemId.
// As a best practice, limit the properties returned to only the Appointment ID.
Appointment meeting = Appointment.Bind(service, meetingId, new PropertySet());
// Delete the meeting by using the CancelMeeting method.
meeting.CancelMeeting("The outdoor meeting has been cancelled due to hailstorms.");

Das folgende Codebeispiel zeigt, wie Sie eine Besprechung mithilfe der Appointment.CreateCancelMeetingMessage-Methode löschen.

// Instantiate an appointment object by binding to it using the ItemId.
// As a best practice, limit the properties returned to only the Appointment ID.
Appointment meeting = Appointment.Bind(service, meetingId, new PropertySet());
// Delete the meeting by using the CreateCancelMeetingMessage method.
CancelMeetingMessage cancelMessage = meeting.CreateCancelMeetingMessage();
cancelMessage.Body = new MessageBody("The outdoor meeting has been canceled due to hailstorms.");
cancelMessage.IsReadReceiptRequested = true;
cancelMessage.SendAndSaveCopy();

Löschen einer Besprechung mithilfe von EWS

Der Anforderungs- und Antwort-XML-Code in den folgenden Beispielen entspricht den Aufrufen über den EWS Managed API-Code unter Löschen einer Besprechung mithilfe der EWS Managed API mittels der Appointment.Delete-Methode.

Das folgende Beispiel zeigt das Anfrage-XML, wenn Sie die Operation CreateItem verwenden, um Absagenachrichten an Teilnehmer zu senden und eine Besprechung zu löschen.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
       xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Pacific Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:CreateItem MessageDisposition="SendAndSaveCopy">
      <m:Items>
        <t:CancelCalendarItem>
          <t:ReferenceItemId Id="AAMkA" ChangeKey="DwAAA" />
          <t:NewBodyContent BodyType="HTML">The outdoor meeting has been canceled due to hailstorms.</t:NewBodyContent>
        </t:CancelCalendarItem>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

Das folgende Beispiel zeigt den XML-Code, der als Antwort auf eine CreateItem-Vorgangsanforderung zurückgegeben wird, die zum Löschen einer Besprechung verwendet wird.

Hinweis

Die Attribute ItemId und ChangeKey sind zur besseren Lesbarkeit gekürzt.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="800" MinorBuildNumber="5" Version="V2_6" 
 xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types" 
 xmlns="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:CreateItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:CreateItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:Items>
            <t:CalendarItem>
              <t:ItemId Id="AAMkA" ChangeKey="DwAAA" />
            </t:CalendarItem>
          </m:Items>
        </m:CreateItemResponseMessage>
      </m:ResponseMessages>
    </m:CreateItemResponse>
  </s:Body>
</s:Envelope>

Das folgende Beispiel zeigt die Anforderungs-XML für die Operation FindItem, die das erste Element im Ordner „Gelöschte Elemente“ abruft, um den Betreff des Elements mit dem des gelöschten Terminobjekts zu vergleichen.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
       xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Pacific Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:FindItem Traversal="Shallow">
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="item:ItemId" />
          <t:FieldURI FieldURI="item:ParentFolderId" />
          <t:FieldURI FieldURI="item:Subject" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:IndexedPageItemView MaxEntriesReturned="1" Offset="0" BasePoint="Beginning" />
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="deleteditems" />
      </m:ParentFolderIds>
    </m:FindItem>
  </soap:Body>
</soap:Envelope>

Das folgende Beispiel zeigt den XML-Code, der von der Operation FindItem während des Überprüfungsschritts zurückgegeben wird.

Hinweis

Die Attribute Id und ChangeKey sind zur besseren Lesbarkeit gekürzt.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="800" MinorBuildNumber="5" Version="V2_6" 
 xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types" 
 xmlns="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:FindItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:FindItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootFolder IndexedPagingOffset="1" TotalItemsInView="10750" IncludesLastItemInRange="false">
            <t:Items>
              <t:CalendarItem>
                <t:ItemId Id="AAMkA" ChangeKey="DwAAA" />
                <t:ParentFolderId Id="AAMkA" ChangeKey="AQAAA" />
                <t:Subject>Team building exercise</t:Subject>
              </t:CalendarItem>
            </t:Items>
          </m:RootFolder>
        </m:FindItemResponseMessage>
      </m:ResponseMessages>
    </m:FindItemResponse>
  </s:Body>
</s:Envelope>

Siehe auch