Module 5 · Lesson 11 of 25

Egress sources and pools in code

Part of KumoMTA: High-Volume Sending Engine — IP Warming Strategies & Pools.

Define sources (one per outbound IP):

kumo.on('init', function()
  for i = 1, 8 do
    kumo.define_egress_source {
      name = 'ip-' .. i,
      source_address = '198.51.100.' .. (10 + i),
      ehlo_domain    = 'mail' .. i .. '.example.com',
    }
  end

  kumo.define_egress_pool {
    name = 'warming-pool',
    entries = {
      { name = 'ip-1', weight = 1 },
      { name = 'ip-2', weight = 1 },
      -- equal-weight rotation
    }
  }

  kumo.define_egress_pool {
    name = 'production-pool',
    entries = {
      { name = 'ip-3', weight = 5 },
      { name = 'ip-4', weight = 5 },
      { name = 'ip-5', weight = 3 },
    }
  }
end)

Select pool per-message:

kumo.on('get_queue_config', function(domain, tenant, campaign)
  local pool = 'production-pool'
  if tenant == 'new-customer' then pool = 'warming-pool' end
  return kumo.make_queue_config { egress_pool = pool }
end)

Enforce daily caps with the throttles module — a per-source message bucket reset at midnight. This is your warming enforcer.

Sign in to keep track of what you have read.

Pulse · self-hosted sending

Own the infrastructure your pipeline depends on.

One install script on your own server. Pulse sets up the MTA, mailboxes, certificates and dashboard; you add domains and start sending.

# on a fresh Ubuntu server
$ cd pulse && sudo ./install.sh
→ docker compose up · kumomta · stalwart · caddy
→ dashboard ready on https://pulse.yourdomain.com
$

Also from us:Beat — monitoring that tells you the fixConsulting — $65/hr, no retainer