I would like to be able to create an ICS file with multiple events that user will be able to import in their default Exchange Calendar. I need to support Outlook desktop client, Office 365 web interface and Apple iPhone Mail/Calendar.
Note that issue only occurs with ICS files that contain multiple events. Single event ICS works as expected.
Following multi-event ICS file:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//bobbin v0.1//NONSGML iCal Writer//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
DTSTART:20180327T080000Z
DTEND:20180327T110000Z
DTSTAMP:20091130T213238Z
UID:1285935469767a7c7c1a9b3f0df8003a#yourserver.com
CREATED:20091130T213238Z
DESCRIPTION:Example event 1
LAST-MODIFIED:20091130T213238Z
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Example event 1
TRANSP:OPAQUE
END:VEVENT
BEGIN:VEVENT
DTSTART:20180328T120000Z
DTEND:20180328T130000Z
DTSTAMP:20091130T213238Z
UID:1285935469767a7c7c1a9b3f0df8003b#yourserver.com
CREATED:20091130T213238Z
DESCRIPTION:Example event 2
LAST-MODIFIED:20091130T213238Z
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Example event 2
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
works fine in Office 365 web interface and Apple iPhone Mail/Calendar. However, when it is imported in Outlook 2016 it creates a new "Untitled" Calendar and puts events in it instead of default user calendar.
This seems to be a known issue referenced previously on SO:
ICal import creates new calendar When Open the ics file
Have ICS file with multiple events save to my Calendar, not Other Calendars
Answers range from "it cannot be done" to the opposite.
One of the posts in the first link mentions removing X-WR-CALNAME from ICS fixes the problem. I never had this in ICS to begin with.
Another post on the same page mentions that adding X-WR-RELCALID:XXXXXX fixes it. I tried putting it in and it makes no difference at all. I am not sure if value for X-WR-RELCALID should be set to something specific - I just set it to some GUID.
If someone successfully resolved it - can you post an ICS sample and what version of Outlook did it work with?
Related
What I am trying to do:
I have a need to send my clients .ics files that will populate their Outlook calendars as soon as they download and double click (and choose to populate their Outlook calendar).
When I am testing locally, the iCalendar code below works fine if I set Outlook to work offline - a UID is generated once for each event, I can use the same file again and again and a new event will not be generated - as the UID is recognized by Outlook as already existing. (so I can rely on the UID to update, and cancel as well)
The issue is that when I work with an online Outlook, a random UID (112 characters long) is generated every time I use the file to populate the calendar - even for the same events - so a duplicate event is generated every time!
Example for an .ics file:
BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
PRODID:-//PYVOBJECT//NONSGML Version 1//EN
BEGIN:VEVENT
UID:12345
DTSTART:20190715T020222Z
DTEND:20190715T030222Z
DESCRIPTION:Some fake summary - first event
DTSTAMP:20190715T010222Z
SEQUENCE:0
SUMMARY:this is the first event summary
END:VEVENT
BEGIN:VEVENT
UID:67890
DTSTART:20190715T040222Z
DTEND:20190715T050222Z
DESCRIPTION:Some fake summary - second event
DTSTAMP:20190715T010222Z
SEQUENCE:0
SUMMARY:this is the second event summary
END:VEVENT
END:VCALENDAR
If I generate an .ics file for the first event that was generated when Outlook is online (dragging and dropping out of the calendar) I see that Outlook has added a bunch of new fields:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Microsoft Corporation//Outlook for Mac MIMEDIR//EN
METHOD:PUBLISH
BEGIN:VTIMEZONE
TZID:Pacific Time (US & Canada)
X-ENTOURAGE-CFTIMEZONE:US/Pacific
X-ENTOURAGE-TZID:1
BEGIN:STANDARD
RRULE:FREQ=YEARLY;INTERVAL=1;BYSECOND=0;BYMINUTE=0;BYHOUR=2;BYDAY=1SU;BYMONTH=11
TZOFFSETFROM:-0700
TZOFFSETTO:-0800
DTSTART:20071104T020000
END:STANDARD
BEGIN:DAYLIGHT
RRULE:FREQ=YEARLY;INTERVAL=1;BYSECOND=0;BYMINUTE=0;BYHOUR=2;BYDAY=2SU;BYMONTH=3
TZOFFSETFROM:-0800
TZOFFSETTO:-0700
DTSTART:20070311T020000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
UID:<a NEW 112 character id - NOT the one I added myself>
X-ENTOURAGE_UUID:81760164-FB2C-4421-B7AC-2E1791265F0A
X-MICROSOFT-EXCHANGE-ID:<base64, 140 character id>
X-MICROSOFT-EXCHANGE-CHANGEKEY:<base64, 32 character id>
DTSTAMP:20190715T023949Z
DTSTART;TZID="Pacific Time (US & Canada)":20190714T190200
DTEND;TZID="Pacific Time (US & Canada)":20190714T200200
LAST-MODIFIED:20190715T023949Z
SUMMARY:this is the first event summary
DESCRIPTION:Some fake summary - first event
ORGANIZER:MAILTO:<the real account owner email - my email>
SEQUENCE:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-DISALLOW-COUNTER:TRUE
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-CDO-INSTTYPE:0
END:VEVENT
END:VCALENDAR
What I tried:
Modified: METHOD:REQUEST
Added X-WR-RELCALID:some_unique_id from this post
Sequence does not seem to help - it is only there to sort out if 2 UIDs are the same within the same file
I added ORGANIZER;CN=Fable mail:MAILTO:fable.mail#example.com to each event - it has the same issue as the UID, and is disregarded (my email is added as the organizer)
I added ATTENDEE:MAILTO:somemail#email.com as suggested in this post, but it does not seem to make any difference
Is it because I am not using the recommended standard for the UID? It seems like a suggestion to prevent collisions, nothing more.
Thank you!
The problem still persists on latest Outlook 2019 from Office 365.
Even Microsoft support suggests to add this as feature request to the outlook suggestion box. (see here: https://answers.microsoft.com/en-us/msoffice/forum/all/ics-file-does-not-update-event/38548f62-d9cd-4b85-8d3e-65217d4e8f50)
Others suggest to create an application which communicates with outlook and synchronizes the calendar entries by this way. But in my opinion this is a too heavy solution for such a small problem.
When you upload the .ics file to outlook live via the desktop browser, I have used edge mobile set as desktop for this, and select add calendar in the expanded left sidebar followed by upload from file in the following selection menu the UID replacement does not take place.
P.S. Entering the data via outlook mail replaced the UIDs even if they did comply to the official recommendations in the specification.
If I download my generated ICS file and import into Outlook as as a file (essentially just creating a snapshot) then the VALARM I have set works correctly.
What I want is a ical feed that will synchronize with the server. So when I create an Internet Calendar (Add/Open Calendar -> From Internet) using my ICS file URL all the events are created correctly and synchronizing works, but the VALARM is ignored and not set
BEGIN:VCALENDAR
VERSION:2.0
PRODID:Appointment Calendar
METHOD:PUBLISH
SOURCE:ICAL-URL
X-WR-CALNAME:Appointments
X-WR-CALDESC:Calendar
BEGIN:VEVENT
UID:84fbfa16-ab3a-4313-b98b-638da09a8a1c
DTSTAMP:20190107T190135Z
SUMMARY:My Event
DTSTART:20190109T183000Z
DTEND:20190109T184500Z
CATEGORIES:Red Category
BEGIN:VALARM
ACTION:DISPLAY
TRIGGER:-PT15M
DESCRIPTION:Alert
END:VALARM
END:VEVENT
END:VCALENDAR
Am I doing something wrong or is VALARM not supported for internet calendars in outlook? When I do this in Thunderbird w/ Lightning plug-in then it works great. So I'm assuming there is some MS specific formatting I'm missing?
I am using Outlook 2016 for my testing. I read that some people have success with logging into Office365 and importing calendars from the dashboard but this did not work for me either. I have tried formatting my URL with both http:// and webcal://
I am writing an application that will send out .ics files to be interpreted mainly by outlook. When my applications sends an update, it will successfully update everyone's calendar except for the organizer's calendar. I'm using the same UID and I'm incrementing SEQUENCE each time. Is there anything else that I'm missing in my ICS file or does it not update my calendar because I am the organizer?
Below is an example of the ics code that we're using:
BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VTIMEZONE
TZID:Eastern Standard Time
BEGIN:STANDARD
DTSTART:16011104T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010311T020000
RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;CN='test';RSVP=TRUE:mailto:test#testing.com
ATTENDEE;CN='attendee';RSVP=TRUE:mailto:attendee#attendees.com
CLASS:PUBLIC
CREATED:20180628T182531Z
DTSTART;TZID=Eastern Standard Time:20180630T141500
DTEND;TZID=Eastern Standard Time:20180630T160000
DTSTAMP:20180628T182531Z
LAST-MODIFIED:20180628T182531Z
LOCATION:some place
ORGANIZER;CN=Conference Room Board:mailto:test#testing.com
PRIORITY:5
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:test
TRANSP:OPAQUE
UID:SomeUniqueUID
CREATED:20180628T182531Z
DESCRIPTION:Test
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-AUTOFILLLOCATION:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
END:VCALENDAR
Thanks for any help!
This is expected. As the organiser, your client assumes that only itself is in control of invitation. As such it ignores invitations sent by other parties.
You may want to make the organiser also an ATTENDEE but there is no guarantee that this will work.
See Change event description for organizer using VCalendar and When creating an iCal event on behalf of an organizer and email it to him, no "Add to calendar" or "RSVP" wrappers appear
So, you guys are correct and this is expected behavior. I tried adding the organiser as an attendee and ended up running into problems when I tried to create an event cancellation. The organiser would receive the email but be unable to remove from calendar because they were recognized as the organizer.
I ended up abandoning using ICS files and instead started using a library that communicates through Exchange Web Services. EWS allowed me to simulate creating a meeting on someone's calendar through an API and then adding attendees just like I created the meeting in Outlook. Specifically, I was using python so I started using Exchangelib.
I wanted to put an answer to this question for anyone else that may stumble upon this.
I am attempting to send out .ics calendar event files which can be downloaded by users and saved to their Outlook calendars. The calendar event needs to appear as “Free” in Outlook. Below is a sample of the .ics event currently being sent out:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:http://company.ical.cls
BEGIN:VEVENT
DTSTART:20180425
SUMMARY:PTO for Babcock, Michael (22.5hrs)
DTEND:20180428
FREEBUSY:FREE
END:VEVENT
END:VCALENDAR
When an Outlook for Windows user downloads the above file and opens it in their Outlook calendar, the event appears correctly as Free time.
When an Outlook for Mac user downloads the above file it creates a new email with the .ics file attached.
To try to correct the problem for Mac users, I edited the FREEBUSY keyword several times to appear as:
FBTYPE:FREE:20180425T000000Z/20180428T000000Z
FBTYPE:20180426T000000Z/20180429T000000Z
FREEBUSY;FBTYPE=FREE:20180416T133000Z/20180429T170000Z
Outlook for Mac users could download the file with one of those new FreeBusy keywords and open it in their calendar, but it always appears as Busy. The strange thing is, if they open the file with the modified keyword on a Windows computer first, then the appointment appears as free on both Windows and Mac Outlook.
Has anyone found a FreeBusy keyword that allows Outlook for Mac users to see .ics calendar appointments as Free?
The 'Freebusy' component is VFREEBUSY, not VEVENT. Please see the RFC5545 specification. https://www.rfc-editor.org/rfc/rfc5545#section-3.6.4
VFREEBUSY cannot be nested under VEVENT. Also it does NOT say that FREEBUSY property can be used in VEVENT. The spec at https://www.rfc-editor.org/rfc/rfc5545#section-3.8.2.6 says:
FREEBUSY..... Conformance: The property can be specified in a
"VFREEBUSY" calendar
component.
...
The following is an example of a "VFREEBUSY" calendar component
used to publish busy time information:
BEGIN:VFREEBUSY
UID:19970901T115957Z-76A912#example.com
DTSTAMP:19970901T120000Z
ORGANIZER:jsmith#example.com
DTSTART:19980313T141711Z
DTEND:19980410T141711Z
FREEBUSY:19980314T233000Z/19980315T003000Z
FREEBUSY:19980316T153000Z/19980316T163000Z
FREEBUSY:19980318T030000Z/19980318T040000Z
URL:http://www.example.com/calendar/busytime/jsmith.ifb
END:VFREEBUSY
FREEBUSY is for requesting/responding/publishing availability windows.
To make the event appear in the calendar with the Free/Busy flag set to Free, use TRANSP:TRANSPARENT and X-MICROSOFT-CDO-BUSYSTATUS:FREE
For example:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:http://company.ical.cls
BEGIN:VEVENT
DTSTART:20180425
SUMMARY:PTO for Babcock, Michael (22.5hrs)
DTEND:20180428
TRANSP:TRANSPARENT
X-MICROSOFT-CDO-BUSYSTATUS:FREE
END:VEVENT
END:VCALENDAR
I have the following snippet of an .ics file generated by iCal4j:
BEGIN:VCALENDAR
PRODID:-//Events Calendar//iCal4j 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
DTSTAMP:20110608T161848Z
DTSTART:20110604T213000
DTEND:20110604T222158
SUMMARY:Uplink Window
TZID:Europe/London
UID:20110608T162308Z-uidGen#10.37.129.2
DESCRIPTION:My Description
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20110608T161848Z
DTSTART:20110604T230845
DTEND:20110605T001314
SUMMARY:Uplink Window
TZID:Europe/London
UID:20110608T162309Z-uidGen#10.37.129.2
DESCRIPTION:My Description
END:VEVENT
END:VCALENDAR
When I import this .ics file into Outlook or iCal each event has a notification 15 minutes before the start time (the little popup thing). Is there a way I can disable these notifications? We have hundreds of events per .ics file and don't need to be notified whenever one comes up, we just want to be able to view the blocks of time the events cover.
Thanks
It was a setting of iCal and Outlook to add an automatic notification 15 minutes before any new event. The .ics file was being treated as a new event. Once I changed those settings in the preferences of the respective applications, I got the desired results.
User Error wins again.