Replaces "clear intro after first send", which dropped the message
for any subscriber still queued on a slower cadence.
- Each non-empty admin save bumps a per-locale version counter on
the tree. The dispatcher includes the intro only for recipients
whose last-seen version is behind, then advances their watermark
after a successful send. Webtrees users get a per-user watermark;
external addresses share one tree-level watermark. Re-saving the
same text is a no-op.
- The preferences page now shows delivery progress per locale:
"Delivered to X of Y subscriber(s)" plus a collapsible Pending
list with name + email of each subscriber who hasn't received
the current intro yet, and a single "External recipients (N)"
row when the external watermark is behind.
- README rewritten to reflect every feature shipped since the
initial commit (BockenTheme skin, embedded avatars, relationship
labels, kin-distance filter, per-user cadence, bilingual subject
prefix, locale-aware subject date, SiteUser as From, three
subscriber sources, Markdown intro with personalisation tokens).
Recurring email newsletter for webtrees 2.2+. Each enabled tree
sends upcoming birthdays of living individuals, optional marriage
anniversaries of intact couples, and a once-per-calendar-month
historical section of births and deaths of deceased individuals.
Triggered exclusively by an external scheduler (system cron,
systemd timer, etc.) hitting a token-gated HTTP endpoint — never
on visitor page loads. The "is it due?" decision is idempotent
within the configured frequency window.
Per-user subscription is integrated into the built-in
/my-account/{tree} page via a custom view + a decorated
AccountUpdate handler. Admins can add external addresses and
trigger an immediate send for testing. Email body renders in
German for German-language users; English otherwise. Birthdays
and anniversaries are formatted with the upcoming-event ordinal
age (e.g. "45th birthday" / "45. Geburtstag").