Quathos Mailer

SMTP relay

smtp.qsendyx.com on port 587, STARTTLS, your API token as the password. Every system speaks SMTP — migrating is four lines of configuration, no SDK.

Connect

The username is apikey — by convention, and it is ignored; the proof is the token, which needs the email:send scope. AUTH is only offered after STARTTLS, so the token never crosses the network in the clear, and there is no open relay: without authentication, no MAIL FROM is accepted, in any environment.

text
Host:     smtp.qsendyx.com
Port:     587   (STARTTLS)
Username: apikey
Password: qmx_live_...   (your API token, with the email:send scope)
const transport = nodemailer.createTransport({
  host: 'smtp.qsendyx.com',
  port: 587,
  auth: { user: 'apikey', pass: process.env.QSENDYX_API_KEY }
});
Use a qmx_test_ token while integrating: it walks the whole pipeline — validation, template, suppression, webhook, event — without delivering to a real recipient and without spending balance.

What happens to your message

It becomes exactly what the HTTP API would create — same rules, same records, same webhooks. What arrives over SMTP shows up in GET /api/v1/email/messages next to everything else.

One recipient per message: each address in the envelope becomes an independent message, with its own id, status, cost and suppression. That is why Bcc works — what counts is the envelope (RCPT TO), not the header. The 250 that answers DATA ends with the id of the first message: it is what links your system's log line to the message here.

Response codes

Your mail system reads the code, not the phrase. These were chosen with that in mind:

CodeMeaningWhat your system should do
250Accepted for sending.Nothing. The outcome arrives by webhook.
451Temporary failure or rate limit.Retry. Your queue already does this on its own.
530No authentication.Configure username and password.
535Invalid credential.Check the token and the email:send scope.
550Permanent refusal.Fix and resend. The phrase says what to fix.
An error on your side never comes back as a 4xx temporary code — answering "temporary" to something permanent would make your server retry forever. And a failure on our side never comes back as 5xx: it would lose a message that would go out the next minute.

Limits and what is not supported

  • Attachments, not yet: the message is refused with 550 and the reason — delivering the email without the attachment, with a 250 on the wire, would be worse.
  • 100 recipients per message, 10 MB per message.
  • Your token's rate limit applies here too. A credential does not escape its ceiling by entering through another door.
  • An unverified sender and a suppressed recipient are refused, as in the API.
  • Port 587, never 25 — 25 is server-to-server, carries no authentication, and most cloud providers block it outbound.
If a token leaks, revoke it in the panel: it stops working on the API and on SMTP at the same time, because it is the same credential.