Skip to content

email body for recurring event modifications does not show which occurrence was affected #60451

@ndo84bw

Description

@ndo84bw

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 Weekstart

When:
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

  1. User A creates a daily recurring event in the Nextcloud Calendar web UI, adds User B as attendee via the user picker.
  2. User A deletes a single occurrence via "Delete this occurrence".
  3. User B receives an iMIP email. The Nextcloud mail body does not mention which occurrence was deleted.
  4. 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):

Related calendar-app issues:

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status

    To triage

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions