evre
EN

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

FieldValue
Hostsmtp.evre.email (or your api host)
Port2525 / 587 (STARTTLS) or 465 (implicit TLS)
Usernameapikey (any non-empty value works)
PasswordProject API key (evre_…)
EncryptionSTARTTLS 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.