← Bulk Sending Operations Guides
EXECUTIVE ENGINEERING BRIEFING
Published: October 2026 • Author: Fred Dawson • High-Volume Infrastructure & Deliverability Operations

Executive Summary: Production-ready PowerMTA configuration guide for high-volume bulk mail: virtual-mta streams, domain-macro definitions, max-smtp-out, rate-limit, and accounting file logging.

MTA Kernel
PowerMTA Enterprise
High-throughput wire daemon
Stream Isolation
Virtual MTA Pools
Dedicated outbound IP binding
Domain Macro
ISP Custom Directives
Carrier-specific throttle rules
Accounting Log
Pipe & CSV Streams
Real-time delivery telemetry

PowerMTA’s configuration file controls every aspect of high-volume email delivery: how many concurrent connections each IP makes to each ISP, which IP addresses different message streams use, how DKIM signing is applied, how bounces are classified and acted upon, and how the system behaves when ISPs throttle or block traffic. A misconfigured PowerMTA can bottleneck throughput, damage IP reputation through over-aggressive connection behaviour, or fail to process bounces — making it impossible to maintain list hygiene at scale. This guide covers the core configuration structure, per-ISP delivery tuning, DKIM integration, bounce management, and the monitoring setup required to operate PowerMTA in production.

PowerMTA Delivery Performance — ISP Throughput with Tuned vMTA Config

Configuration File Structure

PowerMTA’s primary configuration file is located at /etc/pmta/config (path may vary by installation). Unlike Postfix’s separate main.cf and master.cf files, PowerMTA uses a single hierarchical configuration with nested block structures:

config (PowerMTA Wire Directives) Console / Shell
# /etc/pmta/config  —  basic structure

# Global settings
host-name mail.yourdomain.com
smtp-listener 0/0:25

# License
license /etc/pmta/license

# Logging paths
log-file /var/log/pmta/pmta.log
log-rotate-size 200M

# Virtual MTA definitions
<virtual-mta vmta-main>
  smtp-source-ip 203.0.113.10
  ehlo-hostname mail.yourdomain.com
</virtual-mta>

# Per-ISP delivery policies (domain blocks)
<domain gmail.com>
  max-smtp-out 10
  max-msg-per-connection 100
</domain>

# Accounting (bounce and delivery logging)
<acct-file /var/log/pmta/acct.csv>
  records d
  record-fields d timeLogged,orig,rcpt,vmta,jobId,dlvStatus,dsnStatus,dsnDiag
</acct-file>

Server Identity and Basic Settings

traffic-shaper.sh (Linux TC / Egress Queue) Console / Shell
# /etc/pmta/config  —  global settings section

# Hostname used in EHLO and logging
host-name mail.yourdomain.com

# SMTP listener  —  0/0:25 = all interfaces, port 25
# For injection-only (relay): listen on localhost only
smtp-listener 127.0.0.1:25

# For receiving messages from external campaign systems
smtp-listener 0/0:25

# Injection port (where your email platform injects messages)
# Use a non-standard port to separate injection from MTA-to-MTA
smtp-listener 0/0:587
smtp-smarthost-port 587

# Maximum queue size
max-queue-size 500M

# Worker threads
smtp-server-threads 30
smtp-client-threads 200

# Postmaster address (receives FBL reports and admin messages)
postmaster postmaster@yourdomain.com

# Log settings
log-file /var/log/pmta/pmta.log
log-rotate-size 200M
log-rotate-count 10

Virtual MTA: Stream Isolation

Virtual MTAs (vMTAs) are the core stream isolation mechanism in PowerMTA. Each vMTA has its own IP address, its own delivery queues, and its own per-ISP connection behaviour. Messages injected with a specific X-Binding or X-VirtualMTA header route to the named vMTA.

PowerMTA config.xml — vMTA per client with IP binding
config (PowerMTA Wire Directives) Console / Shell
<virtual-mta name="client-acme">
  <smtp-source-host>203.0.113.10</smtp-source-host>
  <domain-key name="acme" domain="acme.com" path="/etc/pmta/keys/acme.pem"/>
  <max-smtp-out>10</max-smtp-out>
  <max-msg-rate>200/h</max-msg-rate>
</virtual-mta>

<domain name="gmail.com">
  <max-smtp-out>10</max-smtp-out>
  <smtp-pattern-list name="gmail-deferrals">
    <smtp-pattern response="421*" action="defer" period="60s"/>
  </smtp-pattern-list>
</domain>
config (PowerMTA Wire Directives) Console / Shell
# Stream isolation: transactional vs marketing on separate IPs
<virtual-mta vmta-transactional>
  smtp-source-ip 203.0.113.10
  ehlo-hostname tx.yourdomain.com
  # Maximum simultaneous outbound connections from this vMTA
  max-smtp-out 100
  # Per-connection message limit
  smtp-retries-after-shutoff 5
