Créer des événements Outlook dans un calendrier partagé ou délégué

Dans Outlook, les clients peuvent partager un calendrier avec d’autres utilisateurs, en permettant à ceux-ci d’y afficher, créer ou modifier des événements. Les clients peuvent également accorder à un délégué la possibilité d’agir en leur nom pour recevoir ou répondre aux demandes de réunion, ou créer ou modifier des éléments dans le calendrier.

Microsoft Graph prend en charge par programme la lecture ou l’écriture des événements dans les calendriers qui ont été partagés par d’autres utilisateurs, ainsi que la lecture des calendriers partagés et la mise à jour du nom des calendriers pour les destinataires du partage. La prise en charge s’applique également aux calendriers délégués. Le reste de cet article explique comment créer un événement de réunion dans un calendrier partagé ou délégué. Pour obtenir des événements, reportez-vous à Obtenir des événements Outlook dans un calendrier partagé ou délégué.

La procédure pas à pas ci-dessous repose sur un exemple de scénario dans lequel Alex a délégué son calendrier principal à Adele dans Outlook, et a conservé la configuration par défaut de la boîte aux lettres Outlook afin que les demandes et réponses de réunion soient uniquement dirigées vers les délégués. (Dans cette configuration, la propriété delegateMeetingMessageDeliveryOptions du paramètre mailboxSettings d’Alex est définie sur la valeur par défaut sendToDelegateOnly.)

La procédure pas à pas décrit quelques étapes ultérieures :

  1. Adele obtient le calendrier qu’Alex lui a délégué.
  2. Adele envoie une invitation à Christie et Megan au nom d’Alex.
  3. Christie reçoit la demande de réunion et inspecte l’événement associé dans son calenda
  4. Christie répond provisoirement à l’invitation.
  5. Adele reçoit le message de réponse de Christie.
  6. Alex examine les réponses des participants dans le cadre de l’événement.

Si Alex a partagé (et non délégué) son calendrier avec Adele :

  • Connectée en tant qu’Adele, une application peut obtenir le calendrier qu’Alex a partagé avec Adele
  • L’application peut utiliser les demandes et réponses des étapes 2 à 4 pour solliciter l’accès au calendrier partagé de la même façon que pour le calendrier délégué.
  • À l’étape 5, l’application peut se connecter sous le nom d’Alex, au lieu d’Adele, pour recevoir le message de réponse de Christie.

Étape 1 : Adele obtient le calendrier délégué

Connectez-vous sous le nom d’Adèle, obtenez les calendriers auxquels elle a accès et identifiez celui qu’Alex lui a été délégué afin de l’utiliser à l’étape suivante pour y créer un événement.

Autorisations Microsoft Graph

Utilisez les autorisations déléguées les moins privilégiées, Calendars.Read.Shared. Pour plus d’informations, consultez l’autorisation Calendars.Read.Shared dans la référence des autorisations.

GET https://graph.microsoft.com/v1.0/me/calendars

Notez qu’une réponse réussie inclut le code de réponse HTTP 200, le calendrier principal d’Adele et une copie du calendrier délégué par Alex dans la boîte aux lettres d’Adele, avec les propriétés suivantes :

  • canShare (peutPartager) est faux car Adele n’est qu’une déléguée et non la propriétaire du calendrier.
  • canEdit (peutModifier) est vrai car en tant que déléguée, Adele dispose d’un accès en écriture aux événements non privés du calendrier délégué.
  • owner (propriétaire) correspond à Alex Wilber, ce qui indique qu’il s’agit du calendrier d’Alex.
HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('d3b9214b-dd8b-441d-b7dc-c446c9fa0e69')/calendars",
    "value": [
        {
            "id": "AQMkADGkAAAJMjAAAAA==",
            "name": "Calendar",
            "color": "auto",
            "changeKey": "NDznl+Uh50WkanaCOKHkaQAAAAACXQ==",
            "canShare": true,
            "canViewPrivateItems": true,
            "canEdit": true,
            "owner": {
                "name": "Adele Vance",
                "address": "AdeleV@contoso.com"
            }
        },
        {
            "id": "AAMkADRpAABf0JlzAAA=",
            "name": "Alex Wilber",
            "color": "auto",
            "changeKey": "NDznl+Uh50WkanaCOKHkaQAAX8m4eQ==",
            "canShare": false,
            "canViewPrivateItems": false,
            "canEdit": true,
            "owner": {
                "name": "Alex Wilber",
                "address": "AlexW@contoso.com"
            }
        }
    ]
}

