feat: "Email sent" column and per-event copy-to-organizer BCC #47

Closed
padreug wants to merge 3 commits from feat/ticket-email-sent-copy into main
2 changed files with 2 additions and 1 deletions
Showing only changes of commit f04ff73b28 - Show all commits

docs: copy-to-organizer + Email sent column
Some checks failed
lint.yml / docs: copy-to-organizer + Email sent column (pull_request) Failing after 0s

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYwoAkZZmXMMmaBp4WGUBo
Padreug 2026-09-13 17:41:12 +02:00

View file

@ -70,7 +70,7 @@ Events includes a shareable ticket scanner, which can be used to register attend
From display name — `extra.organizer_name` gives "Organizer via <site title>", From display name — `extra.organizer_name` gives "Organizer via <site title>",
otherwise the site title. Replies go to `extra.reply_to_email`, falling back otherwise the site title. Replies go to `extra.reply_to_email`, falling back
to the event owner's account email (no Reply-To when neither exists). The to the event owner's account email (no Reply-To when neither exists). The
From _address_ is always the instance mailbox, which is what DKIM signs. `POST /events/api/v1/tickets/{ticket_id}/resend-email` From _address_ is always the instance mailbox, which is what DKIM signs. `extra.copy_to_organizer` BCCs every ticket email to that reply-to address (envelope only, no header) so the organizer keeps a copy; the admin ticket table shows an "Email sent" column from `extra.email_notification_sent`. `POST /events/api/v1/tickets/{ticket_id}/resend-email`
returns a `TicketResendResult` with per-channel outcome. returns a `TicketResendResult` with per-channel outcome.
## Powered by LNbits ## Powered by LNbits

View file

@ -18,3 +18,4 @@ in an upstream-compatible form; strike it when the PR merges upstream.
| `Date` + `Message-ID` + From display name on the ticket email (`build_ticket_email`); event details in the body | `services.py` | lnbits/events (mailer) **and** lnbits/lnbits `send_email` (same omissions, hits password-reset/admin mails) | trivial, standalone — measured: SpamAssassin MISSING_DATE 1.4 + MISSING_MID 0.14 | | `Date` + `Message-ID` + From display name on the ticket email (`build_ticket_email`); event details in the body | `services.py` | lnbits/events (mailer) **and** lnbits/lnbits `send_email` (same omissions, hits password-reset/admin mails) | trivial, standalone — measured: SpamAssassin MISSING_DATE 1.4 + MISSING_MID 0.14 |
| Ticket card PNG (event/when/where/QR/name/id) attached to the ticket email instead of a remote `<img>` (`qr.py`, `GET /api/v1/ticket-card/{id}`) | `qr.py`, `services.py` | lnbits/events (their "ticket image" compositing could reuse the renderer) | standalone; mail-tester: removes HTML_IMAGE_ONLY (1.8) | | Ticket card PNG (event/when/where/QR/name/id) attached to the ticket email instead of a remote `<img>` (`qr.py`, `GET /api/v1/ticket-card/{id}`) | `qr.py`, `services.py` | lnbits/events (their "ticket image" compositing could reuse the renderer) | standalone; mail-tester: removes HTML_IMAGE_ONLY (1.8) |
| Per-event sender identity: `extra.organizer_name` (From display name "X via <site>") + `extra.reply_to_email` (Reply-To, falls back to owner account email) | `models.py`, `services.py`, admin dialog | lnbits/events | small, standalone | | Per-event sender identity: `extra.organizer_name` (From display name "X via <site>") + `extra.reply_to_email` (Reply-To, falls back to owner account email) | `models.py`, `services.py`, admin dialog | lnbits/events | small, standalone |
| `extra.copy_to_organizer` (envelope BCC of ticket emails to the reply-to) + "Email sent" column in the admin ticket table | `services.py`, `static/js/index.*` | lnbits/events | small, standalone |