Skip to main content
Three commands cover most of what goes wrong, and none of them sends a message.

Checking the environment

It checks the binary and SDK versions, the config file, both credentials, proxy and custom CA settings, and what your terminal can render. --offline skips anything that needs a network. Warnings do not fail it. Someone who never uses SMTP can live with an unconfigured SMTP credential, so doctor exits 0 with warnings and 5 only when a check actually failed. --strict promotes warnings to failures, for a caller who wants a clean environment or nothing:
doctor is also the one command that writes its full report to stdout even when it exits non-zero. Everywhere else, a failure leaves stdout empty. The report is the part that names which check broke. See Exit codes.

Testing SMTP

That opens a connection to the submission host, reads its capabilities, and stops. No message is submitted. Adding --auth also attempts a sign-in and immediately disconnects, which puts a credential on the wire but never a message:
--host, --port, --tls and --user override the stored values for one run, which is how you check a credential before you store it. The defaults are port 587 with starttls.
Repeated failed sign-ins can get your IP blocked. If --auth fails, fix the credential before running it again.

Finding the right dashboard page

It prints every area the CLI does not manage, with a link to each. Typing a command the CLI deliberately does not have gets you the same pointer:
That exits 2 and tells you where domain setup lives.

Understanding a specific failure

It explains SMTP status codes too, so mailkube errors explain 550 works. --list dumps everything it knows. See Errors and exit codes.

Common situations

A send is rejected with from_domain_not_allowed. The --from address is on a domain that is not verified, or not verified for this API key. Check it in Domains. --transport smtp fails with no credential. There is no fallback to REST by design. Store one with mailkube auth login --smtp, or use the API transport. Output is JSON when you wanted the readable version. Something is capturing stdout, which flips the format. Force it with -o text. A listing stops part-way with exit 7. --all walked into the rate limit. Filter the listing first, then walk it. See Paging. A repeated send did nothing. An idempotency key was reused inside its 24-hour window, so the server replayed the original response. The result carries "replayed": true. Verbose output would help. -v logs more, and -vv logs the SDK’s own requests and responses.

Getting help

Quote the output of mailkube version and, when a request reached the API, the request id from the error report. That id is what makes a specific call findable.