I'm writing a system in Python that is using the icalendar library to generate ical invites. Those work fantastically, but if I try to send out a cancellation Outlook just displays the dreaded "not supported calendar message.ics". I originally had this issue with the invite, but solved it by fixing my date formatting.
Here is the initial invite:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//myapp//myapp.example.com//
METHOD:REQUEST
BEGIN:VEVENT
SUMMARY:Weekly Review Meeting
DTSTART;VALUE=DATE-TIME:20200331T190000Z
DTEND;VALUE=DATE-TIME:20200331T200000Z
DTSTAMP;VALUE=DATE-TIME:20200325T193007Z
UID:1#myapp
SEQUENCE:0
ATTENDEE:me#example.com
CATEGORY:EVENT
CLASS:PUBLIC
DESCRIPTION:bla bla
LOCATION:Webex
ORGANIZER:donotreply#example.com
PRIORITY:5
STATUS:CONFIRMED
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:REMINDER
TRIGGER;RELATED=START:-PT15M
END:VALARM
END:VEVENT
END:VCALENDAR
And then the cancellation:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//myapp//myapp.example.com//
METHOD:CANCEL
BEGIN:VEVENT
SUMMARY:Weekly Review Meeting
DTSTART;VALUE=DATE-TIME:20200331T190000Z
DTEND;VALUE=DATE-TIME:20200331T200000Z
DTSTAMP;VALUE=DATE-TIME:20200325T193011Z
UID:1#myapp
SEQUENCE:1
ATTENDEE:me#example.com
CATEGORY:EVENT
CLASS:PUBLIC
DESCRIPTION:
LOCATION:Webex
ORGANIZER:donotreply#example.com
PRIORITY:5
STATUS:CANCELLED
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:REMINDER
TRIGGER;RELATED=START:-PT15M
END:VALARM
END:VEVENT
END:VCALENDAR
The same code generates both and sets the METHOD and STATUS differently (DESCRIPTION also differs). I send a SEQUENCE of 0 for the invite and 1 for the cancellation. The UIDs are always consistent between the matching pair. What am I missing?
I ended up solving this myself. I will share my learnings for posterity.
The MIME type in the email needs to be set with method=CANCEL as well. This was ultimately my issue. method in the MIME type needs to match METHOD in the ical file and both are required for Outlook to process it correctly.
SEQUENCE should not be incremented for cancellation, just for update.
I also updated all addresses (ORGANIZER and ATTENDEE) to include mailto:, but this does not appear to be strictly necessary.
I'm facing issue wherein google calendar is showing extra calendar event.
ICS
PRODID:-//TEST//NONSGML Version 1//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VTIMEZONE
TZID:Asia/Kolkata
BEGIN:DAYLIGHT
DTSTART:19411001T000000
TZOFFSETFROM:+055320
TZOFFSETTO:+0630
RDATE:19411001T000000
END:DAYLIGHT
BEGIN:DAYLIGHT
DTSTART:18800101T000000
TZOFFSETFROM:+055328
TZOFFSETTO:+055320
RDATE:18800101T000000
END:DAYLIGHT
BEGIN:DAYLIGHT
DTSTART:19420901T000000
TZOFFSETFROM:+0530
TZOFFSETTO:+0630
RDATE:19420901T000000
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:19420515T000000
TZOFFSETFROM:+0630
TZOFFSETTO:+0530
RDATE:19420515T000000
RDATE:19451015T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:19700119T063633Z
ORGANIZER:mailto:invite#a.com
UID:3fDJ2_gx5QJr4ygb#EqPBCMSzkxGfKg0
SEQUENCE:0
RRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYDAY=SU,FR,SA
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;RSVP=TRUE:mailto:a#gmail.com
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;RSVP=TRUE:mailto:a#b.com
DTSTART;TZID=Asia/Kolkata:20200114T150000
DTEND;TZID=Asia/Kolkata:20200114T160000
SUMMARY:DEV TEST
TRANSP:OPAQUE
CREATED:20200114T091621Z
LAST-MODIFIED:20200114T091621Z
STATUS:CONFIRMED
LOCATION:Location
DESCRIPTION:Description
END:VEVENT
END:VCALENDAR
Calendar is created on wednesday for never ending weekly recurrence on days Friday, Saturday and Sunday. In google calendar I'm observing that there is an extra event created for wednesday(created date) including the recurrence events. I'm not observing this issue in outlook calendar.
Any idea why there is an extra event for the event create date created only in google calendar and not observed in outlook calendar.
I think this is due to different interpretations of the iCalendar specification:
https://www.rfc-editor.org/rfc/rfc5545#section-3.8.5.3
Particularly this section:
The "DTSTART" property defines the first instance in the recurrence
set. The "DTSTART" property value SHOULD be synchronized with the
recurrence rule, if specified. The recurrence set generated with a
"DTSTART" property value not synchronized with the recurrence rule is
undefined.
So the RFC doesn't define what happens when the DTSTART doesn't match the recurrence rule, and likely Google and Microsoft took different approaches.
To avoid this ensure your DTSTART occurs on a Friday, Saturday or Sunday.
I am trying to implement external appointment management (using VCAL2) - namely CREATE, UPDATE and CANCEL appointment - and I need it to work with Lotus Notes (and possibly in MS Outlook).
My VCAL2 files are in my opinion correct (RFC 5545), and CREATE and UPDATE actually works well. Problem is only with CANCEL and only in MS Outlook and Lotus Notes - they seem to ignore the cancellation request.
CREATE.ics
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//myprod//ical-poc//SK
METHOD:PUBLISH
X-WR-RELCALID:5EF979C9-3764-4B55-93B8-3BB00DFA176C#uniq.id
X-PUBLISHED-TTL:P1W
BEGIN:VEVENT
UID:5EF979C9-3764-4B55-93B8-3BB00DFA176C#uniq.id
DTSTART;TZID=Europe/Bratislava:20150701T090000
SEQUENCE:0
TRANSP:OPAQUE
STATUS:CONFIRMED
DTEND;TZID=Europe/Bratislava:20150701T093000
SUMMARY:CREATED
ATTENDEE:mailto:valid#email.xxx
DESCRIPTION:Event description.
ORGANIZER:mailto:cal-poc#domain.com
DTSTAMP:20150630T182305Z
END:VEVENT
END:VCALENDAR
UPDATE.ics
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//myprod//ical-poc//SK
METHOD:REQUEST
X-WR-RELCALID:5EF979C9-3764-4B55-93B8-3BB00DFA176C#uniq.id
X-PUBLISHED-TTL:P1W
BEGIN:VEVENT
UID:5EF979C9-3764-4B55-93B8-3BB00DFA176C#uniq.id
DTSTART;TZID=Europe/Bratislava:20150701T110000
SEQUENCE:1
TRANSP:OPAQUE
STATUS:CONFIRMED
DTEND;TZID=Europe/Bratislava:20150701T113000
SUMMARY:UPDATED+2
ATTENDEE:mailto:valid#email.xxx
DESCRIPTION:Event description.
ORGANIZER:mailto:cal-poc#domain.com
DTSTAMP:20150630T182428Z
END:VEVENT
END:VCALENDAR
CANCEL.ics
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//myprod//ical-poc//SK
METHOD:CANCEL
X-WR-RELCALID:5EF979C9-3764-4B55-93B8-3BB00DFA176C#uniq.id
X-PUBLISHED-TTL:P1W
BEGIN:VEVENT
UID:5EF979C9-3764-4B55-93B8-3BB00DFA176C#uniq.id
DTSTART;TZID=Europe/Bratislava:20150701T110000
SEQUENCE:1
TRANSP:OPAQUE
STATUS:CANCELLED
DTEND;TZID=Europe/Bratislava:20150701T113000
SUMMARY:CREATED+2
ATTENDEE:mailto:valid#email.xxx
DESCRIPTION:Event description.
ORGANIZER:mailto:cal-poc#domain.com
DTSTAMP:20150630T182457Z
END:VEVENT
END:VCALENDAR
As almost always, answering my question (it seems, posting it on S/O gives me some superpowers to find an answer in the next few hours).
It seems, there are multiple combinations of properties in iCal format, that form the valid file for each client. Following is my analysis of it (please note, it does not support RSVPs, but RSVPs only require few more tweaks to the file like slightly different methods etc. and the point of the question was cancellation):
CREATE & UPDATE APPOINTMENT
All Applications:
METHOD must be PUBLISH
DTSTART and DTEND (or DURATION) present
SEQUENCE must be incremented on each update
ORGANIZER must be present
UID must be present
X-WR-RELCALID for Outlook must be present and equal to UID
PRODID must be present
STATUS should be CONFIRMED
CANCEL
All Applications:
STATUS must be CANCELLED
all other fields as above
Apple Calendar:
METHOD must be PUBLISH (or actually, must not be CANCEL)
DURATION (or DTEND) must be present
Microsoft Outlook:
METHOD must be CANCEL
DURATION (or DTEND) MUST NOT be present
Lotus Notes:
METHOD must be CANCEL
DURATION (or DTEND) must be present
Is there a way for me to delete items from calendar by using iCalendar import?
I know that there is a METHOD:CANCEL, however when I tried it, it didn't do anything to the calendar event.
Here is what is in my iCalendar file. When I try to import it to Outlook, it just adds these events.
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//DDay.iCal//NONSGML ddaysoftware.com//EN
METHOD:CANCEL
BEGIN:VEVENT
CREATED:20081210T155315Z
DESCRIPTION:
DTEND:20081213T093000
DTSTAMP:20081210T155315Z
DTSTART:20081213T093000
LOCATION:
ORGANIZER:MAILTO:user#domain.com
SEQUENCE:1
SUMMARY:From FCS 13th
UID:20367b86-2123-4930-87ef-5c2a6626bd9f
BEGIN:VALARM
ACTION:DISPLAY
SUMMARY: Event 13th
TRIGGER:-PT30M
END:VALARM
END:VEVENT
BEGIN:VEVENT
CREATED:20081210T155315Z
DESCRIPTION:
DTEND:20081211T093000
DTSTAMP:20081210T155315Z
DTSTART:20081211T093000
LOCATION:7 West
ORGANIZER:MAILTO:user#domain.com
SEQUENCE:1
SUMMARY:Event 11th
UID:f212ab15-86c3-46c8-8592-af0716a40ea2
BEGIN:VALARM
ACTION:DISPLAY
SUMMARY:Event on 11th
TRIGGER:-PT30M
END:VALARM
END:VEVENT
END:VCALENDAR
I forgot to add STATUS:CANCELLED
Now this should cancel items according to http://en.wikipedia.org/wiki/ICalendar#Events_.28VEVENT.29
This works in Google Calendar but not in Outlook 2003. Outlook still creates duplicate entries.
Here are modified "cancel" events with 'STATUS:CANCELLED'. (British spelling with two L's)
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//DDay.iCal//NONSGML ddaysoftware.com//EN
X-WR-RELCALID:928C8448-048A-4aa2-BE27-A920773AF3DC
METHOD:CANCEL
BEGIN:VEVENT
CREATED:20081210T210344Z
DESCRIPTION:
DTEND:20081213T093000
DTSTAMP:20081210T210344Z
DTSTART:20081213T093000
LOCATION:
ORGANIZER:MAILTO:user#domain.com
SEQUENCE:1
STATUS:CANCELLED
SUMMARY:Event to export 1
UID:20367b86-2123-4930-87ef-5c2a6626bd9f
BEGIN:VALARM
ACTION:DISPLAY
SUMMARY:Event to export 1
TRIGGER:-PT30M
END:VALARM
END:VEVENT
BEGIN:VEVENT
CREATED:20081210T210344Z
DESCRIPTION:
DTEND:20081211T093000
DTSTAMP:20081210T210344Z
DTSTART:20081211T093000
LOCATION:7 West
ORGANIZER:MAILTO:user#domain.com
SEQUENCE:1
STATUS:CANCELLED
SUMMARY:Event to export 2
UID:f212ab15-86c3-46c8-8592-af0716a40ea2
BEGIN:VALARM
ACTION:DISPLAY
SUMMARY:Event to export 2
TRIGGER:-PT30M
END:VALARM
END:VEVENT
END:VCALENDAR
I was struggling with this for a while.
As a few others have mentioned you must include the:
METHOD:CANCEL
and
STATUS:CANCELLED
lines of the VEVENT. The UID must be the same as the original event AND the SEQUENCE: number must be the CURRENT sequence number! (you do not need to add 1 from the last sequence number as cancelling the event does not count as an update).
I was having issues as I assumed that the cancellation counted as an update and was therefore incrementing my sequence number, but you do not have to!
This answer is meant for iCal URL feeds not for importing an iCal file!
I looked into this for quite a while and since the answer given doesn't actually resolve the issue for outlook I thought I would post what I have found to work for Outlook, iCal, and Google Calendar.
You just simply do not send the event, if the event is outright just not in the feed anymore then Outlook, Google Calendar, and iCal (from my testing) all just remove the event as if it never existed. So if the event has been cancelled just pretend it never existed and when the local calendars sync they will show events that are explicitly given to them in the feed.
This can be a painful and unpredictable business, and is likely dependent on Outlook version. I have got event cancellations working with Outlook 2010 (v14). I send my icalendar as a single-part message, type text/calendar, as discussed in this thread. As mentionned in the other answers, I have method=CANCEL in the MIME type, and again in the icalendar.
The critical step for me was to add DTSTART to the event. Without this field, the message is not presented as a cancellation, there is nothing in the preview pane, and the calendar is presented as an attachment with the filename "not supported calendar message.ics". But you can put any date you like in the field! DTEND is not important. SEQUENCE could be the same or greater. DTSTAMP is not important, but if present, must be after the DTSTAMP sent with the initial invitation, otherwise the text "not active" appears instead of the "delete from calendar" button.
This is a minimal working cancellation...
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//www.notilus.com//Dimo Gestion Notilus//FR
CALSCALE:GREGORIAN
METHOD:CANCEL
BEGIN:VEVENT
DTSTART:20140625T123000Z
SEQUENCE:1
STATUS:CANCELLED
UID:Kerry
END:VEVENT
END:VCALENDAR
I might need to set X-WR-RELCALID tag, according to this http://www.oesf.org/forum/index.php?act=Print&client=printer&f=63&t=2650
It states: "Before syncing for the first time, you MUST add a X-WR-RELCALID tag to the mycalendar.ics file, or else iCal will change the UID number of all entries, causing duplicates."
However I can't find any documentation on RELCALID tag in protocol https://www.rfc-editor.org/rfc/rfc2446
When I set X-WR-RELCALID, Outlook still creates duplicate events instead of removing those events.
Is there any documentation on X-WR-RELCALID? I can't find it.
I donĀ“t know if this helps, try setting SEQUENCE: 2
For me it worked by setting the X-WR-RELCALID tag in the header of the ics file. Then Outlook recognized the event as the same.
Outlook creates a duplicate event if you change the UID property.
You have to create another event with the same UID.
You should do these steps to delete the calendar event
UID must be same
Add METHOD:CANCEL
Add STATUS:CANCELLED
SEQUENCE must be greater than the created event
There is a previous thread with this question, and hints at an answer, but I could not get it to work.
I have an ICS file. It validates. It looks like this:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//WA//FRWEB//EN
BEGIN:VEVENT
UID:FRICAL201
SEQUENCE:0
DTSTAMP:20081108T151809Z
DTSTART:20081109T121200
SUMMARY:11/9/2008 12:12:00 PM TRIP FROM JFK AIRPORT (JFK)
LOCATION:JFK AIRPORT (JFK)
END:VEVENT
END:VCALENDAR
I double-click it and it goes into Outlook 2007 perfectly.
Then, I double-click another ICS file that looks like this:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//WA//FRWEB//EN
BEGIN:VEVENT
METHOD:REQUEST
UID:FRICAL201
SEQUENCE:1
DTSTAMP:20081108T161809Z
DTSTART:20081109T121300
SUMMARY:11/9/2008 12:13:00 PM TRIP FROM JFK AIRPORT (JFK)
LOCATION:JFK AIRPORT (JFK)
END:VEVENT
END:VCALENDAR
As explained in the rfc, the UID is the same and the sequence number is one greater, so I expect outlook to update my previous event entry, but all it does is insert a second one.
How can I formulate the ICS file so that Outlook knows to update the event? The original poster in the thread I referenced above said he got it to respond with METHOD and ORGANIZER but in my experience METHOD has no effect and ORGANIZER causes undesirable behavior where Outlook wants to email the event to someone. I just want it to update the calendar.
I got a hold of Tom Carter, the guy who started the original thread. He had a working example with a request followed by a cancellation. What I had wrong was my METHOD was inside my VEVENT when it should have been outside. So here is a working update!
Original:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//WA//FRWEB//EN
METHOD:REQUEST
BEGIN:VEVENT
UID:FRICAL201
SEQUENCE:0
DTSTAMP:20081108T151809Z
ORGANIZER:donotreply#test.com
DTSTART:20081109T121200
SUMMARY:11/9/2008 12:12:00 PM TRIP FROM JFK AIRPORT (JFK)
LOCATION:JFK AIRPORT (JFK)
END:VEVENT
END:VCALENDAR
Update:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//WA//FRWEB//EN
METHOD:REQUEST
BEGIN:VEVENT
UID:FRICAL201
SEQUENCE:1
DTSTAMP:20081108T161809Z
ORGANIZER:donotreply#test.com
DTSTART:20081109T121300
SUMMARY:11/9/2008 12:13:00 PM TRIP FROM JFK AIRPORT (JFK)
LOCATION:JFK AIRPORT (JFK)
END:VEVENT
END:VCALENDAR
All I did was add the request method (in the correct spot!), and an organizer.