Remarque

Connecté en tant qu’Adele, vous pouvez également obtenir le calendrier délégué directement à partir de la boîte aux lettres d’Alex, en spécifiant l’identité d’Alex et le raccourci calendar , comme dans GET https://graph.microsoft.com/v1.0/users/AlexW@contoso.com/calendar. L’ID de calendrier renvoyé correspond uniquement à la boîte aux lettres d’Alex.

Étape 2 : Adele crée et envoie une invitation au nom d’Alex

Connectez-vous sous le nom d’Adele, utilisez l’ID de calendrier obtenu à l’étape 1 pour créer un événement dans le calendrier délégué et envoyez-le à Christie et Megan, au nom d’Alex.

Autorisations Microsoft Graph

Utilisez les autorisations déléguées les moins privilégiées, Calendars.ReadWrite.Shared. Pour plus d’informations, consultez Autorisation Calendars.ReadWrite.Shared dans la référence des autorisations.

POST https://graph.microsoft.com/v1.0/me/calendars/AAMkADRpAABf0JlzAAA=/events

Prefer: outlook.timezone="Pacific Standard Time"
Content-type: application/json

{
  "subject": "Christmas dinner",
  "body": {
    "contentType": "HTML",
    "content": "Happy holidays!"
  },
  "start": {
      "dateTime": "2019-12-25T18:00:00",
      "timeZone": "Pacific Standard Time"
  },
  "end": {
      "dateTime": "2019-12-25T22:00:00",
      "timeZone": "Pacific Standard Time"
  },
  "location":{
      "displayName":"Alex' home"
  },
  "attendees": [
    {
      "emailAddress": {
        "address":"meganb@contoso.com",
        "name": "Megan Bowen"
      },
      "type": "required"
    },
    {
      "emailAddress": {
        "address":"ChristieC@contoso.com",
        "name": "Christie Cline"
      },
      "type": "required"
    }
  ]
}
Snippet not available

Pour plus d’informations sur l’ajout du SDK à votre projet et la création d’un instance authProvider, consultez la documentation du Kit de développement logiciel (SDK).

Notez qu’une réponse réussie inclut le code de réponse HTTP 200 et les propriétés eventMessage (messageÉvénement) suivantes :

  • meetingMessageType (typeMessageRéunion) indique que ce message est meetingRequest.
  • sender (expéditeur) correspond à Adele.
  • from (de) correspond à Alex.
  • toRecipients (auxDestinataires) inclut Megan et Christie.

Et les propriétés d’événement suivantes :

  • attendees (participants) inclut Alex, Megan et Christie.
  • organizer (organisateur) correspond à Alex.

