Platform

SMTP relay

.md

Send email through TickOS from any app or library that speaks SMTP.

The SMTP relay lets existing apps, frameworks and tools (WordPress, Laravel, Django, nodemailer, monitoring tools, ...) send email through TickOS without using the REST API. Messages go out through the same infrastructure and rules as POST /v1/emails, and every send is logged in the dashboard (Settings > SMTP).

Connection settings

SettingValue
Hostsmtp.tickos.dev
Port587
EncryptionSTARTTLS (connect in plain text, then upgrade). Set secure: false / use_tls in most libraries.
Usernametickos_user (always this literal value, not your email)
PasswordA TickOS API key (sk_...)
Max message size25 MB

Any active API key of the workspace works as the password; the key determines which workspace the message is sent from and is charged to. Create a dedicated key for SMTP in Settings > API Keys so you can revoke it independently. A revoked or deactivated key stops working immediately (535).

Sending rules

Each message is checked before delivery with the same rules as the Emails API:

  • Sender: both the envelope sender (MAIL FROM) and the From header must be on a verified sending domain of the workspace (Settings > Domains). The domain must match exactly; a subdomain needs its own verification.
  • Recipients: at most 50 unique recipients per message (To, Cc and Bcc combined).
  • Plan limits: monthly email quota plus the daily and hourly sending limits of your plan. Each accepted message counts as 1 email toward the monthly quota.
  • Suppressed recipients (previous hard bounces or undeliverable addresses) are skipped silently; the rest of the message is delivered. If every recipient is suppressed, the message is rejected.
  • Workspaces whose email sending is suspended cannot send.
  • A null sender (MAIL FROM:<>) is not allowed.

Open and click tracking

Tracking is off by default. Add these headers to the message to enable it. They are removed before delivery and only apply to messages with an HTML part.

HeaderEffect
X-Track-Opens: trueAdds a 1x1 tracking pixel to the HTML body.
X-Track-Clicks: trueRewrites links in the HTML body to track clicks before redirecting.

Tracked messages are stored as outbound emails in the workspace so their opens and clicks can be reported.

SMTP response codes

Rejections are returned as standard SMTP replies during the session, so your client or library surfaces them as send errors. 4xx codes are temporary (retry later); 5xx are permanent (do not retry without fixing the cause).

CodeMeaning
535Invalid credentials: username is not tickos_user, the API key does not exist, or the key is revoked or inactive.
553Sender not allowed: the From / MAIL FROM domain is not a verified sending domain of the workspace, the address is invalid, or the sender is null.
550Sending suspended for the workspace, all recipients are suppressed, or the message was rejected by the mail provider.
552Message exceeds 25 MB.
452Too many recipients (more than 50) or a plan sending limit was reached (monthly, daily or hourly).
451Temporary error. Retry later.
454Temporary authentication error. Retry later.

Examples

Node.js (nodemailer)

example.js
JavaScript
01import nodemailer from 'nodemailer'
02 
03const transporter = nodemailer.createTransport({
04 host: 'smtp.tickos.dev',
05 port: 587,
06 secure: false, // STARTTLS
07 auth: {
08 user: 'tickos_user',
09 pass: process.env.TICKOS_API_KEY, // sk_...
10 },
11})
12 
13await transporter.sendMail({
14 from: '"Acme Support" <support@yourdomain.com>',
15 to: 'jane@example.com',
16 subject: 'Your invoice is ready',
17 html: '<p>Hi Jane, <a href="https://yourdomain.com/invoices/42">view your invoice</a>.</p>',
18 headers: { 'X-Track-Opens': 'true', 'X-Track-Clicks': 'true' },
19})
UTF-8 · LF · JavaScripttickos.dev

Python (smtplib)

example.py
Python
01import os
02import smtplib
03from email.message import EmailMessage
04 
05msg = EmailMessage()
06msg['From'] = 'Acme Support <support@yourdomain.com>'
07msg['To'] = 'jane@example.com'
08msg['Subject'] = 'Your invoice is ready'
09msg['X-Track-Opens'] = 'true'
10msg.set_content('Hi Jane, your invoice is ready.')
11msg.add_alternative('<p>Hi Jane, your invoice is ready.</p>', subtype='html')
12 
13with smtplib.SMTP('smtp.tickos.dev', 587) as server:
14 server.starttls()
15 server.login('tickos_user', os.environ['TICKOS_API_KEY'])
16 server.send_message(msg)
UTF-8 · LF · Pythontickos.dev

Command line (swaks)

terminal
Bash
01swaks --server smtp.tickos.dev --port 587 --tls \
02 --auth-user tickos_user --auth-password "$TICKOS_API_KEY" \
03 --from support@yourdomain.com --to jane@example.com \
04 --header "Subject: SMTP test from TickOS" \
05 --body "It works."
UTF-8 · LF · Bashtickos.dev

Framework settings (e.g. Laravel .env)

terminal
Bash
01MAIL_MAILER=smtp
02MAIL_HOST=smtp.tickos.dev
03MAIL_PORT=587
04MAIL_USERNAME=tickos_user
05MAIL_PASSWORD=sk_your_api_key
06MAIL_ENCRYPTION=tls
07MAIL_FROM_ADDRESS=support@yourdomain.com
UTF-8 · LF · Bashtickos.dev
SMTP or API?
Use SMTP when a tool only supports SMTP. For new integrations prefer POST /v1/emails (/docs/emails): it supports scheduling (send_at), metadata and attachments as JSON, and returns the email ID for status tracking.