</virtual-mta>

<virtual-mta vmta-marketing>
  smtp-source-ip 203.0.113.11
  smtp-source-ip 203.0.113.12    # multiple IPs rotate across connections
  ehlo-hostname mkt.yourdomain.com
  max-smtp-out 80
  smtp-retries-after-shutoff 3
</virtual-mta>

<virtual-mta vmta-bulk>
  smtp-source-ip 203.0.113.20
  smtp-source-ip 203.0.113.21
  smtp-source-ip 203.0.113.22
  ehlo-hostname bulk.yourdomain.com
  max-smtp-out 150
</virtual-mta>

# vMTA pools allow automatic load distribution
<virtual-mta-pool pool-marketing>
  virtual-mta vmta-marketing
  virtual-mta vmta-bulk
</virtual-mta-pool>

Your injection application (MailWizz, custom code, or any SMTP client) targets a specific vMTA by setting the X-Binding: vmta-name SMTP header when injecting messages.

Per-ISP Domain Blocks: Delivery Tuning

Domain blocks in PowerMTA configure the delivery behaviour for specific receiving domains or MX patterns. This is where per-ISP throttling is implemented — the most impactful configuration for inbox placement at scale.

config (PowerMTA Wire Directives) Console / Shell
# Gmail  —  engagement-sensitive, allow reasonable concurrency
<domain gmail.com>
  max-smtp-out 10              # max concurrent connections to Gmail MXs
  max-msg-per-connection 100   # messages per SMTP session
  retry-after 421 4.7.0 15m   # Gmail "unsolicited" throttle  —  wait 15min
  retry-after 421 4.3.0 5m    # Gmail infrastructure throttle  —  retry after 5min
  max-msg-rate 500/m           # max messages per minute to Gmail total
</domain>

# Microsoft  —  conservative; aggressive sends trigger 421 4.7.650
<domain outlook.com hotmail.com live.com msn.com>
  max-smtp-out 5
  max-msg-per-connection 50
  retry-after 421 4.7.650 30m  # Microsoft reputation throttle
  retry-after 421 4.7.0 20m
  max-msg-rate 200/m
</domain>

# Yahoo / AOL  —  watch for TS codes
<domain yahoo.com ymail.com aol.com>
  max-smtp-out 8
  max-msg-per-connection 50
  retry-after 421 TS01 60m    # TS01 = complaint rate issue  —  wait an hour
  retry-after 421 TS03 15m    # TS03 = connection rate  —  15min then retry
</domain>

# Apple iCloud
<domain icloud.com me.com mac.com>
  max-smtp-out 10
  max-msg-per-connection 100
</domain>

# Conservative policy for ISPs not specifically configured
<domain *>
  max-smtp-out 20
  max-msg-per-connection 200
  max-msg-rate 1000/m
</domain>

DKIM Signing Configuration

PowerMTA supports DKIM signing natively for domains configured with private keys. The configuration maps each sending domain to its DKIM private key and selector:

traffic-shaper.sh (Linux TC / Egress Queue) Console / Shell
# DKIM signing in /etc/pmta/config
# Method 1: Direct private key reference (simple setup)
<dkim>
  domain yourdomain.com
  selector mail
  private-key-file /etc/pmta/dkim/yourdomain.com.private.key
  header-list from:to:subject:date:message-id:content-type
  canonicalization relaxed/simple
  sign-hash sha256
</dkim>

# Method 2: Multiple domains with domain-key blocks
<domain-key mail._domainkey.yourdomain.com>
  type DK
  private-key /etc/pmta/dkim/yourdomain.com.private.key
  domain yourdomain.com
  selector mail
</domain-key>

<domain-key mail._domainkey.anotherdomain.org>
  type DK
  private-key /etc/pmta/dkim/anotherdomain.org.private.key
  domain anotherdomain.org
  selector mail
</domain-key>

Generate 2048-bit DKIM keys for PowerMTA:

traffic-shaper.sh (Linux TC / Egress Queue) Console / Shell
# Generate key pair
openssl genrsa -out /etc/pmta/dkim/yourdomain.com.private.key 2048
openssl rsa -in /etc/pmta/dkim/yourdomain.com.private.key 
  -pubout -out /etc/pmta/dkim/yourdomain.com.public.key

# Set permissions  —  private key must be readable by pmta user only
chown pmta:pmta /etc/pmta/dkim/yourdomain.com.private.key
chmod 600 /etc/pmta/dkim/yourdomain.com.private.key

# Get the DNS record value
openssl rsa -in /etc/pmta/dkim/yourdomain.com.private.key 
  -pubout 2>/dev/null | grep -v -- '---' | tr -d 'n'