L’identité d’Adele apparaît uniquement dans la propriété sender (expéditeur) de l’entité eventMessage (messageÉvénement) et non dans l’événement associé.

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('662b947c-d9a1-4064-926c-eba1316d4462')/messages(microsoft.graph.eventMessage/event())/$entity",
    "@odata.type": "#microsoft.graph.eventMessage",
    "@odata.etag": "W/\"CwAAABYAAADK82uJYVo4RrFV3ADVj3fyAABZ378h\"",
    "id": "AAMkADADVj3fyAABZ5hYdAAA=",
    "createdDateTime": "2019-12-21T04:59:03Z",
    "lastModifiedDateTime": "2019-12-21T04:59:04Z",
    "changeKey": "CwAAABYAAADK82uJYVo4RrFV3ADVj3fyAABZ378h",
    "categories": [],
    "receivedDateTime": "2019-12-21T04:59:03Z",
    "sentDateTime": "2019-12-21T04:59:01Z",
    "hasAttachments": false,
    "internetMessageId": "<DM6PR17MB3593711A1C0A098167F5A977A12C0@DM6PR17MB3593.namprd17.prod.outlook.com>",
    "subject": "Christmas dinner",
    "bodyPreview": "Happy holidays!",
    "importance": "normal",
    "parentFolderId": "AQMkADIAAAIBDAAAAA==",
    "conversationId": "AAQkADNqQlzYAM8jQM=",
    "conversationIndex": "AdW3u1xx5S7TYrbluE2pCXNgAzyNAw==",
    "isDeliveryReceiptRequested": null,
    "isReadReceiptRequested": false,
    "isRead": true,
    "isDraft": false,
    "webLink": "https://outlook.office365.com/owa/?ItemID=AAMkADADVj3fyAABZ5hYdAAA%3D&exvsurl=1&viewmodel=ReadMessageItem",
    "inferenceClassification": "focused",
    "meetingMessageType": "meetingRequest",
    "body": {
        "contentType": "html",
        "content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=us-ascii\">\r\n</head>\r\n<body>\r\nHappy holidays!\r\n</body>\r\n</html>\r\n"
    },
    "sender": {
        "emailAddress": {
            "name": "Adele Vance",
            "address": "AdeleV@contoso.com"
        }
    },
    "from": {
        "emailAddress": {
            "name": "Alex Wilber",
            "address": "AlexW@contoso.com"
        }
    },
    "toRecipients": [
        {
            "emailAddress": {
                "name": "Megan Bowen",
                "address": "MeganB@contoso.com"
            }
        },
        {
            "emailAddress": {
                "name": "Christie Cline",
                "address": "ChristieC@contoso.com"
            }
        }
    ],
    "ccRecipients": [],
    "bccRecipients": [],
    "replyTo": [],
    "flag": {
        "flagStatus": "notFlagged"
    },
    "event": {
        "@odata.etag": "W/\"yvNriWFaOEaxVdwA1Y938gAAX+T7Jg==\"",
        "id": "AAMkADADVj3fyAABZ5ieyAAA=",
        "createdDateTime": "2019-12-21T04:59:03.4336242Z",
        "lastModifiedDateTime": "2019-12-27T01:38:32.3766961Z",
        "changeKey": "yvNriWFaOEaxVdwA1Y938gAAX+T7Jg==",
        "categories": [],
        "originalStartTimeZone": "Pacific Standard Time",
        "originalEndTimeZone": "Pacific Standard Time",
        "iCalUId": "040000008200FEFE0BA532444B5FD89BDE22BA103",
        "reminderMinutesBeforeStart": 15,
        "isReminderOn": true,
        "hasAttachments": false,
        "subject": "Christmas dinner",
        "bodyPreview": "Happy holidays!",
        "importance": "normal",
        "sensitivity": "normal",
        "isAllDay": false,
        "isCancelled": false,
        "isOrganizer": false,
        "responseRequested": true,
        "seriesMasterId": null,
        "showAs": "tentative",
        "type": "singleInstance",
        "webLink": "https://outlook.office365.com/owa/?itemid=AAMkADADVj3fyAABZ5ieyAAA%3D&exvsurl=1&path=/calendar/item",
        "onlineMeetingUrl": null,
        "recurrence": null,
        "responseStatus": {
            "response": "none",
            "time": "2019-12-21T05:16:48.8931825Z"
        },
        "body": {
            "contentType": "html",
            "content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=us-ascii\">\r\n</head>\r\n<body>\r\nHappy holidays!\r\n</body>\r\n</html>\r\n"
        },
        "start": {
            "dateTime": "2019-12-26T02:00:00.0000000",
            "timeZone": "UTC"
        },
        "end": {
            "dateTime": "2019-12-26T06:00:00.0000000",
            "timeZone": "UTC"
        },
        "location": {
            "displayName": "Alex' home",
            "locationType": "default",
            "uniqueId": "Alex' home",
            "uniqueIdType": "private"
        },
        "locations": [
            {
                "displayName": "Alex' home",
                "locationType": "default",
                "uniqueId": "1396aaf3-e344-4567-a4e3-797557ec24c8",
                "uniqueIdType": "locationStore"
            }
        ],
        "attendees": [
            {
                "type": "required",
                "status": {
                    "response": "none",
                    "time": "0001-01-01T00:00:00Z"
                },
                "emailAddress": {
                    "name": "Alex Wilber",
                    "address": "AlexW@contoso.com"
                }
            },
            {
                "type": "required",
                "status": {
                    "response": "none",
                    "time": "0001-01-01T00:00:00Z"
                },
                "emailAddress": {
                    "name": "Megan Bowen",
                    "address": "MeganB@contoso.com"
                }
            },
            {
                "type": "required",
                "status": {
                    "response": "none",
                    "time": "0001-01-01T00:00:00Z"
                },
                "emailAddress": {
                    "name": "Christie Cline",
                    "address": "ChristieC@contoso.com"
                }
            }
        ],
        "organizer": {
            "emailAddress": {
                "name": "Alex Wilber",
                "address": "AlexW@contoso.com"
            }
        }
    }
}

Étape 4 : Christie répond à la demande de réunion

Connectez-vous sous le nom de Christie, répondez à l’événement de façon provisoire et incluez un message de réponse dans la réponse :

