Änderungsbenachrichtigungen für Outlook-Ressourcen in Microsoft Graph
Mit dem Microsoft Graph-API können Sie Änderungen an einer Ressource abonnieren – einschließlich Erstellung, Aktualisierung oder Löschung der Ressource – und Benachrichtigungen über Webhooks erhalten. Ein Abonnement gibt die gewünschten Arten von Änderungen an, die für eine bestimmte Ressource überwacht werden sollen, und enthält eine URL für einen Endpunkt, um Benachrichtigungen über diese Änderungen zu erhalten.
Durch das Einrichten eines Abonnements wird der Aufwand reduziert, der sonst durch das Abfragen und Vergleichen von Ressourcen entsteht, um Änderungen abzuleiten. Optional können Sie in der Abonnementanforderung angeben, dass die geänderten Ressourcendaten verschlüsselt und als Teil einer Benachrichtigung eingeschlossen werden sollen, wodurch ein separater nachfolgender API-Aufruf gespeichert wird, um die Ressourcennutzlast abzurufen.
Die maximale Anzahl der aktiven Abonnements ist für alle Anwendungen bei Outlook auf 1000 Abonnements pro Postfach beschränkt. Sie können Änderungen an Kontakten, Ereignissen oder Nachrichten im Postfach abonnieren.
Abonnieren von Änderungen in Kontakten, Kalendern oder E-Mails
Um Änderungsbenachrichtigungen von Outlook-Ressourcen zu abonnieren, erstellen Sie zuerst ein Abonnement.
Die folgende Outlook-Ressourcen unterstützen Abonnements mit oder ohne Ressourcendaten in der Nutzlast Änderungsbenachrichtigung.
Erstellen eines Abonnements
Damit Sie ein Abonnement erstellen, geben Sie die Outlook-Ressource und den Typ der Änderungen (Erstellung, Aktualisierung oder Löschung) an, für die Sie Benachrichtigungen erhalten möchten. Sehen Sie sich das Beispiel an.
Berechtigungen anfordern
Das Erstellen und Verwalten (Abrufen, Aktualisieren und Löschen) eines Abonnements erfordert einen Lesebereich für die Ressource. Beispiel: Zum Erhalten von Änderungsbenachrichtigungen zu Nachrichten benötigt Ihre App die Mail.Read-Berechtigung. Outlook-Änderungsbenachrichtigungen unterstützen delegierte und Anwendungsberechtigungsbereiche. Beachten Sie die folgenden Einschränkungen:
Die delegierte Berechtigung unterstützt das Abonnieren von Objekten in Ordnern, die sich nur im Postfach des angemeldeten Benutzers befinden. Beispielsweise können Sie die delegierte Berechtigung Calendars.Read nicht verwenden, um Ereignisse im Postfach eines anderen Benutzers zu abonnieren.
So abonnieren Sie Änderungsbenachrichtigungen über Outlook-Kontakte, -Ereignisse oder -Nachrichten in freigegebenen oder delegierten Ordnern:
- Verwenden Sie die entsprechende Anwendungsberechtigung, um Änderungen von Elementen in einem Ordner oder Postfach eines beliebigen Benutzers im Mandanten zu abonnieren.
- Verwenden Sie nicht die Outlook-Freigabeberechtigungen (Contacts.Read.Shared, Calendars.Read.Shared, Mail.Read.Shared und deren Entsprechungen mit Lese-/Schreibzugriff), da sie das Abonnieren von Änderungsbenachrichtigungen für Elemente in freigegebenen oder delegierten Ordnern nicht unterstützen.
Verwenden Sie je nach Ressource die am wenigsten privilegierte Berechtigung, die in der folgenden Tabelle angegeben ist, um diese API aufzurufen.
Ressource | Unterstützte Ressourcenpfade | Delegiert (Geschäfts-, Schul- oder Unikonto) | Delegiert (persönliches Microsoft-Konto) | Anwendung |
---|---|---|---|---|
contact | Änderungen an allen persönlichen Kontakten im Postfach eines Benutzers:/me/contacts /users/{id}/contacts Änderungen an Kontakten im contactFolder eines Benutzers: /users/{id}/contactFolders/{id}/contacts |
Contacts.Read | Contacts.Read | Contacts.Read |
event | Änderungen an allen Ereignissen im Postfach eines Benutzers:/me/events /users/{id}/events |
Calendars.Read | Calendars.Read | Calendars.Read |
meldung | Änderungen an allen Nachrichten im Postfach eines Benutzers:/me/messages /users/{id}/messages Änderungen an Nachrichten im mailFolder eines Benutzers: /users/{id}/mailFolders/{id}/messages |
Mail.ReadBasic, Mail.Read | Mail.ReadBasic, Mail.Read | Mail.ReadBasic, Mail.Read |
Einschließen von Ressourcendaten in die Benachrichtigungsnutzlast
Wenn Ressourcendaten in eine Änderungsbenachrichtigung eingeschlossen werden sollen, müssen Sie zusätzlich zu den Eigenschaften, die Sie normalerweise beim Erstellen eines Abonnements angeben, die folgenden Eigenschaften angeben:
includeResourceData: Legen Sie diese Eigenschaft auf
true
fest, um Ressourcendaten explizit anzufordern.Ressource: Diese Eigenschaft gibt die Ressourcen-URL an. Stellen Sie sicher, dass Sie den
$select
-Abfrageparameter verwenden, um für die Outlook-Ressourceneigenschaften explizit anzugeben, dass diese die Nutzdaten der Benachrichtigung einschließen sollen.Hinweis
Schließen Sie in die URL nicht
$top
,$skip
,$orderby
,$select=Body,UniqueBody
, und$expand
andere als singleValueExtendedProperties oder multiValueExtendedProperties ein.encryptionCertificate: Diese Eigenschaft enthält nur den öffentlichen Schlüssel, mit dem Microsoft Graph Ressourcendaten verschlüsselt. Behalten Sie den entsprechenden privaten Schlüssel, um den Inhalt zu entschlüsseln.
encryptionCertificateId: Diese Eigenschaft ist Ihre eigene Kennung für das Zertifikat. Verwenden Sie diese ID, um in jeder Änderungsbenachrichtigung zu ermitteln, welches Zertifikat für die Entschlüsselung verwendet werden soll.
Sehen Sie sich ein Beispiel zum Abonnieren von Änderungsbenachrichtigungen mit Ressourcendaten für die Ressource Nachricht an.
Optimieren der Bedingungen für eine Benachrichtigung
Sie können die Bedingungen für eine Benachrichtigung mithilfe des $filter
-Abfrageparameters weiter optimieren. Sehen Sie sich das Beispiel an.
Eine gängige Anwendung von $filter
besteht darin, bei einer Änderung einer bestimmten Ressourceneigenschaft benachrichtigt zu werden. Beispielsweise können Sie $filter
verwenden, um ungelesene Nachrichten in einem Ordner zu abonnieren (die Eigenschaft isRead ist false
), und alle Änderungstypen einschließen:
- Eine Nachricht, die dem Ordner hinzugefügt oder als ungelesen markiert wurde, würde eine
Created
-Benachrichtigung auslösen. - Wenn Sie eine Nachricht lesen oder als im Ordner gelesen markieren, würde eine
Deleted
-Benachrichtigung auslösen. - Eine Änderung an einer Eigenschaft einer Nachricht-Ressource im Ordner, mit Ausnahme von isRead, würde eine
Updated
-Benachrichtigung auslösen.
Wenn Sie beim Erstellen des Abonnements kein verwenden $filter
:
- Das Hinzufügen einer Nachricht zum Ordner würde zu einer
Created
-Benachrichtigung führen. - Das Lesen einer Nachricht im Ordner, das Markieren der Nachricht als gelesen oder das Ändern einer anderen Eigenschaft einer Nachricht in diesem Ordner würde zu einer
Updated
-Benachrichtigung führen. - Das Löschen der Nachricht würde zu einer
Delete
-Benachrichtigung führen.
Lebenszyklusbenachrichtigungen abonnieren
Die Outlook-Ressourcen Kontakt, Ereignis und Nachricht unterstützen auch das Abonnieren von Lebenszyklusbenachrichtigungen. Lebenszyklusbenachrichtigungen sind erforderlich, wenn Ihre App ihre Abonnements entfernt oder einige Änderungsbenachrichtigungen verpasst. Apps sollten eine Logik implementieren, um den Verlust zu erkennen und zu beheben und einen kontinuierlichen Änderungsbenachrichtigungsfluss fortzusetzen. Weitere Informationen finden Sie unter Abonnieren von Lebenszyklusbenachrichtigungen.
Gültigkeitsdauer von Abonnements nachverfolgen
Stellen Sie sicher, dass Sie ein Abonnement verlängern, bevor es abläuft. Die maximale Lebensdauer für ein Abonnement ohne Outlook-Ressourcendaten finden Sie in der Tabelle mit der Abonnementlebensdauer.
Wenn Sie die zuvor erteilte Berechtigung für ein Abonnement verlieren und das Abonnement in der Zwischenzeit abläuft, fordern Sie erneut die Berechtigung an, um ein neues Abonnement zu erstellen.
Nutzdaten der Benachrichtigungen empfangen
Je nach Abonnement können Benachrichtigungen Ressourcendaten enthalten. Abonnements mit Ressourcendaten ermöglichen es Ihnen, die Ressourcennutzlast zusammen mit der Benachrichtigung abzurufen, wodurch der Mehraufwand für einen separaten API-Aufruf zum Abrufen der geänderten Ressourcendaten vermieden wird.
Empfangen von Benachrichtigungen mit Ressourcendaten
Es folgt ein Beispiel für die Nutzdaten einer Benachrichtigung mit Ressourcendaten einer Nachricht-Ressource. Die Eigenschaften resource und resourceData entsprechen der Meldung instance, die die Benachrichtigung ausgelöst hat. Verwenden Sie die Eigenschaft encryptedContent, um die Ressourcendaten zu entschlüsseln.
{
"value": [
{
"subscriptionId": "dfd11b2f-8222-4189-9545-4205c95d6235",
"subscriptionExpirationDateTime": "2021-12-31T16:16:44.9907405+05:30",
"changeType": "created",
"resource": "Users('722effaf-0433-4272-9ac4-d5ec11c3cd77')/messages('AAMkAGUwNjQ4ZjIxLTQ3Y2Y8AAA=')",
"clientState": "<<--SpecifiedClientState-->>",
"tenantId": "<<--TenantForWhichNotificationWasSent-->>",
"encryptedContent": {
"data": "<<--EncryptedContent-->>",
"dataKey": "<<--EnryptedDataKeyUsedForEncryptingContent-->>",
"dataSignature": "Qw/9ubWeUYJPWWXvNiGgct2FkNG2MXTRm/BLUpJM66k=",
"encryptionCertificateId": "<<--IdOfTheCertificateUsedForEncryptingDataKey-->>",
"encryptionCertificateThumbprint": "<<--ThumbprintOfTheCertificateUsedForEncryptingDataKey-->>"
},
"resourceData": {
"@odata.type": "#microsoft.graph.message",
"@odata.id": "Users('722effaf-0433-4272-9ac4-d5ec11c3cd77')/messages('AAMkAGUwNjQ4ZjIxLTQ3Y2Y8AAA=')",
"@odata.etag": "W/\"CQAAABYAAACQ2fKdhq8oSKEDSVrdi3lRAAGDUR8n\"",
"id": "AAMkAGUwNjQ4ZjIxLTQ3Y2Y8AAA="
}
}
]
"validationTokens": ["<<--ValidationTokens-->>"]
}
Einzelheiten zum Validieren von Tokens und Entschlüsseln der Nutzlast finden Sie unter Änderungsbenachrichtigungen einrichten, die Ressourcendaten enthalten.
Es folgt ein Beispiel für eine entschlüsselte Nutzlast einer Benachrichtigung. Die entschlüsselte Nutzlast entspricht dem Outlook-Schema Nachricht. Die Nutzlast ähnelt der von einer GET-Nachricht zurückgegebenen Nutzlast. Die Nutzdaten einer Benachrichtigung enthalten jedoch nur die Eigenschaften, die mit einem $select
-Parameter in der Eigenschaft Ressource des Abonnements angegeben sind. Nutzdaten einer Benachrichtigung für andere Outlook-Ressourcen wie Kontakt und Ereignis folgen den jeweiligen Schemas.
{
"receivedDateTime@odata.type":"#DateTimeOffset",
"receivedDateTime":"2021-12-30T10:53:35Z",
"subject":"TEST MESSAGE FOR RICH NOTIFICATIONS",
"bodyPreview":"Hello,\r\n\r\nWhat\u2019s up?\r\n\r\nThanks\r\nMegan",
"importance@odata.type":"#microsoft.graph.importance",
"importance":"normal",
"from": {
"@odata.type":"#microsoft.graph.recipient",
"emailAddress": {
"@odata.type":"#microsoft.graph.emailAddress",
"name":"Megan Brown",
"address":"Megan.Brown@microsoft.com"
}
}
}
Benachrichtigungen ohne Ressourcendaten empfangen
Benachrichtigungen ohne Ressourcendaten enthalten genügend Informationen, um GET-Aufrufe zu tätigen, um die Ressource zu erhalten. Abonnements für Benachrichtigungen ohne Ressourcendaten erfordern kein Verschlüsselungszertifikat, da die tatsächlichen Ressourcendaten nicht übermittelt werden.
Das nächste Beispiel zeigt die Nutzdaten einer Benachrichtigung, die einer Outlook-Ressource Nachricht entsprechen. Es enthält die Eigenschaften Ressource und ResourceData, die die Ressource darstellen, die die Benachrichtigung ausgelöst hat. Verwenden Sie die Eigenschaften Ressource und @odata.id, um Aufrufe an Microsoft Graph zu tätigen, um die Nutzlast für die Nachricht zu erhalten.
Hinweis
GET Aufrufe geben immer den aktuellen Status der Ressource zurück. Wenn die Ressource zwischen dem Zeitpunkt des Sendens der Benachrichtigung und dem Abrufen der Ressource geändert wird, gibt der Vorgang den Status der Ressource beim Abrufen zurück.
"value": [
{
"subscriptionId": "c6126aa3-0ed8-412f-a988-71e6cee627c4",
"subscriptionExpirationDateTime": "2022-01-02T03:12:18.2257768+05:30",
"changeType": "created",
"resource": "Users/622eaaff-0683-4862-9de4-f2ec83c2bd98/Messages/AAMkAGUwNjQ4ZjIxAAA=",
"resourceData": {
"@odata.type": "#Microsoft.Graph.Message",
"@odata.id": "Users/622eaaff-0683-4862-9de4-f2ec83c2bd98/Messages/AAMkAGUwNjQ4ZjIAAA=",
"@odata.etag": "W/\"CQAAABYAAACQ2fKdhq8oSKEDSVrdi3lRAAGDUUXn\"",
"id": "AAMkAGUwNjQ4ZjIxAAA="
},
"clientState": "<<--SpecifiedClientState-->>",
"tenantId": "<<--TenantForWhichNotificationWasSent-->>"
}
]
Beispiele
Beispiel 1: Erstellen eines Abonnements zum Abrufen von Änderungsbenachrichtigungen ohne Ressourcendaten, wenn der Benutzer eine neue Nachricht empfängt
Im folgenden Beispiel wird eine Benachrichtigung für eine Nachricht angefordert, die im Postfach des Benutzers erstellt wird.
Anforderung
POST https://graph.microsoft.com/v1.0/subscriptions
Content-type: application/json
{
"changeType": "created",
"notificationUrl": "https://webhook.azurewebsites.net/api/send/myNotifyClient",
"resource": "users/622eaaff-0683-4862-9de4-f2ec83c2bd98/messages",
"expirationDateTime": "2021-07-07T21:42:18.2257768+00:00",
"clientState": "secretClientState"
}
Antwort
Das folgende Beispiel zeigt die Antwort.
Hinweis: Das hier gezeigte Antwortobjekt kann zur besseren Lesbarkeit gekürzt werden.
HTTP/1.1 201 Created
Content-type: application/json
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#subscriptions/$entity",
"id": "5522bd62-7c96-4530-85b0-00b916f6151a",
"resource": "users/622eaaff-0683-4862-9de4-f2ec83c2bd98/messages",
"applicationId": "507c3b9a-67b8-463d-88a2-15a8cefb2111",
"changeType": "created",
"clientState": "secretClientState",
"notificationUrl": "https://webhook.azurewebsites.net/api/send/myNotifyClient",
"notificationQueryOptions": null,
"notificationContentType": null,
"lifecycleNotificationUrl": null,
"expirationDateTime": "2022-01-01T21:42:18.2257768Z",
"creatorId": "a4c7bd34-4f3b-46b7-a25d-b63c1e2a2842",
"includeResourceData": null,
"latestSupportedTlsVersion": "v1_2",
"encryptionCertificate": null,
"encryptionCertificateId": null,
"notificationUrlAppId": null
}
Beispiel 2: Erstellen eines Abonnements zum Abrufen von Änderungsbenachrichtigungen mit Ressourcendaten, wenn der Benutzer eine neue Nachricht erhält
Im folgenden Beispiel werden Benachrichtigungen mit Ressourcendaten für eine Nachricht abonniert, die im Postfach des Benutzers erstellt wird. Die Eigenschaften der Nachricht-Ressource, die in die Benachrichtigungsnutzlast eingeschlossen werden soll, werden mithilfe des $select
-Abfrageparameters angegeben.
Anforderung
POST https://graph.microsoft.com/v1.0/subscriptions
Content-type: application/json
{
"changeType": "created",
"notificationUrl": "https://webhook.azurewebsites.net/api/send/myNotifyClient",
"resource": "users/622eaaff-0683-4862-9de4-f2ec83c2bd98/messages?$select=Subject,bodyPreview,importance,receivedDateTime,from",
"expirationDateTime": "2022-01-01T21:42:18.2257768+00:00",
"clientState": "secretClientValue",
"includeResourceData": true,
"encryptionCertificate": "MIIDMzCCAhugAwIBAgIQE7D+++Dk1hKQBqWA==",
"encryptionCertificateId": "testCertificateId"
}
Antwort
Das folgende Beispiel zeigt die Antwort.
Hinweis: Das hier gezeigte Antwortobjekt kann zur besseren Lesbarkeit gekürzt werden.
HTTP/1.1 201 Created
Content-type: application/json
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#subscriptions/$entity",
"id": "178eec5f-cf3c-4e7e-8a9c-8640deb5b5c5",
"resource": "users/622eaaff-0683-4862-9de4-f2ec83c2bd98/messages?$select=Subject,bodyPreview,importance,receivedDateTime,from",
"applicationId": "507c3b9a-67b8-463d-88a2-15a8cefb2111",
"changeType": "created",
"clientState": "secretClientValue",
"notificationUrl": "https://webhook.azurewebsites.net/api/send/myNotifyClient",
"notificationQueryOptions": null,
"notificationContentType": null,
"lifecycleNotificationUrl": null,
"expirationDateTime": "2022-01-01T12:32:35.1582696Z",
"creatorId": "a4c7bd34-4f3b-46b7-a25d-b63c1e2a2842",
"includeResourceData": true,
"latestSupportedTlsVersion": "v1_2",
"encryptionCertificate": "MIIDMzCCAhugAwIBAgIQE7D+++Dk1hKQBqWA==",
"encryptionCertificateId": "testCertificateId",
"notificationUrlAppId": null
}
Beispiel 3: Erstellen eines Abonnements zum Abrufen von Änderungsbenachrichtigungen mit Ressourcendaten für eine Nachricht basierend auf einer Bedingung
Im folgenden Beispiel werden Benachrichtigungen mit Ressourcendaten für eine Nachricht abonniert, die im Ordner "Entwürfe" erstellt wird, die eine oder mehrere Anlagen enthält und von hoher Wichtigkeit ist.
Anforderung
POST https://graph.microsoft.com/v1.0/subscriptions
Content-type: application/json
{
"changeType": "created",
"notificationUrl": "https://webhook.azurewebsites.net/api/send/myNotifyClient",
"resource": "me/mailfolders('Drafts')/messages?$select=Subject,bodyPreview&$filter=hasAttachments eq true AND importance eq 'High'",
"expirationDateTime": "2022-01-01T21:42:18.2257768+00:00",
"clientState": "secretClientValue",
"includeResourceData": true,
"encryptionCertificate": "MIIDMzCCAhugAwIBAgIQE7D+++Dk1hKQBqWA==",
"encryptionCertificateId": "testCertificateId"
}
Antwort
Das folgende Beispiel zeigt die Antwort.
Hinweis: Das hier gezeigte Antwortobjekt kann zur besseren Lesbarkeit gekürzt werden.
HTTP/1.1 201 Created
Content-type: application/json
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#subscriptions/$entity",
"id": "239dbc5f-cf3c-4e7e-8c9c-3340abc5b5c5",
"resource": "me/mailfolders('Drafts')/messages?$select=Subject,bodyPreview&$filter=hasAttachments eq true AND importance eq 'High'",
"applicationId": "507c3b9a-67b8-463d-88a2-15a8cefb2111",
"changeType": "created",
"clientState": "secretClientValue",
"notificationUrl": "https://webhook.azurewebsites.net/api/send/myNotifyClient",
"notificationQueryOptions": null,
"notificationContentType": null,
"lifecycleNotificationUrl": null,
"expirationDateTime": "2022-01-20T12:32:35.1582696Z",
"creatorId": "a4c7bd34-4f3b-46b7-a25d-b63c1e2a2842",
"includeResourceData": true,
"latestSupportedTlsVersion": "v1_2",
"encryptionCertificate": "MIIDMzCCAhugAwIBAgIQE7D+++Dk1hKQBqWA==",
"encryptionCertificateId": "testCertificateId",
"notificationUrlAppId": null
}