Disable UniSender message tracking explicitly
Some checks are pending
Quality / full-local-gates (push) Waiting to run

This commit is contained in:
SimpleTest 2026-07-21 15:43:55 +03:00
parent e72aaf9b73
commit 8baa9abc13
4 changed files with 37 additions and 21 deletions

View File

@ -387,6 +387,9 @@ idempotence key, redacts rejected recipient addresses from returned errors, and
uses only HTTPS. The provider documents the endpoint, `X-API-KEY` header, uses only HTTPS. The provider documents the endpoint, `X-API-KEY` header,
response shape, and one-minute/64-character idempotence-key behavior in its response shape, and one-minute/64-character idempotence-key behavior in its
[Web API reference](https://godocs.unisender.ru/web-api-ref). [Web API reference](https://godocs.unisender.ru/web-api-ref).
Every request explicitly sets `track_links` and `track_read` to `0`; UniSender
Go otherwise enables both by default. The provider account must be allowed to
honour those values, so verify a delivered message's raw HTML before launch.
## Isolated restore drill ## Isolated restore drill

View File

@ -1114,37 +1114,46 @@ availability, or target-server capacity.
filtering occurs. filtering occurs.
- `WhoNeedHelp.Email.UnisenderGoAdapter` now maps the application's existing - `WhoNeedHelp.Email.UnisenderGoAdapter` now maps the application's existing
Swoosh messages to the provider's HTTPS `email/send.json` contract. Six Swoosh messages to the provider's HTTPS `email/send.json` contract. Six
focused tests passed for the exact request shape and API-key header, success, focused tests passed for the exact request shape (including explicit
redacted recipient rejection, structured API errors, invalid responses, and `track_read=0` and `track_links=0`) and API-key header, success, redacted
rejection of unsupported or provider-invalid messages before network I/O. recipient rejection, structured API errors, invalid responses, and rejection
of unsupported or provider-invalid messages before network I/O.
Runtime configuration and production Runtime configuration and production
environment validation can select either `smtp` or `unisender_go` without environment validation can select either `smtp` or `unisender_go` without
requiring SMTP settings in API mode. requiring SMTP settings in API mode.
- UniSender Go's account settings were saved with read/open tracking and link - Authoritative DNS and the provider UI both showed the sending domain as
tracking disabled, then reloaded and observed still disabled. The provider's verified with DKIM active, while the delegated link domain showed configured.
unsubscribe-link setting remains enabled and locked; disabling it requires A second real Web API message was accepted for one recipient with no rejected
provider approval and has not been claimed. recipients and reached Gmail's Inbox after one second. Gmail's original
- A real email has not yet been submitted through the new adapter. The sending message view reported SPF PASS, DKIM PASS with `d=whoneedhelp.com` and
domain's UniSender Go verification/DKIM records were issued but are not yet selector `gokey`, and DMARC PASS.
present in authoritative DNS, so end-to-end delivery remains unproven. - The delivered MIME still contained the provider's one-pixel
`go2_read_tracker` even though the request explicitly supplied
`track_read=0` and `track_links=0`. UniSender Go documents that honoring those
zero values, and using `skip_unsubscribe=1`, requires provider approval. A
support request covering all three permissions was sent to the official
support address from the account mailbox. Privacy-disable behavior and
unsubscribe removal remain unverified until the provider enables them and a
new delivered MIME is inspected.
## Known work before a public production launch ## Known work before a public production launch
- Replace the temporary staging origin with the production-owned domain and - Replace the temporary staging origin with the production-owned domain and
production infrastructure. The temporary origin is available only while the production infrastructure. The temporary origin is available only while the
workstation, Compose stack, VPN path, gateway, and their networks are up. workstation, Compose stack, VPN path, gateway, and their networks are up.
- Create a production Android signing identity, publish - Confirm the final Android application ID before creating its Play Console
`/.well-known/assetlinks.json` for the final application ID/fingerprint if listing, publish `/.well-known/assetlinks.json` for that ID and the final
verified App Links are wanted, and complete store policy/release work. signing fingerprint if verified App Links are wanted, and complete store
policy/release work. A dedicated upload key and signed APK/AAB have been
created and verified locally, but no Play application has been registered.
- Operate PostgreSQL/PostGIS with off-site backups, recovery testing, monitoring, - Operate PostgreSQL/PostGIS with off-site backups, recovery testing, monitoring,
and the availability model selected for real usage. and the availability model selected for real usage.
- Publish and verify the issued UniSender Go SPF, DKIM, domain-validation, - After provider approval, verify that delivered MIME contains neither open nor
DMARC, and link-domain DNS records, then exercise registration and magic-link link tracking and omits the unsubscribe block, then exercise registration and
delivery through the selected HTTPS provider to a real mailbox. magic-link delivery through the deployed application to a real mailbox.
- Create a Google OAuth Web client for the final owned HTTPS origin, configure - Deploy the already configured production and staging Google OAuth clients,
its exact `/auth/google/callback` redirect, and exercise registration, then exercise registration, sign-in, and settings linking against Google on
sign-in, and settings linking against Google if Google authentication is to their exact HTTPS callback origins.
be enabled. The feature remains disabled when both credentials are empty.
- Configure and verify a real mobile push provider and device-token lifecycle - Configure and verify a real mobile push provider and device-token lifecycle
if native push is required. The provider-neutral HTTP boundary and product if native push is required. The provider-neutral HTTP boundary and product
jobs are tested; FCM/APNs device delivery is not. jobs are tested; FCM/APNs device delivery is not.

View File

@ -93,6 +93,8 @@ defmodule WhoNeedHelp.Email.UnisenderGoAdapter do
"from_email" => elem(email.from, 1), "from_email" => elem(email.from, 1),
"from_name" => elem(email.from, 0), "from_name" => elem(email.from, 0),
"body" => message_body(email), "body" => message_body(email),
"track_links" => 0,
"track_read" => 0,
"idempotence_key" => idempotence_key(email) "idempotence_key" => idempotence_key(email)
} }
|> maybe_put_reply_to(email.reply_to) |> maybe_put_reply_to(email.reply_to)

View File

@ -76,7 +76,9 @@ defmodule WhoNeedHelp.Email.UnisenderGoAdapterTest do
"recipients" => [%{"email" => "helper@example.com"}], "recipients" => [%{"email" => "helper@example.com"}],
"reply_to" => "support@whoneedhelp.com", "reply_to" => "support@whoneedhelp.com",
"reply_to_name" => "Support", "reply_to_name" => "Support",
"subject" => "Confirmation instructions" "subject" => "Confirmation instructions",
"track_links" => 0,
"track_read" => 0
} }
} }
end end