Operator guide
One Windows service. A safe operator CLI.
SMTPReady runs in the background under Windows Service Control Manager. Typing smtpready explains the next steps; it does not start a second relay. Use --help on a command for its current syntax.
smtpready
smtpready status
smtpready doctor
smtpready logs --since 30mStatus and retained evidence can explain a stopped service. Protected details require administrator access.First use
Configure deliberately.
Install the signed MSI, then open a new PowerShell window so the machine PATH is refreshed. Use ordinary PowerShell for help and version; open PowerShell as Administrator for protected setup and service operations.
Activate without exposing a keyEntitlement
The terminal prompt hides the license key. Never put it in command arguments, scripts, screenshots or transcripts. Automation can supply protected input with --stdin; close stdin after the bounded value. Installer possession alone grants no license.
smtpready license activate
smtpready license statusConfigure the host and Microsoft 365Setup
Choose the private host address and SMTP policy using host setup. Microsoft setup is a separate tenant-administrator operation, with one relay mailbox and a different out-of-scope mailbox for security proof. It stops the service during provisioning; accepted queue data is preserved. Pending Exchange propagation is not permission to broaden the application's mail scope.
smtpready setup --help
smtpready setup microsoft365 --help
smtpready doctor --liveLive doctor deliberately contacts providers and may send labelled diagnostic mail. Passive doctor does neither.
Allow a sender and test its real pathDevice
Add the sender's actual address or CIDR and mailbox policy. Treat any generated device password as a secret. Send from the actual scanner, printer or application: a local Graph test cannot prove its network admission, SMTP authentication or durable queue path.
smtpready device add --help
smtpready device listIncident response
Separate observations from delivery claims.
SCM Running proves process state, not mail readiness. Inspect intake, queue and delivery-block observations separately. Missing permissions or evidence mean unavailable, not healthy.
Service will not startWindows
Inspect status and recent startup evidence. Do not run a foreground relay, weaken ProgramData ACLs or read the protected admin token manually. Windows owns service start and stop.
Get-Service smtpready
smtpready status
smtpready logs --since 30mFind one accepted messageQueue
An SMTP 250 queued as UUID means durable local acceptance. Substitute that UUID for MESSAGE_ID below. Queue inspection shows attempts and the next scheduled retry; retained events may explain earlier attempts. An absent row proves neither Graph acceptance nor recipient delivery. A timeout can leave the outcome unknown and an at-least-once retry may duplicate mail.
smtpready queue list --limit 20
smtpready queue list --state retry --limit 20
smtpready queue show MESSAGE_ID
smtpready logs --message MESSAGE_IDUnderstand a direct Microsoft testGraph
This explicit operation sends labelled mail through Graph, bypassing SMTP intake and the durable queue. HTTP 202 means Graph accepted the request; it does not verify recipient delivery.
smtpready test microsoft365 --to operator@example.comRecover without replaying blindlyMutation
Correct the observed cause before retrying. queue delete MESSAGE_ID permanently deletes an eligible message; queue retry-all may send a burst. Both require terminal confirmation or deliberate --yes in scripts. JSON output is not consent. If a mutation response is lost, inspect first: failure to receive an acknowledgement does not prove rollback.
Restart, upgrade and collect support evidenceLifecycle
Use native PowerShell service operations after diagnosing the cause. Normal MSI upgrade and uninstall preserve queue and configuration; explicit data purge is destructive. Support collection asks the running service for a protected redacted ZIP and never uploads it. If the service is down, collect the accessible SCM and startup evidence instead. Do not send message bodies, keys or passwords.
Restart-Service smtpready
smtpready support-bundle createFor automation, --json returns one versioned document. Queue and device lists use an entries array; in PowerShell, read (smtpready queue list --json | ConvertFrom-Json).entries. Check the exit code before using the result. JSON output never supplies mutation consent.