Autorisations Microsoft Graph

Utilisez les autorisations déléguées les moins privilégiées, Calendars.ReadWrite.Shared. Pour plus d’informations, consultez Autorisation Calendars.ReadWrite.Shared dans la référence des autorisations.

POST https://graph.microsoft.com/v1.0/me/events/AAMkADADVj3fyAABZ5ieyAAA=/tentativelyAccept
Content-type: application/json

{
  "comment": "I will probably be able to make it.",
  "sendResponse": true
}

Une réponse réussie renvoie HTTP 202 Accepté.

HTTP/1.1 202 Accepted

Étape 5 : Adele reçoit le message de réponse

Étant donné qu’Adele est une déléguée du calendrier principal d’Alex, elle reçoit toutes les réponses de réunion associées à ce calendrier au nom d’Alex.

Connectez-vous sous le nom d’Adèle et obtenez eventMessage correspondant à la réponse de Christie de l’étape 4.

Autorisations Microsoft Graph

Utilisez les autorisations déléguées les moins privilégiées, Mail.Read.Shared. Pour plus d’informations, consultez Autorisation Mail.Read.Shared dans la référence des autorisations.

GET https://graph.microsoft.com/v1.0/me/messages/AAMkADI4oeRpAABf0HJUAAA=

Notez qu’une réponse réussie inclut le code de réponse HTTP 200 et les propriétés eventMessage (messageÉvénement) suivantes :

  • meetingMessageType (typeMessageRéunion) correspond à meetingTenativelyAccepted.
  • from (de) correspond à Christie.
  • toRecipients (auxDestinataires) inclut uniquement Adele, mais pas le propriétaire du calendrier, Alex. Cela est dû au fait qu’Alex a conservé la configuration par défaut de façon à ce qu’Outlook dirige toutes les réponses de réunion vers les délégués uniquement.
HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('d3b9214b-dd8b-441d-b7dc-c446c9fa0e69')/messages/$entity",
    "@odata.type": "#microsoft.graph.eventMessage",
    "@odata.etag": "W/\"DAAAABYAAAA0POeX5SHnRaRqdoI4oeRpAABfybkT\"",
    "id": "AAMkADI4oeRpAABf0HJUAAA=",
    "createdDateTime": "2019-12-21T05:16:55Z",
    "lastModifiedDateTime": "2019-12-21T05:16:57Z",
    "changeKey": "DAAAABYAAAA0POeX5SHnRaRqdoI4oeRpAABfybkT",
    "categories": [],
    "receivedDateTime": "2019-12-21T05:16:56Z",
    "sentDateTime": "2019-12-21T05:16:49Z",
    "hasAttachments": false,
    "internetMessageId": "<86880ccb8ec64184996e46eaddaed279@DM6PR17MB3593.namprd17.prod.outlook.com>",
    "subject": "Tentative: Christmas dinner",
    "bodyPreview": "I will probably be able to make it.",
    "importance": "normal",
    "parentFolderId": "AQMkAD5GkAAAIBDAAAAA==",
    "conversationId": "AAQkADK25bhNqQlzYAM8jQM=",
    "conversationIndex": "AdW3u1xx5S7TYrbluE2pCXNgAzyNAwAAoBoZ",
    "isDeliveryReceiptRequested": null,
    "isReadReceiptRequested": false,
    "isRead": false,
    "isDraft": false,
    "webLink": "https://outlook.office365.com/owa/?ItemID=AAMkADI4oeRpAABf0HJUAAA%3D&exvsurl=1&viewmodel=ReadMessageItem",
    "inferenceClassification": "focused",
    "meetingMessageType": "meetingTenativelyAccepted",
    "body": {
        "contentType": "html",
        "content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=us-ascii\">\r\n</head>\r\n<body>\r\nI will probably be able to make it.\r\n</body>\r\n</html>\r\n"
    },
    "sender": {
        "emailAddress": {
            "name": "Christie Cline",
            "address": "ChristieC@contoso.com"
        }
    },
    "from": {
        "emailAddress": {
            "name": "Christie Cline",
            "address": "ChristieC@contoso.com"
        }
    },
    "toRecipients": [
        {
            "emailAddress": {
                "name": "Adele Vance",
                "address": "AdeleV@contoso.com"
            }
        }
    ],
    "ccRecipients": [],
    "bccRecipients": [],
    "replyTo": [],
    "flag": {
        "flagStatus": "notFlagged"
    }
}

