email body for recurring event modifications does not show which occurrence was affected
Nobody has claimed this yet.
- Dominant language
- PHP
- Stars
- 36.9k
- Forks
- 5.2k
- Avg merge
- 2d 3h
- Merged PRs (30d)
- 713
Description
Bug description
When the organizer modifies a single occurrence of a recurring event (delete, move, or rename), the Nextcloud-generated email body sent to attendees does not indicate which occurrence was affected. The body only shows the series title and lists upcoming dates. The attendee cannot tell what changed without opening the ICS attachment or syncing their calendar.
Additionally, the email template has two secondary issues:
- It says "invite" instead of "update" for attendees who already accepted the series.
- It shows Accept/Decline buttons for cancellation notifications where there is nothing to accept.
Thunderbird's own iMIP parser extracts the correct information (canceled/modified occurrences) from the ICS attachment, which proves the data is present in the ICS. The Nextcloud mail body simply does not use it.
Previously reported as #21220 (closed as duplicate of #38686, closed as completed in PR #45547). Also related: #29460 (closed), #29601 (closed). The problem persists on Nextcloud 33.
Related calendar-app issues: nextcloud/calendar#7850, nextcloud/calendar#7771.
Setup:
- Calendar app: 6.2.2
- dav: 1.36.0
- All users on the same instance, invited via the internal user picker (principal-based scheduling).
- Attendees read emails in Thunderbird 128.x. CalDAV sync was paused during tests to observe raw email content.
Case A: Organizer deletes a single occurrence
User A creates a daily recurring event "Daily Test", starting 2026-05-06 at 15:00, with User B as attendee (added via user picker in Web-UI). User A deletes the occurrence on 2026-05-07 via the Calendar web UI ("Delete this occurrence").
Email subject: Invitation updated: Daily Test
Thunderbird iMIP display (parsed from ICS):
When: Occurs every day effective 5/6/26 from 15:00 to 15:30
Canceled Occurrences: Thursday, May 7, 2026 at 15:00
This is correct and tells the attendee exactly what happened.
Nextcloud mail body:
admin updated the event "Daily Test"
When: Every Day between 3:00 PM - 3:30 PM (Europe/Berlin)
Occurring: In 19 hours on May 6, 2026 then on May 8, 2026 and May 9, 2026
There's no mention of the canceled event on May 7.
ICS excerpt (anonymized):
METHOD:REQUEST
BEGIN:VEVENT
UID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
DTSTART;TZID=Europe/Berlin:20260506T150000
SUMMARY:Daily Test
ATTENDEE;CN=User B;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;ROLE=R
EQ-PARTICIPANT;RSVP=TRUE:mailto:user-b@example.com
ORGANIZER;CN=admin:mailto:user-a@example.com
RRULE:FREQ=DAILY
EXDATE;TZID=Europe/Berlin:20260507T150000
END:VEVENT
The EXDATE is present in the ICS. The mail body does not use it.
Bonus (Thunderbird): The same thing happens when creating the recurring event in Thunderbird and deleting one occurrence. ICS looks slightly different, but the display on the iMIP screen and in the email body is identical.
Case B: Organizer moves a single occurrence
Same series as Case A. User A moves the occurrence on 2026-05-08 from 15:00 to 16:00.
Email subject: Invitation: Daily Test
Thunderbird iMIP display:
Canceled Occurrences: Thursday, May 7, 2026 at 15:00
Modified Occurrences: Friday, May 8, 2026, 16:00 – 16:30
Correct.
Nextcloud mail body:
admin would like to invite you to "Daily Test"
When: In 2 days on Friday, May 8, 2026 between 4:00 PM - 4:30 PM (Europe/Berlin)
Problems:
- Shows the new time but does not mention it was moved from 15:00 to 16:00.
- The mail subject should say "Invitation updated" (as it already does for deletion notifications) rather than presenting it as a new invitation.
ICS excerpt (anonymized):
METHOD:REQUEST
BEGIN:VEVENT
UID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
DTSTART;TZID=Europe/Berlin:20260420T150000
DTEND;TZID=Europe/Berlin:20260420T153000
SUMMARY:Daily Test
ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:user-b@example.com
ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:user-c@example.com
ORGANIZER;CN=admin:mailto:user-a@example.com
RRULE:FREQ=DAILY
EXDATE;TZID=Europe/Berlin:20260424T150000
END:VEVENT
BEGIN:VEVENT
UID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
DTSTART;TZID=Europe/Berlin:20260425T160000
DTEND;TZID=Europe/Berlin:20260425T163000
SUMMARY:Daily Test
ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:user-b@example.com
ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:user-c@example.com
ORGANIZER;CN=admin:mailto:user-a@example.com
RECURRENCE-ID;TZID=Europe/Berlin:20260425T150000
END:VEVENT
Case C: Same tests after attendee accepted the series
User B first accepts the entire series via Thunderbird iMIP, then User A deletes an occurrence.
Email subject: Invitation updated: Daily Test
Nextcloud mail body:
admin updated the event "Daily Test"
Occurring: In 18 hours on May 6, 2026 then on May 8, 2026 and May 9, 2026
Same problem as Case A: no mention of the canceled date. The wording "updated" is correct in this case (unlike Case B).
Additionally, the email shows Accept/Decline buttons. Since the only change is a deletion, there is nothing to accept or decline. These buttons should be omitted for cancellation-only updates.
Bonus (Thunderbird): The same thing happens when creating the recurring event in Thunderbird, accepting the series, and deleting one occurrence. Display on the iMIP screen and in the email body is identical.
Case D: Organizer changes the title of a single occurrence
User A changes the title of the 2026-05-11 occurrence to "Daily Test Weekstart".
Email subject: Invitation: Daily Test Weekstart
Nextcloud mail body:
admin would like to invite you to "Daily Test Weekstart"
When: In 5 days on Monday, May 11, 2026 between 3:00 PM - 3:30 PM (Europe/Berlin)
Here the mail body is actually useful: correct date, new title visible. But it says "invite" instead of "update".
Bonus (Thunderbird): When making the same change in Thunderbird, the email is noticeably better:
Subject: Invitation updated: Daily Test TB Weekstart
Nextcloud mail body:
admin updated the event "Daily Test TB Weekstart"
Title:
Daily Test TB
Daily Test TB WeekstartWhen:
Every Day between 3:00 PM - 3:30 PM (Europe/Berlin)
In 5 days on Monday, May 11, 2026 between 3:00 PM - 3:30 PM (Europe/Berlin)
Steps to reproduce
- User A creates a daily recurring event in the Nextcloud Calendar web UI, adds User B as attendee via the user picker.
- User A deletes a single occurrence via "Delete this occurrence".
- User B receives an iMIP email. The Nextcloud mail body does not mention which occurrence was deleted.
- Same behavior for moving or renaming a single occurrence.
Expected behavior
The Nextcloud mail body should include the same information that is already present in the ICS:
- For deleted occurrences: "Canceled: Friday, May 7, 2026 at 15:00"
- For moved occurrences: "Moved: Friday, May 8, 2026 from 15:00 to 16:00"
- For updates to accepted series: "updated" instead of "would like to invite you"
- For cancellation-only changes: no Accept/Decline buttons
On an instance with ~600 users who regularly invite each other to recurring meetings, the current emails have low informational value. Users learn to ignore them, which defeats the purpose of calendar notifications.
Nextcloud Server version
33
Operating system
Debian/Ubuntu
PHP engine version
PHP 8.3
Web server
Apache (supported)
Database engine version
MySQL
Is this bug present after an update or on a fresh install?
Upgraded to a MAJOR version
Are you using the Nextcloud Server Encryption module?
Encryption is Disabled
What user-backends are you using?
- Default user-backend (database)
- LDAP/ Active Directory
- SSO - SAML
- Other
Configuration report
{
"system": {
"passwordsalt": "***REMOVED SENSITIVE VALUE***",
"secret": "***REMOVED SENSITIVE VALUE***",
"trusted_domains": [
"***REMOVED SENSITIVE VALUE***",
"***REMOVED SENSITIVE VALUE***",
"***REMOVED SENSITIVE VALUE***"
],
"datadirectory": "***REMOVED SENSITIVE VALUE***",
"dbtype": "mysql",
"version": "33.0.2",
"overwrite.cli.url": "***REMOVED SENSITIVE VALUE***",
"dbname": "***REMOVED SENSITIVE VALUE***",
"dbhost": "***REMOVED SENSITIVE VALUE***",
"dbport": "",
"dbtableprefix": "oc_",
"mysql.utf8mb4": true,
"dbuser": "***REMOVED SENSITIVE VALUE***",
"dbpassword": "***REMOVED SENSITIVE VALUE***",
"installed": true,
"instanceid": "***REMOVED SENSITIVE VALUE***",
"htaccess.RewriteBase": "\/",
"maintenance_window_start": 1,
"maintenance": false,
"default_phone_region": "de",
"mail_smtpmode": "smtp",
"mail_smtpsecure": "ssl",
"mail_sendmailmode": "smtp",
"mail_from_address": "***REMOVED SENSITIVE VALUE***",
"mail_domain": "***REMOVED SENSITIVE VALUE***",
"mail_smtphost": "***REMOVED SENSITIVE VALUE***",
"mail_smtpauth": 1,
"mail_smtpname": "***REMOVED SENSITIVE VALUE***",
"mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
"mail_smtpport": "465",
"theme": "",
"loglevel": 2,
"config_preset": 9,
"app_install_overwrite": [
"fairmeeting",
"jitsi",
"bbb"
],
"memcache.local": "\\OC\\Memcache\\APCu"
}
}
List of activated Apps
Enabled:
- activity: 6.0.0
- app_api: 33.0.0
- bruteforcesettings: 6.0.0
- calendar: 6.2.2
- circles: 33.0.0
- cloud_federation_api: 1.17.0
- comments: 1.23.0
- contacts: 8.4.5
- contactsinteraction: 1.14.1
- dashboard: 7.13.0
- dav: 1.36.0
- federatedfilesharing: 1.23.0
- federation: 1.23.0
- files: 2.5.0
- files_downloadlimit: 5.1.0
- files_pdfviewer: 6.0.0
- files_reminders: 1.6.0
- files_sharing: 1.25.2
- files_trashbin: 1.23.0
- files_versions: 1.26.0
- firstrunwizard: 6.0.0
- guests: 4.7.2
- logreader: 6.0.0
- lookup_server_connector: 1.21.0
- mail: 5.7.15
- nextcloud_announcements: 5.0.0
- notifications: 6.0.0
- oauth2: 1.21.0
- password_policy: 5.0.0
- photos: 6.0.0
- privacy: 5.0.0
- profile: 1.2.0
- provisioning_api: 1.23.0
- recommendations: 6.0.0
- related_resources: 4.0.0
- richdocuments: 10.1.3
- serverinfo: 5.0.0
- settings: 1.16.0
- sharebymail: 1.23.0
- support: 5.0.0
- survey_client: 5.0.0
- text: 7.0.1
- theming: 2.8.0
- twofactor_backupcodes: 1.22.0
- twofactor_totp: 15.0.0
- updatenotification: 1.23.0
- user_status: 1.13.0
- viewer: 6.0.0
- weather_status: 1.13.0
- webhook_listeners: 1.5.0
- whiteboard: 1.5.8
- workflowengine: 2.15.0
Disabled:
- admin_audit: 1.23.0
- bbb: 2.9.1 (installed 2.9.1)
- calendar_resource_management: 0.12.1 (installed 0.12.1)
- collectives: 4.4.0 (installed 4.4.0)
- deck: 1.17.1 (installed 1.17.1)
- encryption: 2.21.0
- fairmeeting: 0.22.5 (installed 0.22.5)
- files_external: 1.25.1
- integration_mattermost: 3.1.0 (installed 3.1.0)
- jitsi: 0.19.0 (installed 0.19.0)
- richdocumentscode: 25.4.904 (installed 25.4.904)
- riotchat: 0.20.0 (installed 0.20.0)
- spreed: 23.0.4 (installed 23.0.4)
- suspicious_login: 11.0.0
- systemtags: 1.23.0 (installed 1.22.0)
- tables: 2.1.1 (installed 2.1.1)
- testing: 1.23.0
- twofactor_nextcloud_notification: 7.0.0
- user_ldap: 1.24.0
Nextcloud Signing status
No errors have been found.
Nextcloud Logs
Additional info
Related issues (all closed):
- #21220 (closed as duplicate of #38686)
- #38686 (closed as completed in PR #45547)
- #29460 (closed)
- #29601 (closed)
- PR #45547 and PR #48583 partially addressed iMIP generation but did not fix the mail body content for recurring event modifications.
Related calendar-app issues:
- nextcloud/calendar#7850 (recurring event exception handling)
- nextcloud/calendar#7771 (missing "this/all/following" dialog)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing Nextcloud Server's calendar iMIP email generation and how recurring-event data from the ICS is represented in the mail body. Reproduce the deletion, move, title-change, and accepted-series cases described here, then verify that occurrence details, update wording, and cancellation-only controls match the expected behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- php
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100