chore(email): decommission SMTP2GO references — local MTA only

SMTP2GO is no longer used: Listmonk relays through the local Postfix MTA
(172.18.0.1:25 from the Docker network), which DKIM-signs and delivers
direct-to-recipient-MX; transactional mail goes through Carbonio. Verified
zero smtp2go in any live container env + postfix has no external relayhost.

Removed the stale references so a rebuild/new dev can't re-introduce it:
- api/src/config.ts: SMTP_HOST default mail.smtp2go.com -> co.carrierone.com
- scripts/workers/crypto_payment_worker.py: same default fix
- infra/ansible all.yml: listmonk_smtp_* now 172.18.0.1:25, no auth (+comment)
- app.env.j2 / email.ts / crm.md / go-live-todo.md / architecture.svg: docs
This commit is contained in:
justin 2026-06-17 22:46:59 -05:00
parent eba525f83f
commit a04ecf7df3
8 changed files with 18 additions and 14 deletions

View file

@ -99,7 +99,7 @@ function loadConfig(): Config {
webhookSecret: optional("STRIPE_WEBHOOK_SECRET", ""), webhookSecret: optional("STRIPE_WEBHOOK_SECRET", ""),
}, },
smtp: { smtp: {
host: optional("SMTP_HOST", "mail.smtp2go.com"), host: optional("SMTP_HOST", "co.carrierone.com"),
port: parseInt(optional("SMTP_PORT", "587"), 10), port: parseInt(optional("SMTP_PORT", "587"), 10),
user: optional("SMTP_USER", ""), user: optional("SMTP_USER", ""),
pass: optional("SMTP_PASS", ""), pass: optional("SMTP_PASS", ""),

View file

@ -6,7 +6,7 @@
* - Portal access link emails (JWT-signed links) * - Portal access link emails (JWT-signed links)
* *
* All transactional emails go through Carbonio: co.carrierone.com:587 * All transactional emails go through Carbonio: co.carrierone.com:587
* (SMTP2GO is used only by Listmonk for mass-mail campaigns.) * (Listmonk mass-mail relays through the local Postfix MTA, not this path.)
* Env vars: SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM * Env vars: SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM
*/ */

View file

@ -165,7 +165,7 @@
<rect x="487" y="524" width="72" height="18" rx="3" fill="#fed7aa" stroke="#f97316"/> <rect x="487" y="524" width="72" height="18" rx="3" fill="#fed7aa" stroke="#f97316"/>
<text x="523" y="537" text-anchor="middle" font-size="8" fill="#9a3412">Anytime MB</text> <text x="523" y="537" text-anchor="middle" font-size="8" fill="#9a3412">Anytime MB</text>
<rect x="564" y="524" width="72" height="18" rx="3" fill="#e0f2fe" stroke="#7dd3fc"/> <rect x="564" y="524" width="72" height="18" rx="3" fill="#e0f2fe" stroke="#7dd3fc"/>
<text x="600" y="537" text-anchor="middle" font-size="8" fill="#0c4a6e">SMTP2GO</text> <text x="600" y="537" text-anchor="middle" font-size="8" fill="#0c4a6e">Local MTA</text>
<rect x="641" y="524" width="72" height="18" rx="3" fill="#f1f5f9" stroke="#cbd5e1"/> <rect x="641" y="524" width="72" height="18" rx="3" fill="#f1f5f9" stroke="#cbd5e1"/>
<text x="677" y="537" text-anchor="middle" font-size="8" fill="#475569">TronGrid</text> <text x="677" y="537" text-anchor="middle" font-size="8" fill="#475569">TronGrid</text>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before After
Before After

View file

@ -270,7 +270,7 @@ store customer orders or tickets — ERPNext is the CRM source of truth.
3. Listmonk tracks email opens/clicks and manages subscriber lists 3. Listmonk tracks email opens/clicks and manages subscriber lists
4. Bounce processing via POP3 from Carbonio (`co.carrierone.com`) 4. Bounce processing via POP3 from Carbonio (`co.carrierone.com`)
**Mass email:** SMTP2GO is used for Listmonk campaign sends (not Carbonio — Carbonio is for transactional email only). **Mass email:** Listmonk campaign sends relay through the local Postfix MTA (172.18.0.1:25 from the Docker network), which DKIM-signs and delivers direct-to-recipient-MX. Carbonio (co.carrierone.com) is for transactional email only. (SMTP2GO was decommissioned — no external relay is used.)
**Campaigns:** **Campaigns:**

View file

@ -140,7 +140,7 @@
## PRIORITY 7 — Listmonk (Email Marketing) ~~COMPLETE~~ ## PRIORITY 7 — Listmonk (Email Marketing) ~~COMPLETE~~
- [x] Deploy Listmonk at lists.performancewest.net (Docker, PostgreSQL-backed) - [x] Deploy Listmonk at lists.performancewest.net (Docker, PostgreSQL-backed)
- [x] Configure SMTP2GO outbound email (separate from Carbonio transactional SMTP) - [x] Configure Listmonk mass-mail via the local Postfix MTA (SMTP2GO decommissioned; separate from Carbonio transactional SMTP)
- [x] Import 10,191 FCC RMD contacts into Listmonk (3 subscriber lists) - [x] Import 10,191 FCC RMD contacts into Listmonk (3 subscriber lists)
- [x] Configure bounce processing via POP3 from Carbonio (bounces@performancewest.net) - [x] Configure bounce processing via POP3 from Carbonio (bounces@performancewest.net)
- [x] Create 22 scheduled campaigns across 4 lists - [x] Create 22 scheduled campaigns across 4 lists

View file

@ -80,13 +80,17 @@ smtp_pass: "{{ vault_smtp_pass }}"
smtp_from: "Performance West <noreply@performancewest.net>" smtp_from: "Performance West <noreply@performancewest.net>"
smtp_admin_email: ops@performancewest.net smtp_admin_email: ops@performancewest.net
# ── Listmonk (mass-mail via SMTP2GO) ───────────────────────────────────────── # ── Listmonk (mass-mail via the LOCAL MTA) ───────────────────────────────────
# Listmonk SMTP is configured via its web admin UI, not env vars. # Listmonk SMTP is configured via its web admin UI, not env vars. Listmonk relays
# These vars are kept here for documentation and manual reference. # through the host Postfix (172.18.0.1:25 from inside the Docker network), which
listmonk_smtp_host: mail.smtp2go.com # DKIM-signs and delivers direct-to-recipient-MX. We no longer use any external
listmonk_smtp_port: 587 # relay (SMTP2GO was decommissioned). These vars are kept here for documentation
listmonk_smtp_user: "{{ vault_listmonk_smtp_user | default(smtp_user) }}" # and manual reference.
listmonk_smtp_pass: "{{ vault_listmonk_smtp_pass }}" listmonk_smtp_host: 172.18.0.1
listmonk_smtp_port: 25
# The local Postfix relay requires no auth (auth_protocol: none, tls_type: none).
listmonk_smtp_user: ""
listmonk_smtp_pass: ""
listmonk_admin_user: "{{ vault_listmonk_admin_user }}" listmonk_admin_user: "{{ vault_listmonk_admin_user }}"
listmonk_admin_password: "{{ vault_listmonk_admin_password }}" listmonk_admin_password: "{{ vault_listmonk_admin_password }}"

View file

@ -54,7 +54,7 @@ WORKER_URL=http://workers:8090
# ── Transactional email — Carbonio (co.carrierone.com) ─────────────────────── # ── Transactional email — Carbonio (co.carrierone.com) ───────────────────────
# All transactional mail: order confirmations, worker notifications, ERPNext alerts. # All transactional mail: order confirmations, worker notifications, ERPNext alerts.
# Listmonk mass-mail uses SMTP2GO — configured separately in the Listmonk admin UI. # Listmonk mass-mail relays through the local Postfix MTA — configured separately in the Listmonk admin UI.
SMTP_HOST={{ smtp_host }} SMTP_HOST={{ smtp_host }}
SMTP_PORT={{ smtp_port }} SMTP_PORT={{ smtp_port }}
SMTP_USER={{ smtp_user }} SMTP_USER={{ smtp_user }}

View file

@ -809,7 +809,7 @@ automate this process.
import smtplib import smtplib
from email.mime.text import MIMEText from email.mime.text import MIMEText
smtp_host = os.environ.get("SMTP_HOST", "mail.smtp2go.com") smtp_host = os.environ.get("SMTP_HOST", "co.carrierone.com")
smtp_port = int(os.environ.get("SMTP_PORT", "587")) smtp_port = int(os.environ.get("SMTP_PORT", "587"))
smtp_user = os.environ.get("SMTP_USER", "") smtp_user = os.environ.get("SMTP_USER", "")
smtp_pass = os.environ.get("SMTP_PASS", "") smtp_pass = os.environ.get("SMTP_PASS", "")