Docs
Purelymail CalDAV RSVP tracking
Purelymail CalDAV stores calendar events, but it does not poll attendee replies and write their RSVP status back. That handshake is the iTIP REPLY half of the iCalendar protocol (RFC 5546).
Purelymail Calendar closes the loop. When an attendee
accepts or declines, their mail client sends an iTIP REPLY back to the
organizer's Purelymail inbox. Purelymail Calendar polls that inbox over
IMAP, matches the reply to the original event by UID, and updates the
PARTSTAT field on the CalDAV record.
The reply loop.
REPLY to the organizer.
PARTSTAT set on the matching VEVENT.
The organizer's calendar reflects each attendee's answer within minutes of their reply, without any manual sync.
What each step looks like.
| Event | Where it happens | Stored in |
|---|---|---|
| Organizer sends REQUEST | Purelymail Calendar via your Purelymail SMTP. | Purelymail mail logs (sent folder). |
| Attendee replies | Their mail client (Gmail, Apple Mail, Outlook, Thunderbird). | Their own mailbox. |
| REPLY reaches organizer | Standard SMTP delivery to the organizer's Purelymail mailbox. | Organizer's Purelymail IMAP inbox. |
| Poller matches and applies | Purelymail Calendar IMAP poller (5-min cron). | Purelymail CalDAV: PARTSTAT on the VEVENT. |
What the poller looks for.
On each tick the poller searches the organizer's inbox for messages whose
text/calendar part has METHOD:REPLY, extracts the
VEVENT, and matches it to a stored event by UID. Each ATTENDEE
line in the reply carries a PARTSTAT value (ACCEPTED,
DECLINED, or TENTATIVE), which is written back to
the matching ATTENDEE line on the CalDAV VEVENT.
A small but important detail: replies must keep the original UID. iTIP clients all do this correctly. If you ever see an RSVP that does not stick, the most common cause is a forwarded or rewritten reply where the UID was altered.
What an iTIP REPLY looks like.
BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Apple Inc.//macOS 14//EN METHOD:REPLY BEGIN:VEVENT UID:9c7b6e1c-58fd-4ab1-9b8c-d3f5d4e7a012 SEQUENCE:1 ORGANIZER;CN=You:mailto:you@yourdomain.com ATTENDEE;CN=Alex;PARTSTAT=ACCEPTED:mailto:alex@example.com DTSTART:20260601T150000Z DTEND:20260601T160000Z SUMMARY:Project sync END:VEVENT END:VCALENDAR
Failure modes worth knowing.
The reply hits the spam folder.
The poller scans INBOX only. If your domain's SPF/DKIM/DMARC
records are misconfigured, attendees' replies can land in the Junk folder
and never reach the poller. Standard mail-deliverability hygiene applies.
The attendee uses a non-iTIP-aware client.
A handful of webmail clients still send a plain-text "Yes I will be there" reply rather than an iTIP REPLY. There is no machine-readable status in that message and no CalDAV record can be updated automatically. This is rare on modern Gmail, Apple Mail, Outlook, and Thunderbird.
SEQUENCE mismatch.
Per RFC 5546, an attendee should reply with the same SEQUENCE
they received. Replies to a stale event version are still applied, because
the UID matches; the trade-off is the attendee may have answered a meeting
that has since moved.
Where to go next.
- Send meeting invites with Purelymail: the REQUEST side of the same protocol.
- Connect Purelymail CalDAV to Apple Calendar: set up native device sync alongside Purelymail Calendar.
- Feature comparison: what Purelymail provides natively vs. what this app adds.
- Purelymail's CalDAV docs and the iTIP RFC 5546 for the protocol details.
-
Source on GitHub
(MIT licensed). The IMAP poller lives in
calinvite_web/services.py. - About Purelymail Calendar: credential handling and data residency.