# Publish this value in: mail._domainkey.yourdomain.com TXT "v=DKIM1; k=rsa; p=..."

Bounce Classification and Accounting

PowerMTA’s accounting system writes delivery events (bounces, successful deliveries, FBL complaints) to CSV files for processing by downstream list management systems. The accounting configuration determines what data is captured and how often files are rotated:

fbl-handler.py (RFC 5965 ARF Parser) Console / Shell
# Accounting file configuration
# Bounce log  —  records every bounce event
<acct-file /var/log/pmta/bounce.csv>
  move-interval 1h
  move-to /var/log/pmta/accounting/
  world-readable yes
  records b
  record-fields b timeLogged,bounceCat,vmta,orig,rcpt,srcMta,dlvSourceIp,jobId,dsnStatus,dsnMta,dsnDiag
</acct-file>

# Full delivery accounting
<acct-file /var/log/pmta/acct.csv>
  move-interval 24h
  move-to /var/log/pmta/accounting/
  world-readable yes
  records d
  record-fields d timeLogged,orig,rcpt,vmta,jobId,dlvStatus,dsnStatus
</acct-file>

# FBL (complaint) log
<acct-file /var/log/pmta/fbl.csv>
  move-interval 24h
  move-to /var/log/pmta/accounting/fbl/
  world-readable yes
  records feedback-loop
  record-fields f timeLogged,format,header_To,header_Return-Path,reportedDomain,header_X-FBLId
</acct-file>

Automatic bounce suppression rules

traffic-shaper.sh (Linux TC / Egress Queue) Console / Shell
# Automatic actions based on bounce category
<bounce-action>
  type permanent
  match bad-mailbox bad-domain routing-errors inactive-mailbox
  action suppress
</bounce-action>

<bounce-action>
  type transient
  match quota-issues bad-connection
  action retry
  retry-after 4h
</bounce-action>

<bounce-action>
  type transient
  match spam-related
  action retry
  retry-after 6h
  max-tries 3
</bounce-action>

Access Control and Security

Terminal / MTA Directive Console / Shell
# Restrict SMTP injection to trusted sources only
# Messages can only be injected from these IPs
<smtp-server>
  allow-unencrypted-plain yes      # Allow password authentication without TLS for localhost
  max-smtp-in 50                   # Maximum incoming injection connections
</smtp-server>

# Source IP allowlist  —  only these IPs can inject mail
<source 127.0.0.1/8>
  relay yes
</source>

<source 10.0.0.0/8>
  relay yes
</source>

# All other sources  —  no relay
<source *>
  relay no
</source>

Monitoring and Management

Web monitoring interface

Terminal / MTA Directive Console / Shell
# Enable web management interface
<http>
  port 8080
  address 127.0.0.1   # Restrict to localhost; use SSH tunnel for remote access
  enable-config-editing yes
</http>

Essential CLI monitoring commands

Terminal / MTA Directive Console / Shell
# Overall system status
pmta status

# Queue depth per virtual MTA
pmta show status detail

# Per-domain delivery statistics
pmta show domain gmail.com

# Active queue depth
pmta show queue

# Inspect bounce log (last 100 lines)
tail -100 /var/log/pmta/bounce.csv | cut -d',' -f1,2,4,5,10

# Reload configuration after changes (no restart required)
pmta reload

# Flush deferred messages to a specific domain (use carefully)
pmta resume domain gmail.com

# Check suppression list
pmta show suppressed address@example.com

Hardware and Capacity Planning

PowerMTA’s throughput ceiling is determined by hardware, not software configuration. Key sizing guidelines:

Daily volume targetCPURAMStorageIPs
Up to 500K/day4 cores8GBSSD 100GB1 – 3
500K – 2M/day8 cores16GBNVMe 200GB3 – 10
2M – 10M/day16 cores32GBNVMe RAID 500GB10 – 30
10M+/dayMulti-server cluster64GB+NVMe RAID per node30+

The most common bottleneck at high volume is disk I/O — PowerMTA queues are disk-based. NVMe storage is effectively mandatory above 1M/day. The second common bottleneck is DNS resolution — run a local caching resolver (Unbound or Bind) so MX lookups do not serialise delivery at repeated popular destination domains.

📋 Client case — US retail ESP — 12M messages/day across 40 brands

Situation: Single PowerMTA config shared across all clients — IP reputation cross-contamination. High-complaint clients damaging low-complaint clients on shared IPs.
Action taken: Implemented vMTA architecture: each client assigned its own IP pool (2-4 IPs) and <vmta> block. Complaint rate above 0.05% triggers automatic throttling to that client vMTA.
Outcome: Cross-contamination eliminated. Top clients maintained 97%+ Gmail inbox placement even while problem clients were throttled. Compliance issues isolated and resolved per-client.

