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.
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 }
});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:
| Code | Meaning | What your system should do |
|---|---|---|
| 250 | Accepted for sending. | Nothing. The outcome arrives by webhook. |
| 451 | Temporary failure or rate limit. | Retry. Your queue already does this on its own. |
| 530 | No authentication. | Configure username and password. |
| 535 | Invalid credential. | Check the token and the email:send scope. |
| 550 | Permanent refusal. | Fix and resend. The phrase says what to fix. |
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.