Content
View differences
Updated by Klaus Zanders 15 days ago
**As a** user of meetings
**I want to** be able to respond to meetings in my calendar and see the results in OpenProject
**So that** everyone that has access to meeting can observe who will likely attend or rejected the meeting
* Add the incoming mail, if configured, as the author of the meeting
* Responses will be sent to that mail by the Groupware
* Try to extract information from that response
**Out of scope**
* Follow-up actions or notifcations when e.g., all users have rejected a meeting
# <hr />
Responses from different calendar applications applications:
## General observations
* All calendar handlers attach an ICS file
* The ICS File contains the entire meeting, but maybe in a different time information
* The `UID` can be used to find the proper occurence
* **UNKNOWN**: When responding to a single meeting of a series, does it properly handle the Recurrence ID
* The response email always only has one attendee, the one the response is for
* The response email has the state
* There are additional fields that can be part of the response
* Gmail: `X-NUM-GUESTS=0` as an attribute on `ATTENDEE`. Attendees can bring guests. I think we can ignore this
* Gmail: `X-RESPONSE-COMMENT="Declining with a reason"` as an attribute on `ATTENDEE`. Comment about the response coming from Gmail
* Outlook: `COMMENT` (but on the top level, not as part of the `ATTENDEE`). Comment about the response from Outlook
* Attendees can suggest a different time. In this case we get a complete new calendar with `METHOD:COUNTER`. I think we can also ignore this for now but should handle this later
## Requesting iCal
```icalendar ```ical
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//OpenProject GmbH//17.0.0.d41ae4922//Meeting//EN
CALSCALE:GREGORIAN
METHOD:REQUEST
REFRESH-INTERVAL;VALUE=DURATION:PT6H
BEGIN:VTIMEZONE
TZID:Etc/UTC
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20251024T123534Z
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
DTSTART;TZID=Etc/UTC:20251225T080000
DTEND;TZID=Etc/UTC:20251225T090000
CREATED:20251024T123240
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
LAST-MODIFIED:20251024T123240
LOCATION:Zoom Call
ORGANIZER;CN=OpenProject:mailto:SOMETHING@example.com
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
URL;VALUE=URI:http://localhost:3000/meetings/15
ATTENDEE;CN=Test;EMAIL=k.zanders@openproject.com;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT:mailto:k.zanders@openproject.com
END:VEVENT
END:VCALENDAR
```
## Open Xchange (OpenProject Mail)
* Attaches a `response.ics`
### Accept
```icalendar
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Open-Xchange//8.42.63//EN
METHOD:REPLY
X-OX-ITIP:1:eyJzZXJ2ZXJVaWQiOiJhNzY5YjY3ZS1mZjJjLTRkYWYtYWE0Zi0zNjA1NmJlMjQ
zNWEiLCJjb250ZXh0SWQiOjk1NDUzMCwiYWN0aW9uIjoiUkVQTFkiLCJzZW50QnlSZXNvdXJjZ
SI6LTF9
BEGIN:VTIMEZONE
TZID:Etc/UTC
LAST-MODIFIED:20250410T142247Z
TZURL:https://www.tzurl.org/zoneinfo-outlook/Etc/UTC
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20251024T124425Z
ATTENDEE;CN=Test Apple Calendar;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPANT;CUTY
PE=INDIVIDUAL;EMAIL=k.zanders@openproject.com:mailto:k.zanders@openproject
.com
CLASS:PUBLIC
CREATED:20251024T124413Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
DTEND;TZID=Etc/UTC:20251225T090000
DTSTART;TZID=Etc/UTC:20251225T080000
LAST-MODIFIED:20251024T124425Z
LOCATION:Zoom Call
ORGANIZER;CN=OpenProject;EMAIL=meetingresponse@example.com:mailto:meetingrespons
e@example.com
PRIORITY:0
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
URL:http://localhost:3000/meetings/15
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
END:VEVENT
END:VCALENDAR
```
### Switch to tentative:
```icalendar
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Open-Xchange//8.42.63//EN
METHOD:REPLY
X-OX-ITIP:1:eyJzZXJ2ZXJVaWQiOiJhNzY5YjY3ZS1mZjJjLTRkYWYtYWE0Zi0zNjA1NmJlMjQ
zNWEiLCJjb250ZXh0SWQiOjk1NDUzMCwiYWN0aW9uIjoiUkVQTFkiLCJzZW50QnlSZXNvdXJjZ
SI6LTF9
BEGIN:VTIMEZONE
TZID:Etc/UTC
LAST-MODIFIED:20250410T142247Z
TZURL:https://www.tzurl.org/zoneinfo-outlook/Etc/UTC
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20251024T124808Z
ATTENDEE;CN=Test Apple Calendar;PARTSTAT=TENTATIVE;ROLE=REQ-PARTICIPANT;CUT
YPE=INDIVIDUAL;EMAIL=k.zanders@openproject.com:mailto:k.zanders@openprojec
t.com
CLASS:PUBLIC
CREATED:20251024T124413Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
DTEND;TZID=Etc/UTC:20251225T090000
DTSTART;TZID=Etc/UTC:20251225T080000
LAST-MODIFIED:20251024T124808Z
LOCATION:Zoom Call
ORGANIZER;CN=OpenProject;EMAIL=meetingresponse@example.com:mailto:meetingrespons
e@example.com
PRIORITY:0
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
URL:http://localhost:3000/meetings/15
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
END:VEVENT
END:VCALENDAR
```
### Cancellation
```icalendar
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Open-Xchange//8.42.63//EN
METHOD:REPLY
X-OX-ITIP:1:eyJzZXJ2ZXJVaWQiOiJhNzY5YjY3ZS1mZjJjLTRkYWYtYWE0Zi0zNjA1NmJlMjQ
zNWEiLCJjb250ZXh0SWQiOjk1NDUzMCwiYWN0aW9uIjoiUkVQTFkiLCJzZW50QnlSZXNvdXJjZ
SI6LTF9
BEGIN:VTIMEZONE
TZID:Etc/UTC
LAST-MODIFIED:20250410T142247Z
TZURL:https://www.tzurl.org/zoneinfo-outlook/Etc/UTC
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20251024T124915Z
ATTENDEE;CN=Test Apple Calendar;PARTSTAT=DECLINED;ROLE=REQ-PARTICIPANT;CUTY
PE=INDIVIDUAL;EMAIL=k.zanders@openproject.com:mailto:k.zanders@openproject
.com
CLASS:PUBLIC
CREATED:20251024T124413Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
DTEND;TZID=Etc/UTC:20251225T090000
DTSTART;TZID=Etc/UTC:20251225T080000
LAST-MODIFIED:20251024T124915Z
LOCATION:Zoom Call
ORGANIZER;CN=OpenProject;EMAIL=meetingresponse@example.com:mailto:meetingrespons
e@example.com
PRIORITY:0
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
URL:http://localhost:3000/meetings/15
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
END:VEVENT
END:VCALENDAR
```
## Google Mail
* Attaches an `invite.ics`
### Accept
```icalendar
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REPLY
BEGIN:VEVENT
DTSTART:20251225T080000Z
DTEND:20251225T090000Z
DTSTAMP:20251024T130443Z
ORGANIZER;CN=OpenProject:mailto:meetingresponse@example.com
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;CN=Klaus
Zanders;X-NUM-GUESTS=0:mailto:klaus.zanders@gmail.com
URL:http://localhost:3000/meetings/15
CREATED:20251024T130009Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
LAST-MODIFIED:20251024T130443Z
LOCATION:Zoom Call
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
```
### Switch to tentative
```icalendar
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REPLY
BEGIN:VEVENT
DTSTART:20251225T080000Z
DTEND:20251225T090000Z
DTSTAMP:20251024T130443Z
ORGANIZER;CN=OpenProject:mailto:meetingresponse@example.com
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;CN=Klaus
Zanders;X-NUM-GUESTS=0:mailto:klaus.zanders@gmail.com
URL:http://localhost:3000/meetings/15
CREATED:20251024T130009Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
LAST-MODIFIED:20251024T130443Z
LOCATION:Zoom Call
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
```
### Decline
```icalendar
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REPLY
BEGIN:VEVENT
DTSTART:20251225T080000Z
DTEND:20251225T090000Z
DTSTAMP:20251024T131003Z
ORGANIZER;CN=OpenProject:mailto:meetingresponse@example.com
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=DECLINED;CN=Klaus
Zanders;X-NUM-GUESTS=0;X-RESPONSE-COMMENT="Declining with a reason":mailto:
klaus.zanders@gmail.com
URL:http://localhost:3000/meetings/15
CREATED:20251024T130009Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
LAST-MODIFIED:20251024T131003Z
LOCATION:Zoom Call
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
```
### Suggesting a different time
```icalendar
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:Microsoft Exchange Server 2010
VERSION:2.0
BEGIN:VTIMEZONE
TZID:UTC
BEGIN:STANDARD
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=ACCEPTED;CN=Klaus Zanders:mailto:klaus@LIVE.DE
COMMENT;LANGUAGE=de-DE:Das ist ein Kommentar zum Annehmen\n
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
SUMMARY;LANGUAGE=de-DE:Angenommen: Testmeeting
DTSTART;TZID=UTC:20251225T080000
DTEND;TZID=UTC:20251225T090000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20251024T134135Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION;LANGUAGE=de-DE:Zoom Call
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-OWNERAPPTID:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT
X-MICROSOFT-ISRESPONSEREQUESTED:FALSE
END:VEVENT
END:VCALENDAR
```
## Outlook (tested via live.com)
* Attaches a `No name.ics`
### Accept
```icalendar
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:Microsoft Exchange Server 2010
VERSION:2.0
BEGIN:VTIMEZONE
TZID:UTC
BEGIN:STANDARD
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=ACCEPTED;CN=Klaus Zanders:mailto:klaus@LIVE.DE
COMMENT;LANGUAGE=de-DE:Das ist ein Kommentar zum Annehmen\n
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
SUMMARY;LANGUAGE=de-DE:Angenommen: Testmeeting
DTSTART;TZID=UTC:20251225T080000
DTEND;TZID=UTC:20251225T090000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20251024T133727Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION;LANGUAGE=de-DE:Zoom Call
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-OWNERAPPTID:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT
X-MICROSOFT-ISRESPONSEREQUESTED:FALSE
END:VEVENT
END:VCALENDAR
```
### Tentative
```icalendar
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:Microsoft Exchange Server 2010
VERSION:2.0
BEGIN:VTIMEZONE
TZID:UTC
BEGIN:STANDARD
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=TENTATIVE;CN=Klaus Zanders:mailto:klaus@LIVE.DE
COMMENT;LANGUAGE=de-DE:\n
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
SUMMARY;LANGUAGE=de-DE:Mit Vorbehalt: Testmeeting
DTSTART;TZID=UTC:20251225T080000
DTEND;TZID=UTC:20251225T090000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20251024T133846Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION;LANGUAGE=de-DE:Zoom Call
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-OWNERAPPTID:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT
X-MICROSOFT-ISRESPONSEREQUESTED:FALSE
END:VEVENT
END:VCALENDAR
```
### Decline
```icalendar
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:Microsoft Exchange Server 2010
VERSION:2.0
BEGIN:VTIMEZONE
TZID:UTC
BEGIN:STANDARD
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=DECLINED;CN=Klaus Zanders:mailto:klaus@LIVE.DE
COMMENT;LANGUAGE=de-DE:\n
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
SUMMARY;LANGUAGE=de-DE:Abgelehnt: Testmeeting
DTSTART;TZID=UTC:20251225T080000
DTEND;TZID=UTC:20251225T090000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20251024T133946Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION;LANGUAGE=de-DE:Zoom Call
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-OWNERAPPTID:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT
X-MICROSOFT-ISRESPONSEREQUESTED:FALSE Calendar;EMAIL=k.zanders@openproject.com;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT:mailto:k.zanders@openproject.com
END:VEVENT
END:VCALENDAR
```
**I want to** be able to respond to meetings in my calendar and see the results in OpenProject
**So that** everyone that has access to meeting can observe who will likely attend or rejected the meeting
* Add the incoming mail, if configured, as the author of the meeting
* Responses will be sent to that mail by the Groupware
* Try to extract information from that response
**Out of scope**
* Follow-up actions or notifcations when e.g., all users have rejected a meeting
#
## General observations
* All calendar handlers attach an ICS file
* The ICS File contains the entire meeting, but maybe in a different time information
* The `UID` can be used to find the proper occurence
* **UNKNOWN**: When responding to a single meeting of a series, does it properly handle the Recurrence ID
* The response email always only has one attendee, the one the response is for
* The response email has the state
* There are additional fields that can be part of the response
* Gmail: `X-NUM-GUESTS=0` as an attribute on `ATTENDEE`. Attendees can bring guests. I think we can ignore this
* Gmail: `X-RESPONSE-COMMENT="Declining with a reason"` as an attribute on `ATTENDEE`. Comment about the response coming from Gmail
* Outlook: `COMMENT` (but on the top level, not as part of the `ATTENDEE`). Comment about the response from Outlook
* Attendees can suggest a different time. In this case we get a complete new calendar with `METHOD:COUNTER`. I think we can also ignore this for now but should handle this later
## Requesting iCal
```icalendar
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//OpenProject GmbH//17.0.0.d41ae4922//Meeting//EN
CALSCALE:GREGORIAN
METHOD:REQUEST
REFRESH-INTERVAL;VALUE=DURATION:PT6H
BEGIN:VTIMEZONE
TZID:Etc/UTC
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20251024T123534Z
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
DTSTART;TZID=Etc/UTC:20251225T080000
DTEND;TZID=Etc/UTC:20251225T090000
CREATED:20251024T123240
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
LAST-MODIFIED:20251024T123240
LOCATION:Zoom Call
ORGANIZER;CN=OpenProject:mailto:SOMETHING@example.com
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
URL;VALUE=URI:http://localhost:3000/meetings/15
ATTENDEE;CN=Test;EMAIL=k.zanders@openproject.com;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT:mailto:k.zanders@openproject.com
END:VEVENT
END:VCALENDAR
```
## Open Xchange (OpenProject Mail)
* Attaches a `response.ics`
### Accept
```icalendar
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Open-Xchange//8.42.63//EN
METHOD:REPLY
X-OX-ITIP:1:eyJzZXJ2ZXJVaWQiOiJhNzY5YjY3ZS1mZjJjLTRkYWYtYWE0Zi0zNjA1NmJlMjQ
zNWEiLCJjb250ZXh0SWQiOjk1NDUzMCwiYWN0aW9uIjoiUkVQTFkiLCJzZW50QnlSZXNvdXJjZ
SI6LTF9
BEGIN:VTIMEZONE
TZID:Etc/UTC
LAST-MODIFIED:20250410T142247Z
TZURL:https://www.tzurl.org/zoneinfo-outlook/Etc/UTC
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20251024T124425Z
ATTENDEE;CN=Test Apple Calendar;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPANT;CUTY
PE=INDIVIDUAL;EMAIL=k.zanders@openproject.com:mailto:k.zanders@openproject
.com
CLASS:PUBLIC
CREATED:20251024T124413Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
DTEND;TZID=Etc/UTC:20251225T090000
DTSTART;TZID=Etc/UTC:20251225T080000
LAST-MODIFIED:20251024T124425Z
LOCATION:Zoom Call
ORGANIZER;CN=OpenProject;EMAIL=meetingresponse@example.com:mailto:meetingrespons
e@example.com
PRIORITY:0
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
URL:http://localhost:3000/meetings/15
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
END:VEVENT
END:VCALENDAR
```
### Switch to tentative:
```icalendar
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Open-Xchange//8.42.63//EN
METHOD:REPLY
X-OX-ITIP:1:eyJzZXJ2ZXJVaWQiOiJhNzY5YjY3ZS1mZjJjLTRkYWYtYWE0Zi0zNjA1NmJlMjQ
zNWEiLCJjb250ZXh0SWQiOjk1NDUzMCwiYWN0aW9uIjoiUkVQTFkiLCJzZW50QnlSZXNvdXJjZ
SI6LTF9
BEGIN:VTIMEZONE
TZID:Etc/UTC
LAST-MODIFIED:20250410T142247Z
TZURL:https://www.tzurl.org/zoneinfo-outlook/Etc/UTC
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20251024T124808Z
ATTENDEE;CN=Test Apple Calendar;PARTSTAT=TENTATIVE;ROLE=REQ-PARTICIPANT;CUT
YPE=INDIVIDUAL;EMAIL=k.zanders@openproject.com:mailto:k.zanders@openprojec
t.com
CLASS:PUBLIC
CREATED:20251024T124413Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
DTEND;TZID=Etc/UTC:20251225T090000
DTSTART;TZID=Etc/UTC:20251225T080000
LAST-MODIFIED:20251024T124808Z
LOCATION:Zoom Call
ORGANIZER;CN=OpenProject;EMAIL=meetingresponse@example.com:mailto:meetingrespons
e@example.com
PRIORITY:0
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
URL:http://localhost:3000/meetings/15
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
END:VEVENT
END:VCALENDAR
```
### Cancellation
```icalendar
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Open-Xchange//8.42.63//EN
METHOD:REPLY
X-OX-ITIP:1:eyJzZXJ2ZXJVaWQiOiJhNzY5YjY3ZS1mZjJjLTRkYWYtYWE0Zi0zNjA1NmJlMjQ
zNWEiLCJjb250ZXh0SWQiOjk1NDUzMCwiYWN0aW9uIjoiUkVQTFkiLCJzZW50QnlSZXNvdXJjZ
SI6LTF9
BEGIN:VTIMEZONE
TZID:Etc/UTC
LAST-MODIFIED:20250410T142247Z
TZURL:https://www.tzurl.org/zoneinfo-outlook/Etc/UTC
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20251024T124915Z
ATTENDEE;CN=Test Apple Calendar;PARTSTAT=DECLINED;ROLE=REQ-PARTICIPANT;CUTY
PE=INDIVIDUAL;EMAIL=k.zanders@openproject.com:mailto:k.zanders@openproject
.com
CLASS:PUBLIC
CREATED:20251024T124413Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
DTEND;TZID=Etc/UTC:20251225T090000
DTSTART;TZID=Etc/UTC:20251225T080000
LAST-MODIFIED:20251024T124915Z
LOCATION:Zoom Call
ORGANIZER;CN=OpenProject;EMAIL=meetingresponse@example.com:mailto:meetingrespons
e@example.com
PRIORITY:0
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
URL:http://localhost:3000/meetings/15
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
END:VEVENT
END:VCALENDAR
```
## Google Mail
* Attaches an `invite.ics`
### Accept
```icalendar
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REPLY
BEGIN:VEVENT
DTSTART:20251225T080000Z
DTEND:20251225T090000Z
DTSTAMP:20251024T130443Z
ORGANIZER;CN=OpenProject:mailto:meetingresponse@example.com
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;CN=Klaus
Zanders;X-NUM-GUESTS=0:mailto:klaus.zanders@gmail.com
URL:http://localhost:3000/meetings/15
CREATED:20251024T130009Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
LAST-MODIFIED:20251024T130443Z
LOCATION:Zoom Call
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
```
### Switch to tentative
```icalendar
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REPLY
BEGIN:VEVENT
DTSTART:20251225T080000Z
DTEND:20251225T090000Z
DTSTAMP:20251024T130443Z
ORGANIZER;CN=OpenProject:mailto:meetingresponse@example.com
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;CN=Klaus
Zanders;X-NUM-GUESTS=0:mailto:klaus.zanders@gmail.com
URL:http://localhost:3000/meetings/15
CREATED:20251024T130009Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
LAST-MODIFIED:20251024T130443Z
LOCATION:Zoom Call
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
```
### Decline
```icalendar
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REPLY
BEGIN:VEVENT
DTSTART:20251225T080000Z
DTEND:20251225T090000Z
DTSTAMP:20251024T131003Z
ORGANIZER;CN=OpenProject:mailto:meetingresponse@example.com
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=DECLINED;CN=Klaus
Zanders;X-NUM-GUESTS=0;X-RESPONSE-COMMENT="Declining with a reason":mailto:
klaus.zanders@gmail.com
URL:http://localhost:3000/meetings/15
CREATED:20251024T130009Z
DESCRIPTION:Link to meeting: http://localhost:3000/meetings/15
LAST-MODIFIED:20251024T131003Z
LOCATION:Zoom Call
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Testmeeting
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
```
### Suggesting a different time
```icalendar
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:Microsoft Exchange Server 2010
VERSION:2.0
BEGIN:VTIMEZONE
TZID:UTC
BEGIN:STANDARD
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=ACCEPTED;CN=Klaus Zanders:mailto:klaus@LIVE.DE
COMMENT;LANGUAGE=de-DE:Das ist ein Kommentar zum Annehmen\n
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
SUMMARY;LANGUAGE=de-DE:Angenommen: Testmeeting
DTSTART;TZID=UTC:20251225T080000
DTEND;TZID=UTC:20251225T090000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20251024T134135Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION;LANGUAGE=de-DE:Zoom Call
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-OWNERAPPTID:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT
X-MICROSOFT-ISRESPONSEREQUESTED:FALSE
END:VEVENT
END:VCALENDAR
```
## Outlook (tested via live.com)
* Attaches a `No name.ics`
### Accept
```icalendar
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:Microsoft Exchange Server 2010
VERSION:2.0
BEGIN:VTIMEZONE
TZID:UTC
BEGIN:STANDARD
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=ACCEPTED;CN=Klaus Zanders:mailto:klaus@LIVE.DE
COMMENT;LANGUAGE=de-DE:Das ist ein Kommentar zum Annehmen\n
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
SUMMARY;LANGUAGE=de-DE:Angenommen: Testmeeting
DTSTART;TZID=UTC:20251225T080000
DTEND;TZID=UTC:20251225T090000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20251024T133727Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION;LANGUAGE=de-DE:Zoom Call
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-OWNERAPPTID:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT
X-MICROSOFT-ISRESPONSEREQUESTED:FALSE
END:VEVENT
END:VCALENDAR
```
### Tentative
```icalendar
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:Microsoft Exchange Server 2010
VERSION:2.0
BEGIN:VTIMEZONE
TZID:UTC
BEGIN:STANDARD
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=TENTATIVE;CN=Klaus Zanders:mailto:klaus@LIVE.DE
COMMENT;LANGUAGE=de-DE:\n
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
SUMMARY;LANGUAGE=de-DE:Mit Vorbehalt: Testmeeting
DTSTART;TZID=UTC:20251225T080000
DTEND;TZID=UTC:20251225T090000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20251024T133846Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION;LANGUAGE=de-DE:Zoom Call
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-OWNERAPPTID:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT
X-MICROSOFT-ISRESPONSEREQUESTED:FALSE
END:VEVENT
END:VCALENDAR
```
### Decline
```icalendar
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:Microsoft Exchange Server 2010
VERSION:2.0
BEGIN:VTIMEZONE
TZID:UTC
BEGIN:STANDARD
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T000000
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;PARTSTAT=DECLINED;CN=Klaus Zanders:mailto:klaus@LIVE.DE
COMMENT;LANGUAGE=de-DE:\n
UID:62581acb-519d-4d86-a3ee-331f26748311@localhost:3000
SUMMARY;LANGUAGE=de-DE:Abgelehnt: Testmeeting
DTSTART;TZID=UTC:20251225T080000
DTEND;TZID=UTC:20251225T090000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20251024T133946Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION;LANGUAGE=de-DE:Zoom Call
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-OWNERAPPTID:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT
X-MICROSOFT-ISRESPONSEREQUESTED:FALSE
END:VEVENT
END:VCALENDAR
```