PowerMTA Production Configuration: The Key Directives

A production PowerMTA configuration for high-volume bulk email sending involves dozens of directives across global configuration, domain blocks, VMTA definitions, and queue management. The directives that have the most direct impact on deliverability performance and operational reliability are worth understanding in detail.

max-smtp-out in each domain block controls concurrent SMTP connections to that ISP from each IP in the pool. Setting this correctly for each ISP at the current reputation tier is the primary throughput optimisation lever. Gmail at High reputation: 20-25 connections per IP. Microsoft: 10-15. Yahoo: 15-20. EU ISPs (GMX/Web.de): 5-8. These values should be reviewed quarterly and updated when Postmaster Tools or SNDS shows reputation tier changes.

retry-after in domain blocks controls the retry backoff sequence for 4xx deferrals. A production retry sequence for major ISPs: first retry at 5 minutes, second at 15 minutes, third at 45 minutes, subsequent retries every 2 hours. Too-aggressive retry (retrying every 60 seconds) generates throttle pressure that ISPs interpret as flood sending; too-conservative retry (waiting 4 hours between retries) extends campaign delivery windows unnecessarily.

queue-life sets how long a message waits in the queue before being expired with a permanent failure. Production queue-life for bulk email: 72 hours. This gives enough time for ISP throttle to clear and messages to eventually deliver, while preventing indefinitely-queued messages from consuming queue resources. For transactional email, queue-life should be shorter (24 hours for most flows, 2 hours for authentication flows like password resets).

smtp-tls-mode require at the global level or per-domain ensures TLS encryption for all outbound SMTP sessions — both for compliance with Gmail/Yahoo/Microsoft requirements and for security. Per-domain exceptions with smtp-tls-mode if-available can be added for any legacy destinations known to have TLS issues, but the default should be require for all major ISPs.

Production Deliverability & Infrastructure Architecture Recommendation

Operating high-volume outbound mail streams demands rigid technical segregation. Senders cannot mix cold prospecting, transactional receipts, and mass newsletters on shared pools or unmanaged IPs. Carrier algorithms—specifically Google Postmaster spam filters and Microsoft SmartScreen heuristics—penalize unmanaged concurrency spikes and elevated bounce counts instantly. Enterprises must operate dedicated, high-performance PowerMTA or KumoMTA clusters configured with domain-level throttling, automated RFC 5965 FBL suppression loops, and dedicated bare-metal hardware.

High-Volume Sending Operations Roadmap

Step 1 (Pre-Flight Sanitization & DNS): Scrub contact databases via multi-pass syntax, MX, and disposable mailbox filters. Ensure 100% strict FCrDNS PTR and 2048-bit DKIM cryptographic alignment across all outbound IPs.
Step 2 (Wire Throttling & Stream Isolation): Configure per-destination connection caps (max-smtp-out, rate-limit) and isolate sending reputations into segregated Virtual MTAs with dedicated IPv4 addresses.
Step 3 (Automated Telemetry & Suppression): Deploy real-time pipe scripts to ingest RFC 5965 ARF abuse reports and RFC 3464 DSN hard bounces, enforcing immediate in-band suppression before the next send.

FD
Fred Dawson

Deliverability Architect & MTA Systems Engineer at AutoSMTP. Specialises in dedicated MTA cluster design, carrier-grade IP warming protocols, and ISP reputation telemetry across high-volume sending fleets.

Enterprise Mail Infrastructure

The AutoSMTP Dedicated Outreach Fleet Advantage

AutoSMTP provisions and manages enterprise-grade PowerMTA and KumoMTA clusters on dedicated bare-metal servers. Complete domain isolation, automated gas-pedal warming, and proactive deliverability telemetry.

Turnkey Dedicated Bare-Metal Clusters

Pre-configured PowerMTA and KumoMTA installations on enterprise hardware with dedicated IPv4 subnets and predictable flat pricing.

Automated Gas-Pedal IP Warming

Dynamic ramp-up algorithms that modulate hourly dispatch volume against real-time deferrals and Google Postmaster spam ratios.

Native FBL & Socket Interceptors

Automated RFC 3464 bounce ingestion, Yahoo/Outlook CFL complaint webhooks, and instant in-band suppression sync across all fleet nodes.

Strict Cryptographic Alignment

2048-bit DKIM key rotation, strict DMARC enforcement (p=reject), FCrDNS PTR verification, and automated TLS cipher hardening.

Ready for Dedicated Sending Infrastructure?

Eliminate shared pool throttle penalties and take complete control over your mail delivery with custom-tuned MTA clusters.

Deploy Dedicated MTA Fleet →