Étape 6 : Alex accède aux réponses dans le cadre de l’événement

Comme Alex a conservé la configuration par défaut de façon à ce qu’Outlook dirige toutes les demandes et réponses de réunion vers les délégués uniquement, il ne reçoit pas la réponse de Christie de l’étape 4. Il peut toutefois obtenir la réponse via l’événement de son calendrier principal.

Connectez-vous sous le nom d’Alex, obtenez l’événement qu’Adele créé à l’étape 2 et obtenez les réponses à partir de la propriété participants.

Autorisations Microsoft Graph

Utilisez les autorisations déléguées les moins privilégiées, Calendars.Read. Pour plus d’informations, consultez Autorisation Calendars.Read dans la référence des autorisations.

GET https://graph.microsoft.com/v1.0/me/calendar/events/AAMkADJXJGu0AABf02qwAAA=

Notez qu’une réponse réussie inclut le code de réponse HTTP 200 et les propriétés d’événement suivantes :

  • isOrganizer (estOrganisateur) est vrai.
  • attendees (participants) inclut uniquement Megan et Christie.
  • La propriété status (état) de chaque instance de attendee (participant) indique la réponse du participant :
    • La réponse de Megan est none.
    • La réponse de Christie est tentativelyAccepted.
  • organizer (organisateur) correspond à Alex.
  • L’absence de propriété dans l’événement renvoyé indique le délégué, Adele.
HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('64339082-ed84-4b0b-b4ab-004ae54f3747')/calendars('AQMkADAw7QAAAJfygAAAA%3D%3D')/events/$entity",
    "@odata.etag": "W/\"NEXywgsVrkeNsFsyVyRrtAAAX8xuhA==\"",
    "id": "AAMkADJXJGu0AABf02qwAAA=",
    "createdDateTime": "2019-12-21T04:59:01.4435895Z",
    "lastModifiedDateTime": "2019-12-21T05:16:54.689345Z",
    "changeKey": "NEXywgsVrkeNsFsyVyRrtAAAX8xuhA==",
    "categories": [],
    "originalStartTimeZone": "Pacific Standard Time",
    "originalEndTimeZone": "Pacific Standard Time",
    "iCalUId": "040000008200FEFE0BA532444B5FD89BDE22BA103",
    "reminderMinutesBeforeStart": 15,
    "isReminderOn": true,
    "hasAttachments": false,
    "subject": "Christmas dinner",
    "bodyPreview": "Happy holidays!",
    "importance": "normal",
    "sensitivity": "normal",
    "isAllDay": false,
    "isCancelled": false,
    "isOrganizer": true,
    "responseRequested": true,
    "seriesMasterId": null,
    "showAs": "busy",
    "type": "singleInstance",
    "webLink": "https://outlook.office365.com/owa/?itemid=AAMkADJXJGu0AABf02qwAAA%3D&exvsurl=1&path=/calendar/item",
    "onlineMeetingUrl": null,
    "recurrence": null,
    "responseStatus": {
        "response": "organizer",
        "time": "0001-01-01T00:00:00Z"
    },
    "body": {
        "contentType": "html",
        "content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=us-ascii\">\r\n</head>\r\n<body>\r\nHappy holidays!\r\n</body>\r\n</html>\r\n"
    },
    "start": {
        "dateTime": "2019-12-26T02:00:00.0000000",
        "timeZone": "UTC"
    },
    "end": {
        "dateTime": "2019-12-26T06:00:00.0000000",
        "timeZone": "UTC"
    },
    "location": {
        "displayName": "Alex' home",
        "locationType": "default",
        "uniqueId": "Alex' home",
        "uniqueIdType": "private"
    },
    "locations": [
        {
            "displayName": "Alex' home",
            "locationType": "default",
            "uniqueId": "Alex' home",
            "uniqueIdType": "private"
        }
    ],
    "attendees": [
        {
            "type": "required",
            "status": {
                "response": "none",
                "time": "0001-01-01T00:00:00Z"
            },
            "emailAddress": {
                "name": "Megan Bowen",
                "address": "MeganB@contoso.com"
            }
        },
        {
            "type": "required",
            "status": {
                "response": "tentativelyAccepted",
                "time": "2019-12-21T05:16:48.8931825Z"
            },
            "emailAddress": {
                "name": "Christie Cline",
                "address": "ChristieC@contoso.com"
            }
        }
    ],
    "organizer": {
        "emailAddress": {
            "name": "Alex Wilber",
            "address": "AlexW@contoso.com"
        }
    }
}