We’ve encountered additional problems when saving recurring events from MapiCalendar items as .ics files. In a previous post I showed you examples where recurring events created .ics files that would result in null pointer errors when the files are read back (see url below)
Problem with Appointment.load when reading .ics files created by Aspose.mail 2.2.0.
This time, the problems are
1. Recurring rules are not correct for some of the custom meeting recurrences.
2. Exceptions to the recurring meetings are not being generated and stored in the .ics files.
To illustrate the problem, we’ve created six sample recurring events. Two behave as expected. Three fail due to problem 1, and one fails due to problem 2.
Attached is an excel file that compares the six cases. For each case, we compare .ics files from different sources.
1. Created by iCal on the Mac
2. Created by Outlook on Windows
3. Created by Aspose after reading the PST
Files being transferred.
1. “Recurs in PST.pst” is a PST file with 6 recurring appointments
2. “Test Recurs from Outlook” is a folder with 6 .ics files created by Outlook from the appointments in the PST file.
3. “Test Recurs from iCal” is folder with 6 .ics files created by iCal (setting up the same rules and conditions as already set up in the PST file)
4. “Test Recurs from Aspose” folder with 6 .ics files created using aspose.email to extract them.
5. “PSTExtractCalendar.java is java program to extract the .ics files from PST files.
6. “Recur Compare.xlsx” is a spreadsheet comparing the .ics files
7. “Problem Description.docx” is a document containing formatted version of this text.
Analysis
Looking at the recurrence rules generated by each of the three creators of the .ics files, you can see that something is wrong with the Aspose generation algorithms.
Problem 1. Meeting takes place every other month on 3rd Tuesday of the month.
iCal: FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYDAY=3TU
Outlook: FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYDAY=TU;BYSETPOS=3
Aspose: FREQ=MONTHLY;COUNT=10;INTERVAL=2;BYDAY=TU
As you can see by the difference between the aspose rule and the other two, there is more than one way to make the rule correct. The incorrect rule string generated by Aspose causes parsers to assume that the meeting is every Tuesday in the month.
Problem 2. Meeting takes place every three months on the 2nd Friday of the month.
iCal: FREQ=MONTHLY;COUNT=10;INTERVAL=3;BYDAY=2FR
Outlook: FREQ=MONTHLY;COUNT=10;INTERVAL=3;BYDAY=FR;BYSETPOS=2
Aspose: FREQ=MONTHLY;COUNT=10;INTERVAL=3;BYDAY=FR
I suspect that the failure here as the same root cause as Problem 1.
Problem 3. Meeting takes place every year on the 3rd Thursday in August.
iCal: FREQ=YEARLY;COUNT=10;INTERVAL=1;BYMONTH=8;BYDAY=3TH
Outlook: FREQ=YEARLY;COUNT=10;BYMONTH=8;BYDAY=TH;BYSETPOS=3
Aspose: FREQ=YEARLY;COUNT=10;INTERVAL=1;BYDAY=TH
The aspose rule here is missing the reference to month 8.
Problem 4. Meeting takes place every week but week 2 has different start time and week 3 has different location.
The RRule is correct in all cases, but the aspose .ics file does not have the additional entries for the exceptions. Text from .ics files included below.
Aspose generated .ics file:
BEGIN:VCALENDAR
VERSION:2.0
METHOD:REQUEST
PRODID:-//Aspose Ltd//iCalender Builder (v3.0)//EN
BEGIN:VEVENT
DTSTAMP:20121015T091345Z
DESCRIPTION:Weekly recurring meeting for ten weeks, but second week is moved in time.
\n
DTSTART:20110818T180000
DTEND:20110818T183000
SEQUENCE:0
SUMMARY:Boston Pops Concert
TRANSP:OPAQUE
UID:040000008200e00074c5b7101a82e00800000000a0cff42b845ecc01000000000000000010000000e45004caa45eba48a0c83a7deb93d788
RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=10;BYDAY=TH
END:VEVENT
BEGIN:VTIMEZONE
TZID:(GMT-08:00) Pacific Time (US & Canada)
BEGIN:DAYLIGHT
TZOFFSETFROM:-0800
TZOFFSETTO:-0700
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:16011104T020000
TZNAME:Standard Time
TZOFFSETFROM:-0700
TZOFFSETTO:-0800
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
DTSTART:16010311T020000
TZNAME:Daylight Saving Time
RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
END:STANDARD
END:VTIMEZONE
END:VCALENDAR
Outlook generated .ics file:
BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 14.0 MIMEDIR//EN
VERSION:2.0
METHOD:PUBLISH
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VTIMEZONE
TZID:Pacific Standard Time
BEGIN:STANDARD
DTSTART:16011104T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
TZOFFSETFROM:-0700
TZOFFSETTO:-0800
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010311T020000
RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
TZOFFSETFROM:-0800
TZOFFSETTO:-0700
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
CLASS:PUBLIC
CREATED:20121013T195436Z
DESCRIPTION:Weekly recurring meeting for ten weeks, but second week is mov
ed in time.\n
DTEND;TZID=“Pacific Standard Time”:20110818T183000
DTSTAMP:20121013T195436Z
DTSTART;TZID=“Pacific Standard Time”:20110818T180000
LAST-MODIFIED:20121013T195436Z
PRIORITY:5
RRULE:FREQ=WEEKLY;COUNT=10;BYDAY=TH
SEQUENCE:0
SUMMARY;LANGUAGE=en-us:Boston Pops Concert
TRANSP:OPAQUE
UID:040000008200E00074C5B7101A82E00800000000A0CFF42B845ECC01000000000000000
010000000E45004CAA45EBA48A0C83A7DEB93D788
X-ALT-DESC;FMTTYPE=text/html:
N">\n\n\n\n\n\n\n\n\n
Weekly recurring meeting for ten weeks, but second week is moved in t
ime.
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOSTARTCHECK:FALSE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
CREATED:20121013T195436Z
DESCRIPTION:Weekly recurring meeting for ten weeks, but second week is mov
ed in time.\n\nMeeting starts early this week!\n
DTEND:20110826T003000Z
DTSTAMP:20121013T195436Z
DTSTART:20110826T000000Z
LAST-MODIFIED:20121013T195436Z
RECURRENCE-ID:20110826T010000Z
SEQUENCE:0
TRANSP:OPAQUE
UID:040000008200E00074C5B7101A82E00800000000A0CFF42B845ECC01000000000000000
010000000E45004CAA45EBA48A0C83A7DEB93D788
X-ALT-DESC;FMTTYPE=text/html:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//E
N">\n\n\n\n\n\n\n\n\n
Weekly recurring meeting for ten weeks, but second week is moved in t
ime.
<SPAN LANG=
“en-us”>Meeting starts early this week!
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
CREATED:20121013T195436Z
DTEND:20110902T013000Z
DTSTAMP:20121013T195436Z
DTSTART:20110902T010000Z
LAST-MODIFIED:20121013T195436Z
LOCATION:Tom Shannon’s garage
RECURRENCE-ID:20110902T010000Z
SEQUENCE:0
TRANSP:OPAQUE
UID:040000008200E00074C5B7101A82E00800000000A0CFF42B845ECC01000000000000000
010000000E45004CAA45EBA48A0C83A7DEB93D788
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MS-OLK-AUTOFILLLOCATION:FALSE
END:VEVENT
END:VCALENDAR