Do not disturb
A SithBit account can carry an away schedule — do-not-disturb windows
managed through any of the GUI clients (or the
account service directly) and evaluated in the
account’s own timezone. While a window is active, the recipient’s
sithbitd does something deliberately
different from the classic vacation autoresponder: it refuses the mail up
front, at RCPT time, with a transient 450 4.2.1 — instead of
accepting the message and firing an “I’m away” reply back at the sender.
450 4.2.1 Recipient alice is away (do not disturb); try again later
That one design choice does most of the work of this page, so it is worth spelling out.
Why refuse instead of autoreply
- The sender’s mail server does the waiting. A
450is SMTP for “not now”: the sender’s MTA queues the message and retries on its own schedule, transparently, for days. When the away window ends, the queued mail simply arrives — the sender resends nothing and installs nothing. An autoresponder cannot offer this; it accepts the mail and leaves the sender to guess whether anyone will read it. - Nothing piles up while you are away. Accept-and-autoreply means coming home to a stack of stale unread mail — and, on SithBit, to a stack of postage decisions with it, since every delivered message carries prepaid postage that settles when you delete it. It also means the pile is there, one login away, for the whole vacation. Refusing at the door keeps the mailbox genuinely quiet: no backlog to triage on return, and no temptation to “just check” business mail from the beach.
- The sender learns at send time. An autoreply may arrive, may be eaten by a spam filter, or may never have been configured — the classic bounce-or-silence lottery. A refusal reaches the sender through their own mail server’s queue notice the moment they send, while the message is still fresh in their mind.
- A refusal costs the sender nothing. The refusal happens before the message is accepted, so no stamp is burned and nothing needs refunding. (The postage gate still runs first — the away check only fires for a sender who could otherwise deliver.)
Two honest caveats. The schedule lives in the operator’s account store and is
enforced by the recipient’s sithbitd — this is server-side behavior, not an
on-chain guarantee. And DND fails open: if the store hiccups mid-lookup,
the server accepts the mail rather than refusing something deliverable —
do-not-disturb is a courtesy, not a security boundary.
What the refused sender sees
Out of the box, the refusal is the single line above and nothing more. When the operator sets a self-service base URL, the same line also carries a link to a schedule page the sender can open in a browser:
450 4.2.1 Recipient alice is away (do not disturb); try again later; schedule at https://mail.example.com/dnd.html?to=alice%40sithbit.net
The page answers the question the refusal raises — when should I expect delivery? — as far as the recipient allows:
- Accepting now. If the away window has already ended, the page says so: the sender’s MTA is retrying on its own, so the mail is on its way (or a resend delivers immediately).
- Away, schedule private (the default). The page confirms the recipient is temporarily not accepting mail but cannot say when the window ends — the sender’s server keeps retrying regardless.
- Away, schedule shared. If the recipient opted in to sharing, the page lists the away windows — and, when the schedule ever reopens, adds “accepting mail again at …” with the exact resume instant shown in the sender’s own local time (the account service computes it in the recipient’s timezone and ships it as UTC; the page localizes it to the viewer’s clock). The windows themselves still read in the recipient’s local time. A recurring schedule covering the whole week around the clock never reopens, so no instant exists — the page then shows the windows alone.
Sharing is the recipient’s choice, off by default: the account’s
expose_dnd_schedule flag (a toggle in the clients’ DND settings, or
PATCH /v1/account on the account API) controls
whether the anonymous schedule check returns the windows themselves — plus,
while away, the resume instant — or only the yes/no “away right now” answer.
Your calendar is yours; the protocol only ever needs the boolean.
Stamp refusals: the funding page
The same setting links a second page from the two postage refusals — the gate every unknown sender meets before DND is even consulted:
450 4.7.0— the sender’s frombox exists but holds no stamps. Transient: the sender’s MTA queues and retries, so once the frombox is funded the queued mail delivers on its own — no resend needed.550 5.7.0— no frombox exists for this sender/recipient pair at all. Permanent: the message bounced for good, so after funding the sender must send it again.
With the base URL set, both append ; fund it at {base}/fund.html?to=<recipient>&from=<sender> — a funding page where the
sender fixes the shortage themselves, with no account and no operator in the
loop:
- The page resolves the recipient and quotes the price straight off the chain — the recipient’s per-stamp postage, the fixed settlement surcharge, and the live per-stamp protocol fee (waived on-chain when a recipient funds their own frombox). Nothing is trusted server-side; the quote is read from the same accounts the program enforces.
- The sender connects a Phantom or Ledger wallet, picks a stamp count (one stamp = one email), and buys. A first purchase creates the frombox in the same transaction — the same create-or-top-up path every client uses.
- The page confirms the purchase and tells the sender what happens next:
after a
450, waiting is enough; after a550, resend.
This closes the loop postage opens: pricing out strangers only works as spam defence if a legitimate stranger has a way to pay, and the refusal itself now hands them one.
For operators: one setting, two pages
Everything above is off by default — leaving the setting unset keeps
every refusal byte-identical to the linkless text. A single SMTP setting
turns both links on: the public base URL the two pages are served from
(for example https://mail.example.com). There is nothing else to
configure — the paths and query strings are built for you.
See the configuration
reference
for the details, and Self-service pages for refused
senders for how the
two pages are hosted (they ship in the onboarding web bundle, normally served
by the account API’s static-file root). The standalone smtp-server dev
binary carries only the funding link — the DND gate is sithbitd’s.
Related
- Getting mail — the receive side the away schedule protects.
- Add stamps — the CLI flavor of what the funding page does, and the exact per-stamp price breakdown.
- Economics — why postage prices out spam, and where the protocol fee goes.
- account-api: the account service — the DND
schedule routes and the
expose_dnd_scheduleopt-in. - Configuration reference — the operator setting.