Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.76.0] - 2026-06-09

### Removed
- **BigQuery delivery reconciliation.** Removed `reconciliation.py`, the
`reconcile_email_delivery` Celery task, and the optional `reconciliation`
extra (`google-cloud-bigquery`). Delivery truth no longer comes from the
Workspace Gmail log: mail is moving off the Gmail API onto an authenticated
ESP (Mailjet) whose own event feed reports delivered/bounced/blocked
directly.
- Consuming projects should drop the `EMAIL_RECONCILIATION` setting and any
Celery beat entry for `django_forms_workflows.reconcile_email_delivery`.

### Retained
- The `NotificationLog` delivery-tracking columns (`rfc2822_message_id`,
`delivery_state`, `delivery_checked_at`, `delivery_detail`) and the
Message-ID stamping are kept — they are ESP-agnostic and will be repopulated
from the Mailjet event feed. No migration change.

## [0.75.1] - 2026-06-08

### Added
Expand Down
4 changes: 3 additions & 1 deletion django_forms_workflows/email_backends/gmail_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,9 @@ def _build_mime_message(self, email_message):
# one we never see. Skip headers already set above so a caller can't
# accidentally duplicate To/From/Subject.
already_set = {k.lower() for k in msg.keys()}
for header, value in (getattr(email_message, "extra_headers", None) or {}).items():
for header, value in (
getattr(email_message, "extra_headers", None) or {}
).items():
if not value or header.lower() in already_set:
continue
msg[header] = value
Expand Down
Loading
Loading