Bug Report: RECURRENCE-ID exceptions invisible when UID has multiple RRULE masters
Product: eM Client 10.4.5326
Affected feature: Calendar – ICS feed subscription
Severity: High – events silently disappear, no error shown
Summary
When subscribing to an ICS calendar feed where a recurring series has been renewed (same UID, new RRULE master for a new time period) and individual occurrences have been modified via RECURRENCE-ID, most of those modified occurrences are invisible in eM Client. Only the last RECURRENCE-ID event in the feed is shown; all earlier ones disappear silently.
This pattern is common in Microsoft Exchange/OWA exports where a meeting series is recreated each year (e.g. annual planning cycles) while reusing the original UID.
The same feed displays all occurrences correctly in Apple Calendar, Google Calendar, and Thunderbird.
Minimal Reproduction
Host the following ICS at a URL and subscribe to it in eM Client:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VTIMEZONE
TZID:W. Europe Standard Time
BEGIN:STANDARD
DTSTART:16010101T030000
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:CET
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T020000
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
TZNAME:CEST
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
UID:[email protected]
DTSTART;TZID=W. Europe Standard Time:20250506T100000
DTEND;TZID=W. Europe Standard Time:20250506T110000
RRULE:FREQ=WEEKLY;UNTIL=20251216T090000Z;BYDAY=TU;WKST=MO
SUMMARY:Weekly Team Meeting
X-MICROSOFT-CDO-INSTTYPE:1
END:VEVENT
BEGIN:VEVENT
UID:[email protected]
RECURRENCE-ID;TZID=W. Europe Standard Time:20250930T100000
DTSTART;TZID=W. Europe Standard Time:20250930T100000
DTEND;TZID=W. Europe Standard Time:20250930T110000
SUMMARY:Weekly Team Meeting (special agenda Sep 30)
X-MICROSOFT-CDO-INSTTYPE:3
END:VEVENT
BEGIN:VEVENT
UID:[email protected]
DTSTART;TZID=W. Europe Standard Time:20260106T100000
DTEND;TZID=W. Europe Standard Time:20260106T110000
RRULE:FREQ=WEEKLY;UNTIL=20261215T090000Z;BYDAY=TU;WKST=MO
SUMMARY:Weekly Team Meeting
X-MICROSOFT-CDO-INSTTYPE:1
END:VEVENT
BEGIN:VEVENT
UID:[email protected]
RECURRENCE-ID;TZID=W. Europe Standard Time:20260512T100000
DTSTART;TZID=W. Europe Standard Time:20260512T100000
DTEND;TZID=W. Europe Standard Time:20260512T110000
SUMMARY:Weekly Team Meeting (special agenda May 12)
X-MICROSOFT-CDO-INSTTYPE:3
END:VEVENT
BEGIN:VEVENT
UID:[email protected]
RECURRENCE-ID;TZID=W. Europe Standard Time:20260519T100000
DTSTART;TZID=W. Europe Standard Time:20260519T100000
DTEND;TZID=W. Europe Standard Time:20260519T110000
SUMMARY:Weekly Team Meeting (special agenda May 19)
X-MICROSOFT-CDO-INSTTYPE:3
END:VEVENT
BEGIN:VEVENT
UID:[email protected]
RECURRENCE-ID;TZID=W. Europe Standard Time:20260526T100000
DTSTART;TZID=W. Europe Standard Time:20260526T100000
DTEND;TZID=W. Europe Standard Time:20260526T110000
SUMMARY:Weekly Team Meeting (special agenda May 26)
X-MICROSOFT-CDO-INSTTYPE:3
END:VEVENT
END:VCALENDAR
Quick local test:
# Save the ICS above as repro.ics, then:
python3 -m http.server 8765
# Subscribe in eM Client to: http://localhost:8765/repro.ics
Steps to reproduce
- Subscribe to the ICS feed above in eM Client (Calendar → Add calendar → Subscribe from Internet)
- Navigate to the weeks of May 12, May 19, and May 26, 2026 (all Tuesdays)
Expected Behavior
All three Tuesdays show their respective modified titles:
- May 12 →
Weekly Team Meeting (special agenda May 12) ✓
- May 19 →
Weekly Team Meeting (special agenda May 19) ✓
- May 26 →
Weekly Team Meeting (special agenda May 26) ✓
This is the behavior defined in RFC 5545 §3.6.1: a VEVENT with RECURRENCE-ID overrides the corresponding occurrence.
Apple Calendar, Google Calendar, and Thunderbird all display all three correctly.
Actual Behavior (eM Client 10.4.5326)
- May 12 → missing entirely
- May 19 → missing entirely
- May 26 →
Weekly Team Meeting (special agenda May 26) ✓ (only last RECID shown)
Root Cause Analysis
The bug is triggered by the combination of:
-
Multiple RRULE masters sharing the same UID – Exchange reuses UIDs when a recurring series is renewed for a new period (e.g. annual cycles). The feed contains two masters: one for 2025 (UNTIL=20251216) and one for 2026 (UNTIL=20261215), both with UID:[email protected].
-
RECURRENCE-ID exceptions for the second master – Individual occurrences of the 2026 series are modified and appear as RECURRENCE-ID events with X-MICROSOFT-CDO-INSTTYPE:3.
-
eM Client only shows the last RECURRENCE-ID event – Of three modified occurrences (May 12, 19, 26), only May 26 (the last in document order) is displayed. The others are silently discarded.
A simpler variant without multiple RRULE masters (single master + one RECURRENCE-ID) does not trigger the bug – eM Client handles that case correctly.
Additional Observations
X-MICROSOFT-CDO-INSTTYPE
Microsoft Exchange marks recurring master events with X-MICROSOFT-CDO-INSTTYPE:1 and per-occurrence exceptions with X-MICROSOFT-CDO-INSTTYPE:3. Removing these properties from the feed does not resolve the issue.
Workaround
We built a server-side ICS proxy that expands affected series into explicit individual VEVENT blocks (no RRULE, no RECURRENCE-ID, unique UID per occurrence). With this approach eM Client displays all occurrences correctly.
The proxy is open source: configs/ical-fixer/main.py uses Python/FastAPI with the icalendar and dateutil libraries. Happy to share details if useful for debugging.
Environment
- Feed source: Microsoft Exchange / Outlook Web Access (OWA) –
outlook.office365.com
- eM Client version: 10.4.5326
- Verified working in: Apple Calendar (macOS), Google Calendar (web), Thunderbird 128
- RFC reference: RFC 5545 §3.6.1
Request
Please fix the handling of RECURRENCE-ID exceptions when a UID has multiple RRULE masters (renewed series). All RECURRENCE-ID events should be applied to their respective occurrence, not just the last one in document order.