SMTP
Legacy apps and tools that only speak SMTP can submit through the same control plane as POST /emails (verified-from, suppressions, ramp, tracking, SES).
Enable
On the api process (Coolify / Docker — not serverless):
EVRE_SMTP_ENABLED=1
EVRE_SMTP_PORT=2525 # optional; 587 is common with STARTTLS
Expose TCP 2525 or 587 on the api container in Coolify. Hostname example: smtp.evre.email → that port.
TLS (STARTTLS)
Provide a certificate for the SMTP hostname:
EVRE_SMTP_TLS_CERT="-----BEGIN CERTIFICATE-----..."
EVRE_SMTP_TLS_KEY="-----BEGIN PRIVATE KEY-----..."
# or file paths on the container:
# EVRE_SMTP_TLS_CERT_FILE=/certs/fullchain.pem
# EVRE_SMTP_TLS_KEY_FILE=/certs/privkey.pem
When both resolve, the server advertises STARTTLS and requires TLS before AUTH.
Without cert material, AUTH is allowed on plaintext (private network / edge terminator only). Prefer STARTTLS (or implicit TLS below) in production.
Implicit TLS (port 465)
Some clients/libraries only support implicit TLS (TLS immediately on connect — no STARTTLS negotiation). Run a second listener for them alongside STARTTLS, using the same cert/key:
EVRE_SMTP_IMPLICIT_TLS_ENABLED=1
EVRE_SMTP_IMPLICIT_TLS_PORT=465 # optional; 465 is the SMTPS convention
Requires EVRE_SMTP_TLS_CERT/EVRE_SMTP_TLS_KEY (or *_FILE) — implicit TLS has no
plaintext fallback, so the api process refuses to start this listener without a cert.
Expose TCP 465 on the api container in Coolify alongside 2525/587.
Credentials
| Field | Value |
|---|---|
| Host | smtp.evre.email (or your api host) |
| Port | 2525 / 587 (STARTTLS) or 465 (implicit TLS) |
| Username | apikey (any non-empty value works) |
| Password | Project API key (evre_…) |
| Encryption | STARTTLS when TLS env is set; implicit TLS on 465 when enabled |
Example (nodemailer)
import nodemailer from "nodemailer";
// STARTTLS (587)
const transport = nodemailer.createTransport({
host: "smtp.evre.email",
port: 587,
secure: false,
requireTLS: true,
auth: {
user: "apikey",
pass: process.env.EVRE_API_TOKEN!,
},
});
// Implicit TLS (465) — same credentials, secure: true instead
const transportImplicit = nodemailer.createTransport({
host: "smtp.evre.email",
port: 465,
secure: true,
auth: {
user: "apikey",
pass: process.env.EVRE_API_TOKEN!,
},
});
await transport.sendMail({
from: "Acme <hello@mail.example.com>",
to: "user@example.com",
subject: "Hello",
html: "<p>via SMTP</p>",
});
Limits
Same as the HTTP send path: verified From domain, attachment caps, suppressions, trust quotas. Scheduling and templateId are not supported over SMTP — use the REST API for those.