Skip to content

v0.26.0

Choose a tag to compare

@heliocosta-dev heliocosta-dev released this 27 Oct 22:08
· 33 commits to main since this release
5a8a380

MillionSend v0.26.0 changes three things. Teams on Scale can add 100 sending domains an hour, up from 10 (#211). Every rate limit and quota refusal now says when to try again (#211). Header values and subjects with quotes now go out as written, so OTP-Token headers can be sent (#209). No database migrations.

Domains

  • Scale adds 100 domains an hour (#211). Every other plan stays at 10, counted per team and reset at each full UTC hour. A refusal is 429 rate_limit_exceeded with retry-after (the seconds to the next hour). The dashboard now tells you how many minutes are left. Self-hosted instances have no hourly limit, as before.
  • A failed add no longer blocks the name (#211). If SES created a domain's identity but setting its MAIL FROM failed, the identity used to stay in SES with nothing recording it. Every later attempt to add that name was then refused as "domain already registered". The identity is now removed before the error is returned, so retrying works.

Retry-After everywhere (#211)

Every 429 now carries retry-after, in whole seconds:

  • API: monthly_quota_exceeded (POST /emails, the batch endpoint and inbox sends) counts down to the end of the billing period. The hourly domain limit counts to the next hour. Per-key and per-team limits, failed sign-ins, daily quotas and inbox limits already sent retry-after and are unchanged.
  • MCP: the per-person limit on /mcp now gives the seconds left in its minute instead of a fixed 60. Any tool call the API refuses with retry-after now also includes the wait as retry_after in the tool's error.
  • Dashboard and sign-in:
    • The dashboard's own limits now send retry-after: adding domains, console codes, webhook test deliveries, broadcast test sends, invitations and inbox refusals.
    • Sign-in rate limits answer with a standard retry-after; before, only the nonstandard X-Retry-After was set.
    • The daily cap on accounts per network now sends retry-after too.
  • Docs: the API reference lists what each 429's retry-after counts down to.

A forward from an inbox that the monthly quota refuses still ends there and isn't retried at renewal.

Headers (#209)

  • Quoted values go out as written. Printable-ASCII header values and subjects that contain a double quote are no longer RFC 2047-encoded. A structured header like OTP-Token: "123456"; origin="https://example.com" now reaches receivers as sent. Subjects with quotes no longer trip Rspamd's SUBJ_EXCESS_QP. Non-ASCII text is encoded as before.
  • OTP-Token is an allowed custom header. An allowed header name given twice in different letter cases is now a 422 instead of two fields. SES refuses a second copy of those headers anyway. X-* names may still repeat.

Upgrading a self-hosted instance

Pull the new image and restart. No migrations and no configuration changes.