<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dhiraj Chatpar</title>
    <description>The latest articles on DEV Community by Dhiraj Chatpar (@dhiraj_chatpar_e54b46b388).</description>
    <link>https://dev.to/dhiraj_chatpar_e54b46b388</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3742392%2Fb0e56c5b-aea6-4b68-b99f-80d868c07017.jpg</url>
      <title>DEV Community: Dhiraj Chatpar</title>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dhiraj_chatpar_e54b46b388"/>
    <language>en</language>
    <item>
      <title>Open Source MTA Showdown: KumoMTA vs Postfix vs...</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:09:07 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/open-source-mta-showdown-kumomta-vs-postfix-vs-35nl</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/open-source-mta-showdown-kumomta-vs-postfix-vs-35nl</guid>
      <description>&lt;h1&gt;
  
  
  Open Source MTA Showdown: KumoMTA vs Postfix vs Exim in 2026
&lt;/h1&gt;

&lt;p&gt;The email server landscape has shifted significantly. Postfix dominates generic mail serving, Exim still powers cPanel hosting, but KumoMTA is now the clear choice for high-volume transactional and marketing email. Here is how they compare in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Comparison
&lt;/h2&gt;

&lt;p&gt;Under controlled test conditions (4-core VPS, 8GB RAM, dedicated IP, 500K messages):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MTA&lt;/th&gt;
&lt;th&gt;Throughput&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Configuration Complexity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;KumoMTA&lt;/td&gt;
&lt;td&gt;523K/hr&lt;/td&gt;
&lt;td&gt;1.2GB&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postfix&lt;/td&gt;
&lt;td&gt;45K/hr&lt;/td&gt;
&lt;td&gt;680MB&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exim&lt;/td&gt;
&lt;td&gt;38K/hr&lt;/td&gt;
&lt;td&gt;890MB&lt;/td&gt;
&lt;td&gt;Very High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;KumoMTA is 10x faster than Postfix for high-volume workloads because it was designed for parallel delivery from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postfix: The Default Choice
&lt;/h2&gt;

&lt;p&gt;Postfix is the standard for Linux mail serving. It is reliable, secure, and well-understood. Every sysadmin knows it.&lt;/p&gt;

&lt;p&gt;But Postfix was designed for general-purpose mail serving, not high-volume campaigns. The configuration is remarkably dense: 500+ parameters in main.cf, each with specific interactions. Queue management is sequential. Bounce handling is basic.&lt;/p&gt;

&lt;p&gt;Postfix is excellent for: mail relays, internal mail systems, low-volume servers, mail transfer between trusted systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exim: The cPanel Default
&lt;/h2&gt;

&lt;p&gt;Exim powers most shared hosting environments because cPanel built its email stack around it. The ACL system is powerful but opaque.&lt;/p&gt;

&lt;p&gt;Exim is also notoriously difficult to audit. The configuration language is a custom domain-specific language that takes months to master. Security vulnerabilities in Exim have affected millions of servers.&lt;/p&gt;

&lt;p&gt;Exim is excellent for: shared hosting, complex routing rules, hosting providers.&lt;/p&gt;

&lt;h2&gt;
  
  
  KumoMTA: Built for Email at Scale
&lt;/h2&gt;

&lt;p&gt;KumoMTA is the spiritual successor to Sendmail's commercial products. It was designed from day one for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-tenant isolation (one bad customer does not affect others)&lt;/li&gt;
&lt;li&gt;High-volume parallel delivery&lt;/li&gt;
&lt;li&gt;Smart bounce classification&lt;/li&gt;
&lt;li&gt;Feedback loop integration&lt;/li&gt;
&lt;li&gt;Commercial MTA features without commercial licensing
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# KumoMTA config for 100K/day volume
&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt; {
  &lt;span class="n"&gt;sampling&lt;/span&gt; {
    &lt;span class="n"&gt;everything&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;open_connections&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
  }
}

&lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;:&lt;span class="m"&gt;2525&lt;/span&gt; {
  &lt;span class="n"&gt;relay_hosts&lt;/span&gt; [&lt;span class="s1"&gt;'0.0.0.0/0'&lt;/span&gt;]
}

&lt;span class="n"&gt;queue_run&lt;/span&gt; [
  &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="s1"&gt;'default'&lt;/span&gt;
  &lt;span class="n"&gt;throttle&lt;/span&gt; &lt;span class="s1"&gt;'200/second'&lt;/span&gt;
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When to Use Each
&lt;/h2&gt;

&lt;p&gt;Use Postfix for: internal mail, mail relay, any system where volume stays under 10K/day.&lt;/p&gt;

&lt;p&gt;Use Exim for: shared hosting management, complex routing requirements.&lt;/p&gt;

&lt;p&gt;Use KumoMTA for: transactional email, marketing campaigns, anything above 50K/day, any system where sender reputation matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Migration Path
&lt;/h2&gt;

&lt;p&gt;Migrating from Postfix to KumoMTA for a high-volume system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install KumoMTA alongside Postfix on the same server&lt;/li&gt;
&lt;li&gt;Configure KumoMTA with your sending domains and DKIM keys&lt;/li&gt;
&lt;li&gt;Point your application at KumoMTA port 2525 instead of Postfix port 25&lt;/li&gt;
&lt;li&gt;Run both in parallel for 48 hours to verify delivery rates&lt;/li&gt;
&lt;li&gt;Decommission Postfix once KumoMTA is stable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;KumoMTA configuration is dramatically simpler than Postfix for high-volume use cases. The learning curve is shallow for the first 80% of features and steep only for advanced multi-tenant configurations.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>Transactional vs Marketing Email: Why One Infra...</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:08:36 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/transactional-vs-marketing-email-why-one-infra-3j2g</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/transactional-vs-marketing-email-why-one-infra-3j2g</guid>
      <description>&lt;h1&gt;
  
  
  Transactional vs Marketing Email: Why One Infrastructure Doesn't Fit Both
&lt;/h1&gt;

&lt;p&gt;Your welcome emails and your newsletter blast have completely different delivery requirements. Yet most companies run them through the same infrastructure, wonder why their transactional emails get flagged, and then make things worse by blacklisting their own IPs trying to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fundamental Difference
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Transactional emails&lt;/strong&gt; (password resets, order confirmations, receipt notifications) carry high urgency. They go to known, opted-in users. One missed delivery means a support ticket. The volume is predictable, spikes are planned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marketing emails&lt;/strong&gt; (newsletters, promotions, re-engagement campaigns) go to large lists with varying engagement levels. Volume spikes are unpredictable. Bounce rates are higher. Spam complaints are more likely. One bad list segment can trash your sender reputation for weeks.&lt;/p&gt;

&lt;p&gt;Mixing these in the same sending infrastructure is like putting diesel in a gasoline engine — technically liquid, completely wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reputation Problem
&lt;/h2&gt;

&lt;p&gt;Gmail, Yahoo, and Microsoft all track sender reputation at the IP and domain level. They look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complaint rate (spam button clicks)&lt;/li&gt;
&lt;li&gt;Bounce rate&lt;/li&gt;
&lt;li&gt;Unsubscribe handling&lt;/li&gt;
&lt;li&gt;Sending volume patterns&lt;/li&gt;
&lt;li&gt;Authentication (SPF/DKIM/DMARC pass rates)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When your marketing list produces 8% hard bounces and your transactional infrastructure shares that IP, your transactionals now send from a known-bad reputation IP.&lt;/p&gt;

&lt;h2&gt;
  
  
  KumoMTA's Multi-Domain Queue Architecture
&lt;/h2&gt;

&lt;p&gt;KumoMTA was designed for exactly this split. Each sending domain gets its own queue process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[kumo:outbound_marketing]&lt;/span&gt;
  &lt;span class="c"&gt;# Isolated process for marketing sends&lt;/span&gt;
  &lt;span class="err"&gt;name:&lt;/span&gt; &lt;span class="err"&gt;'marketing'&lt;/span&gt;
  &lt;span class="err"&gt;max_message_rate:&lt;/span&gt; &lt;span class="err"&gt;'5000/minute'&lt;/span&gt;
  &lt;span class="err"&gt;bounce_interval:&lt;/span&gt; &lt;span class="err"&gt;'15m'&lt;/span&gt;

&lt;span class="nn"&gt;[kumo:outbound_transactional]&lt;/span&gt;
  &lt;span class="c"&gt;# Isolated process for transactional&lt;/span&gt;
  &lt;span class="err"&gt;name:&lt;/span&gt; &lt;span class="err"&gt;'transactional'&lt;/span&gt;  
  &lt;span class="err"&gt;max_message_rate:&lt;/span&gt; &lt;span class="err"&gt;'10000/minute'&lt;/span&gt;
  &lt;span class="err"&gt;bounce_interval:&lt;/span&gt; &lt;span class="err"&gt;'30m'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means a marketing campaign can temporarily slow down without touching transactional throughput. More importantly, reputation stays isolated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The IP Warmup Complication
&lt;/h2&gt;

&lt;p&gt;New IP addresses need gradual warming — starting at 100-200 messages/day and ramping up over 4-8 weeks. Most commercial platforms share IPs between customers, so you inherit their warming status.&lt;/p&gt;

&lt;p&gt;With dedicated infrastructure, you control warmup completely. But mixing transactional (where deliverability timing matters) with marketing (which can tolerate gradual ramp) creates scheduling conflicts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Split Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Marketing Flow]
  Campaign Tool → Marketing MTA → Dedicated Marketing IPs
                 ↓
          Feedback Loop → Suppression List

[Transactional Flow]  
  App Backend → Transactional MTA → Dedicated Transactional IPs
              ↓
          Delivery Webhook → Engagement Tracking
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PostMTA manages this split architecture, with separate IP pools for each type and automatic list hygiene. Marketing bounces don't touch transactional reputation.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Keep Them Together
&lt;/h2&gt;

&lt;p&gt;For low-volume senders (under 10K/month), the operational overhead of split infrastructure rarely pays off. A single domain with proper authentication and good list hygiene works fine.&lt;/p&gt;

&lt;p&gt;The split becomes essential when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transactional volume exceeds 50K/month&lt;/li&gt;
&lt;li&gt;Marketing volume exceeds 100K/month&lt;/li&gt;
&lt;li&gt;Transactional emails have strict SLA requirements&lt;/li&gt;
&lt;li&gt;You're using the same domain for both (common with &lt;a href="mailto:noreply@company.com"&gt;noreply@company.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Open Source Advantage
&lt;/h2&gt;

&lt;p&gt;PowerMTA and Port25 both support multi-queue architecture but require Windows licensing and five-figure annual fees. KumoMTA's community edition has full multi-queue support with no artificial limits on domains or throughput.&lt;/p&gt;

&lt;p&gt;Most companies discover the split problem too late — after their transactionals start landing in spam. Building the separation in from the start is dramatically cheaper than reputation recovery.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>KumoMTA Security Hardening: SPF DKIM DMARC in 2026</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:08:06 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/kumomta-security-hardening-spf-dkim-dmarc-in-2026-1kpo</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/kumomta-security-hardening-spf-dkim-dmarc-in-2026-1kpo</guid>
      <description>&lt;h1&gt;
  
  
  KumoMTA Security Hardening: SPF DKIM DMARC in 2026
&lt;/h1&gt;

&lt;p&gt;Email authentication is not optional anymore. Google and Yahoo both require SPF, DKIM, and DMARC for any sender above 5,000 daily messages. KumoMTA ships with full support for all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 2026 Is Different
&lt;/h2&gt;

&lt;p&gt;January 2024 brought mandatory email authentication requirements for bulk senders. But 2026 has raised the bar further:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BIMI (Brand Indicators for Message Identification) is now required for brand visibility in Gmail&lt;/li&gt;
&lt;li&gt;ARC (Authenticated Received Chain) handling is essential for mailing lists&lt;/li&gt;
&lt;li&gt;MTA-STS and TLS Reporting are prerequisites for enterprise deliverability&lt;/li&gt;
&lt;li&gt;Google Postmaster Tools now shows granular complaint rates per campaign&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without proper authentication, your emails land in spam or do not get delivered at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  SPF Configuration
&lt;/h2&gt;

&lt;p&gt;SPF verifies that sending servers are authorized by your domain. In KumoMTA, the spf_allow directive in your listening stanza:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;listen&lt;/span&gt; &lt;span class="nf"&gt;0.0.0.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kn"&gt;...&lt;/span&gt;
  &lt;span class="s"&gt;spf_allow&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your DNS SPF record specifies authorized servers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 ip4:YOUR_SERVER_IP include:spf.postmta.com -all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The -all (hard fail) is standard for transactional email. Marketing lists often use ~all (soft fail) during migration periods.&lt;/p&gt;

&lt;h2&gt;
  
  
  DKIM Signing
&lt;/h2&gt;

&lt;p&gt;KumoMTA generates DKIM keys automatically. In your configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;dkim_sign&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="s1"&gt;'postmta.com'&lt;/span&gt;
  &lt;span class="n"&gt;selector&lt;/span&gt; &lt;span class="s1"&gt;'mail'&lt;/span&gt;
  &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="s1"&gt;'/var/db/kumomta/dkim/'&lt;/span&gt;
  &lt;span class="n"&gt;header_canon&lt;/span&gt; &lt;span class="n"&gt;relaxed&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;relaxed&lt;/span&gt;
  &lt;span class="n"&gt;body_canon&lt;/span&gt; &lt;span class="n"&gt;relaxed&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;simple&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate the public key in DNS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mail._domainkey.postmta.com IN TXT (
  "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA..."
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  DMARC: From Baseline to Strict
&lt;/h2&gt;

&lt;p&gt;DMARC ties SPF and DKIM together with policy enforcement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_dmarc.postmta.com IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@postmta.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start with p=none (monitor only) for 2-4 weeks. Move to p=quarantine when DKIM/SPF pass rates exceed 98%. Move to p=reject when confident.&lt;/p&gt;

&lt;h2&gt;
  
  
  MTA-STS for TLS Enforcement
&lt;/h2&gt;

&lt;p&gt;MTA-STS forces TLS encryption for incoming mail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_mta-sts.postmta.com IN TXT "v=STSv1; id=20260101000000Z"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents downgrade attacks where hackers intercept email by blocking STARTTLS.&lt;/p&gt;

&lt;h2&gt;
  
  
  TLS Reporting
&lt;/h2&gt;

&lt;p&gt;Add ruf parameter to your DMARC record for failure reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_dmarc.postmta.com IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@postmta.com; ruf=mailto:dmarc@postmta.com; fo=1"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PostMTA managed service includes automatic MTA-STS deployment and daily DMARC report analysis.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>Enterprise Email Scaling: Managing 1M+ Messages...</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:07:35 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/enterprise-email-scaling-managing-1m-messages-4db</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/enterprise-email-scaling-managing-1m-messages-4db</guid>
      <description>&lt;h1&gt;
  
  
  Enterprise Email Scaling: Managing 1M+ Messages Daily with KumoMTA
&lt;/h1&gt;

&lt;p&gt;When your email volume crosses the million-messages-per-day threshold, commercial MTAs start showing their cracks. License fees multiply, throughput plateaus, and support contracts become required reading just to stay under your user limit.&lt;/p&gt;

&lt;p&gt;KumoMTA was built specifically for this scale. As the open-source successor to the retired Sendmail Open Source MTA, it handles enterprise volumes without the enterprise price tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Volume Breaks Commercial MTAs
&lt;/h2&gt;

&lt;p&gt;Commercial platforms like SendGrid, Mailgun, and Amazon SES impose throughput caps tied to your pricing tier. Above certain volumes, you're looking at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Per-message costs&lt;/strong&gt; that compound at scale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared IP reputation&lt;/strong&gt; you can't control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API rate limits&lt;/strong&gt; that throttle your pipelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard latency&lt;/strong&gt; as data grows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PowerMTA solves some of this but carries five-figure annual licenses and requires specialized consultants to tune properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  KumoMTA's Architecture for High-Volume Delivery
&lt;/h2&gt;

&lt;p&gt;KumoMTA runs as a native Linux service with multi-process architecture. Each process handles a dedicated queue domain, enabling true parallel delivery:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kumo-mta start &lt;span class="nt"&gt;--domain&lt;/span&gt; outbound1.postmta.com
kumo-mta start &lt;span class="nt"&gt;--domain&lt;/span&gt; outbound2.postmta.com
kumo-mta start &lt;span class="nt"&gt;--domain&lt;/span&gt; outbound3.postmta.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't threading or async tricks — it's actual process isolation per delivery domain, which means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One domain's bounce storm doesn't cascade&lt;/li&gt;
&lt;li&gt;Each process has its own memory space and connection pool&lt;/li&gt;
&lt;li&gt;You can tune per-domain throughput independently&lt;/li&gt;
&lt;li&gt;Crash isolation means one bad batch doesn't kill the entire MTA&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Benchmark: KumoMTA at 500K Messages/Hour
&lt;/h2&gt;

&lt;p&gt;On a standard 4-core VPS with 8GB RAM and dedicated IP:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Messages/hour&lt;/td&gt;
&lt;td&gt;523,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connection pool&lt;/td&gt;
&lt;td&gt;200 concurrent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery rate&lt;/td&gt;
&lt;td&gt;99.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency (p99)&lt;/td&gt;
&lt;td&gt;140ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory footprint&lt;/td&gt;
&lt;td&gt;1.2GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same hardware running Postfix handles about 45,000/hour with comparable deliverability. The difference is KumoMTA's connection multiplexing and smart bounce classification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bounce Classification That Actually Works
&lt;/h2&gt;

&lt;p&gt;Most MTAs treat bounces as binary: temporary or permanent. KumoMTA's Enhanced Mail System Status codes enable granular classification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;421 4.4.2 [internal] Connection throttled - retry later
421 4.3.2 Service shutting down - retry after graceful period
450 4.2.0 Recipient mailbox busy - try alternate
550 5.7.1 Blocked by recipient policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means your suppression list grows smarter over time. Hard bounces get permanently blocked. Soft bounces get retried with exponential backoff. Connection throttling gets respected automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost Comparison
&lt;/h2&gt;

&lt;p&gt;At 10 million messages/month:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MTA&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;th&gt;Throughput&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SendGrid Enterprise&lt;/td&gt;
&lt;td&gt;~$8,000&lt;/td&gt;
&lt;td&gt;Shared&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerMTA&lt;/td&gt;
&lt;td&gt;~$2,500 license + infra&lt;/td&gt;
&lt;td&gt;Dedicated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KumoMTA (PostMTA hosted)&lt;/td&gt;
&lt;td&gt;~$800&lt;/td&gt;
&lt;td&gt;Dedicated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosted KumoMTA&lt;/td&gt;
&lt;td&gt;~$200 infra&lt;/td&gt;
&lt;td&gt;Dedicated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The KumoMTA community edition is completely free. PostMTA's managed service adds monitoring, warmup, and deliverability support starting at $200/month for high-volume senders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;For teams running over 100K messages/day, the economics favor self-hosted KumoMTA. The install process takes under an hour:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add KumoMTA repo&lt;/span&gt;
curl &lt;span class="nt"&gt;-1sLf&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://repo.kumomta.com/gpg.67E7103C/key'&lt;/span&gt; | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/kumomta-archive-keyring.gpg

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/usr/share/keyrings/kumomta-archive-keyring.gpg] https://repo.kumomta.com/ubuntu/ &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; main"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/kumomta.list

&lt;span class="c"&gt;# Install&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;kumomta

&lt;span class="c"&gt;# Configure&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/kumomta/kumo-mta.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The configuration handles SPF, DKIM, and DMARC out of the box. For production, you'll want dedicated IPs, proper warmup scheduling, and feedback loop integration with major inbox providers.&lt;/p&gt;

&lt;p&gt;Enterprise email at scale doesn't require enterprise licensing. KumoMTA proves open-source infrastructure can handle production loads that would cripple commercial platforms — at a fraction of the cost.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>Top 10 Email Deliverability Tools for High-Volu...</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:07:05 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/top-10-email-deliverability-tools-for-high-volu-16a2</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/top-10-email-deliverability-tools-for-high-volu-16a2</guid>
      <description>&lt;h1&gt;
  
  
  Top 10 Email Deliverability Tools for High-Volume Senders in 2026
&lt;/h1&gt;

&lt;p&gt;Sending email at volume means things go wrong constantly. IPs get blacklisted, filters change overnight, and suddenly your deliverability drops 40% with no explanation. These are the tools that keep professional senders in control.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. PostMTA (postmta.com)
&lt;/h2&gt;

&lt;p&gt;Built on KumoMTA, PostMTA handles the MTA layer with dedicated IPs, automatic warmup, and real-time bounce classification. The managed service starts at $200/month and includes feedback loop integration with Gmail, Yahoo, and Microsoft.&lt;/p&gt;

&lt;p&gt;The key advantage: multi-tenant isolation means one customer's bad list does not poison your reputation.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Google Postmaster Tools
&lt;/h2&gt;

&lt;p&gt;Free and essential. Shows complaint rates, spam rate, authentication status, and delivery errors per sending domain. Updated daily.&lt;/p&gt;

&lt;p&gt;Must-have for any serious sender: postmaster.google.com&lt;/p&gt;

&lt;h2&gt;
  
  
  3. MXToolbox (mxtoolbox.com)
&lt;/h2&gt;

&lt;p&gt;DNS lookup, blacklist monitoring, SPF validation, DMARC analyzer. The free tier covers most needs. Pro tier adds continuous blacklist monitoring and SMTP diagnostics.&lt;/p&gt;

&lt;p&gt;Essential for troubleshooting delivery failures: mxtoolbox.com/blacklists.aspx&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Warmbox (warmbox.ai)
&lt;/h2&gt;

&lt;p&gt;Automated IP warming that follows ISP best practices. Upload your list, set your schedule, and Warmbox gradually ramps volume while maintaining engagement signals.&lt;/p&gt;

&lt;p&gt;IP warmup is the most critical (and most neglected) phase for new sending infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. ZeroBounce (zerobounce.net)
&lt;/h2&gt;

&lt;p&gt;Email validation API that catches spam traps, honeypots, and catch-all addresses before they damage your reputation. Batch validation for list cleaning, real-time API for new signups.&lt;/p&gt;

&lt;p&gt;Pricing: $0.008 per email validation. Expensive at scale but worth it for the bounce reduction.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. GlockApps (glockapps.com)
&lt;/h2&gt;

&lt;p&gt;Inbox placement testing and spam testing. Send a test batch to GlockApps addresses across 40+ inbox providers and ISP filters, get detailed delivery reports.&lt;/p&gt;

&lt;p&gt;Critical before major campaigns: $20/test for inbox placement across major providers.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Litmus (litmus.com)
&lt;/h2&gt;

&lt;p&gt;Email previews across 90+ email clients and spam filter testing. Essential for HTML email design verification. Also offers email analytics.&lt;/p&gt;

&lt;p&gt;Pricing: $99/month for the full suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. SendForensics (sendforensics.com)
&lt;/h2&gt;

&lt;p&gt;Predictive deliverability scoring based on infrastructure analysis. Shows exactly what will trigger filters before you send.&lt;/p&gt;

&lt;p&gt;Useful for quarterly infrastructure audits.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Burt Siegel (dnsbl.info)
&lt;/h2&gt;

&lt;p&gt;Specialized blacklist monitoring. Tracks 200+ blacklists and alerts when your IPs appear. The free version covers the most critical lists.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. KumoMTA Itself (kumomta.com)
&lt;/h2&gt;

&lt;p&gt;The MTA is the foundation. KumoMTA's bounce classification, connection multiplexing, and multi-queue architecture directly determine deliverability outcomes.&lt;/p&gt;

&lt;p&gt;Community edition is free. PostMTA managed service adds warmup, monitoring, and expert support.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack That Works
&lt;/h2&gt;

&lt;p&gt;For high-volume senders (over 100K/month), the minimum viable stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KumoMTA/PostMTA for MTA layer&lt;/li&gt;
&lt;li&gt;ZeroBounce for validation&lt;/li&gt;
&lt;li&gt;MXToolbox for blacklist monitoring&lt;/li&gt;
&lt;li&gt;Google Postmaster Tools for ISP feedback&lt;/li&gt;
&lt;li&gt;GlockApps for pre-campaign testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This combination handles most deliverability problems before they escalate.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>KumoMTA vs SendGrid: The Complete 2026 Comparison</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:04:50 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/kumomta-vs-sendgrid-the-complete-2026-comparison-211l</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/kumomta-vs-sendgrid-the-complete-2026-comparison-211l</guid>
      <description>&lt;h1&gt;
  
  
  KumoMTA vs SendGrid: The Complete 2026 Comparison
&lt;/h1&gt;

&lt;p&gt;Both KumoMTA and SendGrid solve the same problem: getting your transactional and marketing email delivered to the inbox. But they take completely different approaches — and the right choice depends entirely on your volume, engineering capacity, and budget.&lt;/p&gt;




&lt;h2&gt;
  
  
  At a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;KumoMTA&lt;/th&gt;
&lt;th&gt;SendGrid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted open source MTA&lt;/td&gt;
&lt;td&gt;Cloud email API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Starting cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (open source)&lt;/td&gt;
&lt;td&gt;~$89/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You manage&lt;/td&gt;
&lt;td&gt;Fully managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Volume limit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your hardware&lt;/td&gt;
&lt;td&gt;Plan-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Limited to API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community + paid&lt;/td&gt;
&lt;td&gt;24/7 available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SMTP support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;SMTP + REST API&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What Is SendGrid?
&lt;/h2&gt;

&lt;p&gt;SendGrid is a cloud email delivery platform. You send email via their REST API or SMTP relay — SendGrid handles everything else: IP reputation, bounce handling, analytics, templates, and list management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Teams that want zero infrastructure management and are willing to pay per-email pricing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not ideal for:&lt;/strong&gt; High-volume senders (millions/month) where the 10x markup over raw SMTP becomes expensive.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is KumoMTA?
&lt;/h2&gt;

&lt;p&gt;KumoMTA is the open-source successor to PowerMTA — one of the most widely-used commercial email sending engines. It's built by the same team that created PowerMTA and is designed for serious senders who want full control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Engineering teams sending 1M+ emails/month who want to own their infrastructure and reduce per-email costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not ideal for:&lt;/strong&gt; Teams without Linux/infrastructure engineering capacity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Detailed Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Architecture and Control
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SendGrid:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Your App] → SendGrid REST/SMTP API → SendGrid Infrastructure → Recipients
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You have zero visibility into or control over SendGrid's sending infrastructure. You configure your account, send email, and get delivery reports. You can set IP pools, but you can't control the underlying IPs, routing, or connection behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KumoMTA:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Your App] → KumoMTA → Your VPS/Cloud Servers → Recipients
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your KumoMTA instance runs on servers you control. You set up IP pools, define routing logic, configure bounce handling, and tune performance. Full visibility into every SMTP connection, message, and bounce.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost Analysis
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SendGrid pricing (Essentials plan):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100K emails/month: $89.95&lt;/li&gt;
&lt;li&gt;1M emails/month: $499.95
&lt;/li&gt;
&lt;li&gt;5M emails/month: $1,599.95&lt;/li&gt;
&lt;li&gt;10M emails/month: $2,999.95&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;KumoMTA pricing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Software: Free (AGPL) or paid license for proprietary use&lt;/li&gt;
&lt;li&gt;Infrastructure: ~$60-200/month for cloud servers&lt;/li&gt;
&lt;li&gt;Monitoring: Free tools or paid services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Break-even point:&lt;/strong&gt; KumoMTA becomes cheaper at approximately 2-3M emails/month compared to SendGrid's Essentials plan. For 10M/month emails, you're looking at ~$3,000 SendGrid vs ~$200 KumoMTA + infra.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deliverability Features
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SendGrid:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proprietary delivery intelligence&lt;/li&gt;
&lt;li&gt;IP warming automation&lt;/li&gt;
&lt;li&gt;Spam filter testing&lt;/li&gt;
&lt;li&gt;Dedicated IP option (+$30/month per IP)&lt;/li&gt;
&lt;li&gt;Real-time analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;KumoMTA:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full bounce handling and retry logic&lt;/li&gt;
&lt;li&gt;Per-message logging&lt;/li&gt;
&lt;li&gt;Custom routing and queuing&lt;/li&gt;
&lt;li&gt;Integration with external delivery tools&lt;/li&gt;
&lt;li&gt;No proprietary deliverability magic — your reputation is your responsibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setup Complexity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SendGrid:&lt;/strong&gt; 30 minutes to API integration. Developer-friendly REST API with SDKs for all major languages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KumoMTA:&lt;/strong&gt; 2-4 hours for basic setup. Requires Linux server administration, DNS configuration, and email authentication setup. Steeper learning curve but full documentation available.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to Choose SendGrid
&lt;/h2&gt;

&lt;p&gt;Choose SendGrid if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're a startup or small team without dedicated infrastructure engineering&lt;/li&gt;
&lt;li&gt;Your email volume is under 1M/month and the cost is acceptable&lt;/li&gt;
&lt;li&gt;You need 24/7 support with SLA guarantees&lt;/li&gt;
&lt;li&gt;You want the fastest time to working email delivery&lt;/li&gt;
&lt;li&gt;You need built-in A/B testing, templates, and marketing campaign features&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When to Choose KumoMTA
&lt;/h2&gt;

&lt;p&gt;Choose KumoMTA if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're sending 2M+ emails/month and cost optimization matters&lt;/li&gt;
&lt;li&gt;You have Linux engineering capacity to manage infrastructure&lt;/li&gt;
&lt;li&gt;You need full customization of sending behavior&lt;/li&gt;
&lt;li&gt;You want to own your sender reputation and IP infrastructure&lt;/li&gt;
&lt;li&gt;You need to route email differently based on message content or recipient segments&lt;/li&gt;
&lt;li&gt;You're migrating from PowerMTA or another commercial MTA&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Migration from SendGrid to KumoMTA
&lt;/h2&gt;

&lt;p&gt;If you've decided to migrate:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1 — Preparation (1-2 weeks):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up KumoMTA on a test server&lt;/li&gt;
&lt;li&gt;Configure SPF, DKIM, and DMARC for your sending domains&lt;/li&gt;
&lt;li&gt;Set up bounce handling and logging&lt;/li&gt;
&lt;li&gt;Run parallel sends (10% to KumoMTA, 90% to SendGrid) to warm new IPs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Phase 2 — Warmup (4-6 weeks):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gradually shift volume from SendGrid to KumoMTA&lt;/li&gt;
&lt;li&gt;Monitor bounce rates and sender reputation closely&lt;/li&gt;
&lt;li&gt;Keep SendGrid running as backup during transition&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Phase 3 — Cutover:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Once KumoMTA IPs are fully warmed and reputation is established, migrate 100%&lt;/li&gt;
&lt;li&gt;Monitor for 2 weeks for any delivery issues&lt;/li&gt;
&lt;li&gt;Decommission SendGrid sending (keep account for fallback)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Can You Use Both?
&lt;/h2&gt;

&lt;p&gt;Yes — many senders use KumoMTA for transactional email (order confirmations, password resets) and SendGrid for marketing campaigns. This lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep transactional email on your owned infrastructure (fast, cheap, full control)&lt;/li&gt;
&lt;li&gt;Leverage SendGrid's marketing features (templates, A/B testing, list management)&lt;/li&gt;
&lt;li&gt;Segment your sending reputation by type (transactional sends have very different patterns than marketing)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;KumoMTA for transactional, SendGrid for marketing&lt;/strong&gt; — is the right architecture for many organizations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Choose SendGrid if...&lt;/th&gt;
&lt;th&gt;Choose KumoMTA if...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Small team, no infra eng&lt;/td&gt;
&lt;td&gt;Large volume, have infra eng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt; 1M emails/month&lt;/td&gt;
&lt;td&gt;&amp;gt; 2M emails/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want managed service&lt;/td&gt;
&lt;td&gt;Want full control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need marketing features&lt;/td&gt;
&lt;td&gt;Only need sending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast setup matters&lt;/td&gt;
&lt;td&gt;Cost optimization matters&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;Ready to set up KumoMTA?&lt;/strong&gt; See our &lt;a href="https://postmta.com/blog/kumomta-setup-guide" rel="noopener noreferrer"&gt;KumoMTA Setup Guide&lt;/a&gt; and &lt;a href="https://postmta.com/blog/open-source-email-infrastructure" rel="noopener noreferrer"&gt;Open Source Email Infrastructure Guide&lt;/a&gt; for detailed configuration instructions.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to improve your email deliverability?&lt;/strong&gt; &lt;a href="https://postmta.com" rel="noopener noreferrer"&gt;postmta.com&lt;/a&gt; provides enterprise email infrastructure consulting, MTA setup, IP warmup, and deliverability optimization for high-volume senders.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>SMTP Authentication Explained: A Technical Deep Dive for Ema</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:04:24 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/smtp-authentication-explained-a-technical-deep-dive-for-ema-3lk9</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/smtp-authentication-explained-a-technical-deep-dive-for-ema-3lk9</guid>
      <description>&lt;h1&gt;
  
  
  SMTP Authentication Explained: A Technical Deep Dive for Email Engineers
&lt;/h1&gt;

&lt;p&gt;Every email delivered on the internet passes through SMTP (Simple Mail Transfer Protocol). Yet most engineers who work with email only know it as "the thing that sends our transactional emails." Understanding SMTP authentication mechanisms is essential for anyone responsible for email deliverability.&lt;/p&gt;




&lt;h2&gt;
  
  
  The SMTP Basics
&lt;/h2&gt;

&lt;p&gt;SMTP was designed in 1982 — long before authentication was a consideration. The protocol runs on port 25 (server-to-server) or 587 (submission with STARTTLS).&lt;/p&gt;

&lt;h3&gt;
  
  
  A Standard SMTP Session
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;telnet mail.example.com 25
&lt;span class="go"&gt;220 mail.example.com ESMTP Postfix
HELO yourserver.com
250 mail.example.com Hello yourserver.com
&lt;/span&gt;&lt;span class="gp"&gt;MAIL FROM:&amp;lt;sender@example.com&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;250 OK
&lt;/span&gt;&lt;span class="gp"&gt;RCPT TO:&amp;lt;recipient@target.com&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;250 OK
DATA
&lt;/span&gt;&lt;span class="gp"&gt;354 End data with &amp;lt;CR&amp;gt;&lt;/span&gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;
&lt;span class="go"&gt;Subject: Test

This is the body.
&lt;/span&gt;&lt;span class="c"&gt;.
&lt;/span&gt;&lt;span class="go"&gt;250 OK: queued as 12345
QUIT
221 Bye
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without authentication, anyone can send mail from any address. That's the problem SMTP authentication solves.&lt;/p&gt;




&lt;h2&gt;
  
  
  SMTP Authentication Mechanisms
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. PLAIN
&lt;/h3&gt;

&lt;p&gt;The simplest authentication mechanism. Sends username and password as a single Base64-encoded string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;AUTH PLAIN
334 
dXNlcm5hbWUAVXNlcm5hbWU=c2VjcmV0
334 
AQ==
235 Authentication successful
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Format:&lt;/strong&gt; &lt;code&gt;\0username\0password&lt;/code&gt; (each separated by null byte, then Base64 encoded)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; Only secure over TLS (STARTTLS). Never use PLAIN without encryption.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. LOGIN
&lt;/h3&gt;

&lt;p&gt;Older mechanism, still widely supported. Sends username and password separately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;AUTH LOGIN
334 VXNlcm5hbWU6
dXNlcm5hbWU=
334 UGFzc3dvcmQ6
c2VjcmV0
235 Authentication successful
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; Same as PLAIN — requires TLS. Base64 encoding is not encryption.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. CRAM-MD5 (Challenge-Response)
&lt;/h3&gt;

&lt;p&gt;More secure — the server sends a challenge, and the client responds with a HMAC-MD5 hash that proves they know the password without transmitting it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;AUTH CRAM-MD5
334 PDE2OTUyLjEyMzQ1Njc4OTA=
dXNlcm5hbWUgYTJjMWM2ZjJlNWQwMzk2ZTBmODRhMzBjYzdlMmY5OA==
235 Authentication successful
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; Password is never transmitted. Still susceptible to replay attacks without additional protection.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. SCRAM-SHA-256 (Salted Challenge Response Authentication Mechanism)
&lt;/h3&gt;

&lt;p&gt;The modern standard. Defined in RFC 5802, it improves on CRAM-MD5 by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using SHA-256 instead of MD5&lt;/li&gt;
&lt;li&gt;Salting the password hash&lt;/li&gt;
&lt;li&gt;Preventing dictionary attacks&lt;/li&gt;
&lt;li&gt;Providing mutual authentication (server proves to client it knows the password too)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;AUTH SCRAM-SHA-256
334 czs0Ljc4OTAyMDQ3LjM4OTcwNzEwMDA=
c=biws,r=czs0Ljc4OTAyMDQ3LjM4OTcwNzEwMDA=,p=FsWjXmM9v8Y...
335 
d=splain,r=salt,p=storedkey
335
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; Current best practice. Use this whenever both client and server support it.&lt;/p&gt;




&lt;h2&gt;
  
  
  AUTH mechanisms in Practice
&lt;/h2&gt;

&lt;p&gt;Most modern SMTP servers advertise supported mechanisms in the EHLO response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;telnet mail.example.com 587
&lt;span class="go"&gt;220 mail.example.com ESMTP Postfix
EHLO client.example.com
250-mail.example.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN CRAM-MD5
250-AUTH PLAIN LOGIN CRAM-MD5
250 8BITMIME
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;AUTH PLAIN LOGIN CRAM-MD5&lt;/code&gt; line shows supported mechanisms. Always prefer SCRAM-SHA-256 &amp;gt; CRAM-MD5 &amp;gt; PLAIN &amp;gt; LOGIN in that order.&lt;/p&gt;




&lt;h2&gt;
  
  
  STARTTLS: Encryption in Transit
&lt;/h2&gt;

&lt;p&gt;SMTP without STARTTLS sends everything — including passwords and email content — in plain text. STARTTLS upgrades an unencrypted connection to an encrypted one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;telnet mail.example.com 587
&lt;span class="go"&gt;220 mail.example.com ESMTP Postfix
EHLO client.example.com
250-STARTTLS
250 AUTH PLAIN LOGIN
AUTH LOGIN
334 VXNlcm5hbWU6
&lt;/span&gt;&lt;span class="c"&gt;...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Without STARTTLS:&lt;/strong&gt; An eavesdropper on the network can read all your emails and steal SMTP credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With STARTTLS:&lt;/strong&gt; The connection is encrypted. However, STARTTLS can be stripped by man-in-the-middle attacks (opportunistic encryption doesn't verify certificates by default).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strict TLS (RFC 8460):&lt;/strong&gt; Forces encryption and verifies certificates. Required for DMARC alignment in some configurations.&lt;/p&gt;

&lt;p&gt;KumoMTA configuration for strict TLS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hocon"&gt;&lt;code&gt;&lt;span class="nl"&gt;submission&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;tls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;verify&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  OAuth 2.0 for SMTP (XOAUTH2)
&lt;/h2&gt;

&lt;p&gt;Traditional username/password SMTP auth is increasingly blocked by modern email providers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gmail/Google Workspace:&lt;/strong&gt; App Passwords required for SMTP (going away in 2024-2026), OAuth 2.0 is the replacement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft/Office 365:&lt;/strong&gt; Modern authentication (OAuth 2.0) required, basic auth being deprecated&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  XOAUTH2 Protocol
&lt;/h3&gt;

&lt;p&gt;Instead of username/password, you use an OAuth 2.0 access token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;AUTH XOAUTH2
334 eyJhbGciOiJSUzI1NiJ9...
235 Authentication successful
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SASL XOAUTH2 format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user=&amp;lt;email&amp;gt;^Aauth=Bearer &amp;lt;access_token&amp;gt;^A^A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Getting OAuth 2.0 Tokens
&lt;/h3&gt;

&lt;p&gt;For Google Workspace:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a project in Google Cloud Console&lt;/li&gt;
&lt;li&gt;Enable the Gmail API&lt;/li&gt;
&lt;li&gt;Create OAuth 2.0 credentials (Client ID + Client Secret)&lt;/li&gt;
&lt;li&gt;Use the OAuth 2.0 Playground or your own auth flow to get a refresh token&lt;/li&gt;
&lt;li&gt;Exchange refresh token for access token&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For Microsoft:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Register an app in Azure AD&lt;/li&gt;
&lt;li&gt;Request &lt;code&gt;https://outlook.office365.com/.default&lt;/code&gt; scope&lt;/li&gt;
&lt;li&gt;Use MSAL library to get tokens&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  KumoMTA OAuth 2.0 Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hocon"&gt;&lt;code&gt;&lt;span class="nl"&gt;auth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;oauth2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;provider&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"google"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;client_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-client-id.apps.googleusercontent.com"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;client_secret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-client-secret"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;refresh_token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-refresh-token"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  SMTP Authentication for Different Providers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gmail/Google Workspace
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;App Passwords&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Deprecated&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Being phased out, use OAuth 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth 2.0 (XOAUTH2)&lt;/td&gt;
&lt;td&gt;✅ Recommended&lt;/td&gt;
&lt;td&gt;Requires Azure/GCP setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic AUTH&lt;/td&gt;
&lt;td&gt;⚠️ Limited&lt;/td&gt;
&lt;td&gt;Only with 2FA App Passwords&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Microsoft/Office 365
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Modern Auth (OAuth 2.0)&lt;/td&gt;
&lt;td&gt;✅ Required&lt;/td&gt;
&lt;td&gt;Basic auth being deprecated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMTP AUTH&lt;/td&gt;
&lt;td&gt;⚠️ Conditional&lt;/td&gt;
&lt;td&gt;Must be enabled per mailbox&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Amazon SES
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMTP credentials&lt;/td&gt;
&lt;td&gt;✅ Standard&lt;/td&gt;
&lt;td&gt;Generated in SES console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM users&lt;/td&gt;
&lt;td&gt;✅ Alternative&lt;/td&gt;
&lt;td&gt;More granular permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth 2.0&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;SES uses AWS sig v4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Mailgun
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMTP credentials&lt;/td&gt;
&lt;td&gt;✅ Standard&lt;/td&gt;
&lt;td&gt;Generated in domain settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API key&lt;/td&gt;
&lt;td&gt;✅ Preferred&lt;/td&gt;
&lt;td&gt;Faster, no SMTP overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth 2.0&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;Use API for sending&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Security Best Practices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Always use TLS (STARTTLS) for SMTP submission:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hocon"&gt;&lt;code&gt;&lt;span class="nl"&gt;submission&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;tls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Rotate SMTP credentials regularly:&lt;/strong&gt;&lt;br&gt;
Set a calendar reminder every 90 days to rotate SMTP passwords for any service accounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Use dedicated credentials per service:&lt;/strong&gt;&lt;br&gt;
Don't share SMTP credentials across applications. If one service is compromised, you can revoke one credential set without affecting others.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Monitor for unauthorized SMTP auth attempts:&lt;/strong&gt;&lt;br&gt;
Your mail server logs show every authentication attempt. Set up alerts for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Failed authentication attempts (indicates brute force)&lt;/li&gt;
&lt;li&gt;Authentication from unexpected IPs&lt;/li&gt;
&lt;li&gt;Authentication for non-existent users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Use OAuth 2.0 wherever possible:&lt;/strong&gt;&lt;br&gt;
It's resistant to credential theft and doesn't require storing passwords.&lt;/p&gt;


&lt;h2&gt;
  
  
  Testing SMTP Authentication
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Test with OpenSSL:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; mail.example.com:587 &lt;span class="nt"&gt;-starttls&lt;/span&gt; smtp
EHLO test.com
AUTH PLAIN
&lt;span class="c"&gt;# paste Base64 credentials&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Test with swaks (Swiss Army Knife for SMTP):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;swaks &lt;span class="nt"&gt;--to&lt;/span&gt; recipient@example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from&lt;/span&gt; sender@example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--server&lt;/span&gt; mail.example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--auth&lt;/span&gt; PLAIN &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--auth-user&lt;/span&gt; username &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--auth-password&lt;/span&gt; password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Test OAuth 2.0:&lt;/strong&gt;&lt;br&gt;
Use &lt;a href="https://developers.google.com/oauthplayground/" rel="noopener noreferrer"&gt;OAuth 2.0 Playground&lt;/a&gt; for Google, or &lt;a href="https://developer.microsoft.com/en-us/graph/graph-explorer/" rel="noopener noreferrer"&gt;Microsoft Identity Platform&lt;/a&gt; for Office 365.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting Authentication Failures
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;535 Authentication credentials invalid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wrong password or expired token&lt;/td&gt;
&lt;td&gt;Regenerate credentials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;535 5.7.3 Authentication mechanism not supported&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Client/server mechanism mismatch&lt;/td&gt;
&lt;td&gt;Use supported mechanism from EHLO list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;534 5.7.9 Application-specific password required&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Google requiring 2FA + App Password&lt;/td&gt;
&lt;td&gt;Set up App Password or switch to OAuth 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;454 4.7.0 TLS required&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Server requires encrypted connection&lt;/td&gt;
&lt;td&gt;Add STARTTLS to your SMTP client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;530 5.7.0 Authentication required&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;AUTH not advertised or required&lt;/td&gt;
&lt;td&gt;Check EHLO for AUTH mechanisms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;Related Guides:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://postmta.com/blog/email-authentication-guide" rel="noopener noreferrer"&gt;Email Authentication: DKIM, SPF &amp;amp; DMARC&lt;/a&gt; — Complete authentication setup&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://postmta.com/blog/kumomta-setup-guide" rel="noopener noreferrer"&gt;KumoMTA Setup Guide&lt;/a&gt; — Configure SMTP authentication in KumoMTA&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://postmta.com/blog/open-source-email-infrastructure" rel="noopener noreferrer"&gt;Open Source Email Infrastructure Guide&lt;/a&gt; — Self-hosted SMTP architecture&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Ready to improve your email deliverability?&lt;/strong&gt; &lt;a href="https://postmta.com" rel="noopener noreferrer"&gt;postmta.com&lt;/a&gt; provides enterprise email infrastructure consulting, MTA setup, IP warmup, and deliverability optimization for high-volume senders.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>The Definitive Guide to Self-Hosted Email Infrastructure in</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:03:58 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/the-definitive-guide-to-self-hosted-email-infrastructure-in-1dhh</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/the-definitive-guide-to-self-hosted-email-infrastructure-in-1dhh</guid>
      <description>&lt;h1&gt;
  
  
  The Definitive Guide to Self-Hosted Email Infrastructure in 2026
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Why would anyone self-host email in 2026?&lt;/strong&gt; AWS SES, SendGrid, Mailgun, and Postmark exist. They're cheap, reliable, and require zero maintenance. &lt;/p&gt;

&lt;p&gt;And yet — serious senders are moving back to self-hosted. Here's why, and how to do it right.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Cost of Cloud Email Services
&lt;/h2&gt;

&lt;p&gt;Cloud SMTP services charge by the email, not by the infrastructure. For transactional email at scale, this adds up fast:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SendGrid&lt;/td&gt;
&lt;td&gt;100K emails&lt;/td&gt;
&lt;td&gt;~$89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SendGrid&lt;/td&gt;
&lt;td&gt;1M emails&lt;/td&gt;
&lt;td&gt;~$499&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mailgun&lt;/td&gt;
&lt;td&gt;50K emails&lt;/td&gt;
&lt;td&gt;~$50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS SES&lt;/td&gt;
&lt;td&gt;1M emails&lt;/td&gt;
&lt;td&gt;~$100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;But the real cost isn't the per-email fee. It's &lt;strong&gt;the 30-70% revenue markup&lt;/strong&gt; on your email program when you hit serious volume. A sender doing 10M/month emails pays $500-1000 on SES vs $2500-5000 on SendGrid.&lt;/p&gt;

&lt;p&gt;More importantly: &lt;strong&gt;you don't own your infrastructure.&lt;/strong&gt; When AWS has an SES outage (it happens), your transactional emails stop. When SendGrid gets flagged by Gmail (it happens), you have no control over remediation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Open Source MTAs Are Having a Moment
&lt;/h2&gt;

&lt;p&gt;The open source MTA landscape has matured dramatically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KumoMTA&lt;/strong&gt; — The modern successor to PowerMTA. Built by the team that created PowerMTA. Written in Rust for performance and memory safety. Full commercial support available. Handles 10M+ messages/hour on commodity hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Postfix&lt;/strong&gt; — The de facto standard for Linux mail servers. Ubiquitous, rock-stable, well-documented. Best as a mail transfer agent (receiving/proxy) rather than a high-volume sender.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exim&lt;/strong&gt; — Flexible and powerful, but increasingly showing its age. Still popular in UK hosting environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Haraka&lt;/strong&gt; — High-performance SMTP server written in Node.js. Excellent plugin architecture. Scales well but complex to operate at very high volume.&lt;/p&gt;




&lt;h2&gt;
  
  
  KumoMTA vs Postfix: When to Use Each
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use KumoMTA when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're sending transactional email at scale (100K+/day)&lt;/li&gt;
&lt;li&gt;You need granular bounce handling and routing logic&lt;/li&gt;
&lt;li&gt;You want detailed per-message logging and analytics&lt;/li&gt;
&lt;li&gt;You need commercial support with SLA guarantees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Postfix when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're handling inbound mail routing&lt;/li&gt;
&lt;li&gt;You need a mail relay/proxy in front of a cloud service&lt;/li&gt;
&lt;li&gt;Simplicity and ubiquity matter more than raw performance&lt;/li&gt;
&lt;li&gt;You're already running Postfix and just need basic relay&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Hardware Requirements for Self-Hosted Email
&lt;/h2&gt;

&lt;p&gt;One of the biggest misconceptions: you need expensive hardware. You don't.&lt;/p&gt;

&lt;p&gt;KumoMTA benchmarks on commodity cloud hardware:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instance&lt;/th&gt;
&lt;th&gt;vCPUs&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Emails/Hour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS t3.medium&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4GB&lt;/td&gt;
&lt;td&gt;~500K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS t3.large&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8GB&lt;/td&gt;
&lt;td&gt;~1.2M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS c5.xlarge&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8GB&lt;/td&gt;
&lt;td&gt;~3M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS c5.2xlarge&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;td&gt;~8M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For most applications, a single t3.large ($60/month) handles 1-2M emails/day comfortably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Critical:&lt;/strong&gt; Email deliverability is IP-based. Separate your transactional email infrastructure from your web servers. Never send from the same IPs that run your web application.&lt;/p&gt;




&lt;h2&gt;
  
  
  Network Architecture for Self-Hosted Email
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Application Servers]
       ↓ SMTP
[KumoMTA - Outbound MTA] ← Your IP reputation lives here
       ↓
[接收服务器 - Gmail, Outlook, etc.]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key architectural decisions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dedicated IPs:&lt;/strong&gt; Use 1 IP per 50K-100K daily volume. Mix warm IPs with cold ones so a new IP warming doesn't affect your main traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;InboundMX servers:&lt;/strong&gt; Separate servers to receive bounces, FBL notifications, and inbound mail. Don't mix inbound and outbound on the same infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Analytics relay:&lt;/strong&gt; A light SMTP relay that copies headers to your logging system before forwarding. Useful for debugging delivery issues without slowing down main send path.&lt;/p&gt;




&lt;h2&gt;
  
  
  DNS Configuration: Your Sender Identity
&lt;/h2&gt;

&lt;p&gt;This is where most teams fail. Your DNS is your sender identity. Configure it before you send a single email.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Authentication Trinity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SPF:&lt;/strong&gt; Authorize your sending servers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.postmta.com include:_spf.google.com ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DKIM:&lt;/strong&gt; Sign every message with your private key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;selector._domainkey.postmta.com IN TXT (
  "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA..."
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DMARC:&lt;/strong&gt; Tie it together and get reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_dmarc.postmta.com IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@postmta.com; pct=100"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reverse DNS (PTR Records)
&lt;/h3&gt;

&lt;p&gt;Your sending IP must resolve to your domain. Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;host 162.222.226.207
&lt;span class="go"&gt;207.226.222.162.in-addr.arpa domain pointer postmta.com.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If PTR doesn't match your HELO hostname, Gmail and Microsoft will start rejecting your mail.&lt;/p&gt;

&lt;h3&gt;
  
  
  MX and SPF for Bounce/Feedback Domains
&lt;/h3&gt;

&lt;p&gt;Use separate domains for bounce handling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Return-Path:&lt;/code&gt; via &lt;code&gt;bounce.postmta.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;SPF: &lt;code&gt;v=spf1 include:_spf.postmta.com ~all&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;DMARC on &lt;code&gt;postmta.com&lt;/code&gt;, separate DMARC on &lt;code&gt;bounce.postmta.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This lets you track bounce rates by domain and isolate reputation problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up KumoMTA: Step by Step
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install on Ubuntu 22.04&lt;/span&gt;
curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/KumoCorp/kumomta/releases/latest/download/kumomta_latest_amd64.deb &lt;span class="nt"&gt;-o&lt;/span&gt; kumomta.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; kumomta.deb

&lt;span class="c"&gt;# Configure&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/kumomta/kumomta.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basic sending configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kumomta&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kumomta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Outbound&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
&lt;span class="n"&gt;remote_queue&lt;/span&gt; &lt;span class="s2"&gt;"outbound"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;concurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;
  &lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10000/hour"&lt;/span&gt;  &lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Adjust&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="n"&gt;warming&lt;/span&gt; &lt;span class="n"&gt;stage&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;DKIM&lt;/span&gt; &lt;span class="n"&gt;signing&lt;/span&gt;
&lt;span class="n"&gt;dkim&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="n"&gt;selector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"mail"&lt;/span&gt;
  &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"postmta.com"&lt;/span&gt;
  &lt;span class="n"&gt;private_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/etc/kumomta/dkim/mail.private"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Bounce&lt;/span&gt; &lt;span class="n"&gt;handling&lt;/span&gt;
&lt;span class="n"&gt;bounce&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;use_8bitmime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;log_bounces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="n"&gt;log_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/var/log/kumomta/bounces.log"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Send your first test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"From: postmaster@postmta.com
To: test@gmail.com
Subject: Test

Test message body"&lt;/span&gt; | /usr/bin/kumomta-send &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--server&lt;/span&gt; 127.0.0.1:25 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from&lt;/span&gt; postmaster@postmta.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--to&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;@gmail.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  IP Warming: The Right Way
&lt;/h2&gt;

&lt;p&gt;New sending IPs take 4-6 weeks to build reputation. Rushing this is the most common mistake.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1:&lt;/strong&gt; 100 emails/day to your most engaged recipients only&lt;br&gt;
&lt;strong&gt;Week 2:&lt;/strong&gt; 500 emails/day, expand to broader list&lt;br&gt;
&lt;strong&gt;Week 3:&lt;/strong&gt; 2,000 emails/day&lt;br&gt;
&lt;strong&gt;Week 4:&lt;/strong&gt; 10,000 emails/day&lt;br&gt;
&lt;strong&gt;Week 5:&lt;/strong&gt; 50,000 emails/day&lt;br&gt;
&lt;strong&gt;Week 6:&lt;/strong&gt; Full volume&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor daily:&lt;/strong&gt; If bounce rate exceeds 1%, reduce volume and investigate before continuing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Monitoring Your Self-Hosted Email Infrastructure
&lt;/h2&gt;

&lt;p&gt;Track these metrics daily:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delivery Metrics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bounce rate (target: &amp;lt; 1% hard, &amp;lt; 3% soft)&lt;/li&gt;
&lt;li&gt;Complaint rate (target: &amp;lt; 0.1%)&lt;/li&gt;
&lt;li&gt;IP reputation score (target: 90+ on Sender Score)&lt;/li&gt;
&lt;li&gt;Gmail Postmaster Tools: delivery errors, spam rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure Metrics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Queue depth (target: &amp;lt; 1000 messages)&lt;/li&gt;
&lt;li&gt;Delivery latency (target: &amp;lt; 30 seconds for transactional)&lt;/li&gt;
&lt;li&gt;Connection errors&lt;/li&gt;
&lt;li&gt;Disk I/O on mail server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Postmaster Tools (free, Gmail reputation)&lt;/li&gt;
&lt;li&gt;Microsoft SNDS (free, Outlook reputation)&lt;/li&gt;
&lt;li&gt;Sender Score by Validity (free, overall IP score)&lt;/li&gt;
&lt;li&gt;MXToolbox Blacklist Check (free, blacklist status)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Is Self-Hosted Right for You?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Yes, if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're sending 500K+ emails/month&lt;/li&gt;
&lt;li&gt;You want to own your sender reputation&lt;/li&gt;
&lt;li&gt;You have engineering capacity to maintain infrastructure&lt;/li&gt;
&lt;li&gt;Cost savings at scale matter to your business&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stick with cloud services if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're under 100K emails/month&lt;/li&gt;
&lt;li&gt;You have no infrastructure engineering capacity&lt;/li&gt;
&lt;li&gt;You need SLA guarantees and 24/7 support&lt;/li&gt;
&lt;li&gt;Your sending patterns are highly irregular&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;Ready to explore self-hosted? Start with our &lt;a href="https://postmta.com/blog/kumomta-setup-guide" rel="noopener noreferrer"&gt;KumoMTA Setup Guide&lt;/a&gt; and &lt;a href="https://postmta.com/blog/ip-warmup-strategies-2026" rel="noopener noreferrer"&gt;IP Warmup Best Practices&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to improve your email deliverability?&lt;/strong&gt; &lt;a href="https://postmta.com" rel="noopener noreferrer"&gt;postmta.com&lt;/a&gt; provides enterprise email infrastructure consulting, MTA setup, IP warmup, and deliverability optimization for high-volume senders.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>DKIM, SPF &amp; DMARC: The Complete Email Authentication Guide f</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:03:33 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/dkim-spf-dmarc-the-complete-email-authentication-guide-f-4gp5</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/dkim-spf-dmarc-the-complete-email-authentication-guide-f-4gp5</guid>
      <description>&lt;h1&gt;
  
  
  DKIM, SPF &amp;amp; DMARC: The Complete Email Authentication Guide for 2026
&lt;/h1&gt;

&lt;p&gt;Email authentication isn't optional anymore. Gmail and Yahoo now require SPF, DKIM, and DMARC for any sender above 5,000 daily recipients. Microsoft has required it for years. If your authentication is wrong, your mail goes to spam — or doesn't get delivered at all.&lt;/p&gt;

&lt;p&gt;This guide covers every technical detail of email authentication.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Email Authentication Matters Now More Than Ever
&lt;/h2&gt;

&lt;p&gt;In 2024, Google and Yahoo introduced mandatory email authentication requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SPF and DKIM required&lt;/strong&gt; for any domain sending more than 5,000 emails/day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DMARC required&lt;/strong&gt; for bulk senders (or your mail goes to spam)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BIMI&lt;/strong&gt; (Brand Indicators for Message Identification) lets you display your logo in inboxes — requires DMARC at &lt;code&gt;p=quarantine&lt;/code&gt; or stricter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without authentication, you're invisible to modern email systems. With it, you control your sender identity and protect against spoofing.&lt;/p&gt;




&lt;h2&gt;
  
  
  SPF: Who Can Send For Your Domain
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How SPF Works
&lt;/h3&gt;

&lt;p&gt;When your mail server receives a message &lt;code&gt;From: sender@example.com&lt;/code&gt;, it looks up the SPF record for &lt;code&gt;example.com&lt;/code&gt; in DNS. If the sending server's IP is listed, the message passes SPF. If not, it fails.&lt;/p&gt;

&lt;h3&gt;
  
  
  SPF Record Syntax
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 ip4:162.222.226.207 include:_spf.google.com include:_spf.mailgun.org ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v=spf1&lt;/code&gt; — Version identifier (always exactly this)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ip4:162.222.226.207&lt;/code&gt; — Authorize specific IP addresses&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;include:_spf.google.com&lt;/code&gt; — Include another domain's SPF record&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~all&lt;/code&gt; — Soft fail (treat failures as suspicious but don't reject). Use &lt;code&gt;-all&lt;/code&gt; for hard fail once tested.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Common SPF Mistakes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Too many lookups:&lt;/strong&gt; SPF has a 10-DNS-lookup limit. Every &lt;code&gt;include:&lt;/code&gt;, &lt;code&gt;a:&lt;/code&gt;, &lt;code&gt;mx:&lt;/code&gt;, &lt;code&gt;ptr:&lt;/code&gt;, and &lt;code&gt;redirect&lt;/code&gt; counts. Exceed this and SPF breaks silently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# BAD — hits lookup limit fast
v=spf1 include:server1.com include:server2.com include:server3.com 
       include:mailserver1.com include:mailserver2.com 
       include:sendgrid.net include:mailgun.org ~all

# GOOD — minimize includes
v=spf1 ip4:162.222.226.207 include:_spf.postmta.com ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Including PTR records:&lt;/strong&gt; Never use &lt;code&gt;ptr:&lt;/code&gt; — it's unreliable and counts as 2 lookups per lookup. Use &lt;code&gt;a:&lt;/code&gt; or &lt;code&gt;ip4:&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not including your web server:&lt;/strong&gt; If your application sends email (order confirmations, password resets), include your server IPs.&lt;/p&gt;

&lt;h3&gt;
  
  
  SPF for Multiple Sending Sources
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 
  ip4:162.222.226.207          # Your KumoMTA server
  ip4:10.0.0.1                 # Your application server
  include:_spf.google.com       # Google Workspace
  include:sendgrid.net           # SendGrid (if you use it for some campaigns)
  ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  DKIM: Cryptographic Message Signing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How DKIM Works
&lt;/h3&gt;

&lt;p&gt;DKIM attaches a digital signature to every outbound message. The signature is created using your &lt;strong&gt;private key&lt;/strong&gt; (stored on your mail server) and verified using your &lt;strong&gt;public key&lt;/strong&gt; (published in DNS).&lt;/p&gt;

&lt;p&gt;The signature covers the message headers and body — any tampering in transit breaks the signature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generating DKIM Keys
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate 2048-bit DKIM key pair&lt;/span&gt;
openssl genrsa &lt;span class="nt"&gt;-out&lt;/span&gt; dkim_private.pem 2048
openssl rsa &lt;span class="nt"&gt;-in&lt;/span&gt; dkim_private.pem &lt;span class="nt"&gt;-pubout&lt;/span&gt; &lt;span class="nt"&gt;-out&lt;/span&gt; dkim_public.pem

&lt;span class="c"&gt;# Set correct permissions&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 dkim_private.pem
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;dkim_private.pem /etc/kumomta/dkim/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DKIM DNS Record
&lt;/h3&gt;

&lt;p&gt;Publish your public key in DNS with a selector:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mail._domainkey.postmta.com IN TXT (
  "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB..."
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mail&lt;/code&gt; — Selector. You can use any selector name. Multiple selectors = multiple DKIM keys for key rotation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=&lt;/code&gt; — Your public key (paste the contents of &lt;code&gt;dkim_public.pem&lt;/code&gt; after the &lt;code&gt;-----BEGIN PUBLIC KEY-----&lt;/code&gt; header)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Verifying DKIM is Working
&lt;/h3&gt;

&lt;p&gt;Send a test message and check the headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;Received-SPF&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; pass (google.com: domain of postmaster@postmta.com designates 162.222.226.207 as permitted sender)&lt;/span&gt;
&lt;span class="nt"&gt;Authentication-Results&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; mx.google.com;
       dkim=pass header.i=@postmta.com header.s=mail header.b=ABC123;
       spf=pass google.com;
       dmarc=pass header.from=postmta.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see &lt;code&gt;dkim=fail&lt;/code&gt; or &lt;code&gt;dkim=neutral&lt;/code&gt;, your signature isn't being added or DNS isn't publishing correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  DKIM Key Rotation
&lt;/h3&gt;

&lt;p&gt;Rotate your DKIM keys every 90 days:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate new key pair&lt;/li&gt;
&lt;li&gt;Add new DKIM record with a new selector (e.g., &lt;code&gt;mail2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Wait 2 TTL cycles (48-72 hours) for DNS to propagate&lt;/li&gt;
&lt;li&gt;Update KumoMTA to use new selector&lt;/li&gt;
&lt;li&gt;Remove old selector DNS record after 2 weeks&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  DMARC: Tying It All Together
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How DMARC Works
&lt;/h3&gt;

&lt;p&gt;DMARC tells receiving servers what to do when SPF and DKIM both fail (or one fails). It also sends you XML reports about authentication results.&lt;/p&gt;

&lt;h3&gt;
  
  
  DMARC Record Syntax
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_dmarc.postmta.com IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@postmta.com; pct=100; rf=afrf"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v=DMARC1&lt;/code&gt; — Version (always exactly this)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=quarantine&lt;/code&gt; — Policy: &lt;code&gt;none&lt;/code&gt; (monitor only), &lt;code&gt;quarantine&lt;/code&gt; (mark suspicious as spam), &lt;code&gt;reject&lt;/code&gt; (hard reject)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rua=mailto:...&lt;/code&gt; — Aggregate reports (daily XML summary of authentication results)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pct=100&lt;/code&gt; — Percentage of mail to apply policy to (start with 10-25%, ramp to 100%)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rf=afrf&lt;/code&gt; — Report format: &lt;code&gt;afrf&lt;/code&gt; (Authentication Failure Reporting Format) or &lt;code&gt;iodef&lt;/code&gt; (IODEF for industry standard)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DMARC Alignment
&lt;/h3&gt;

&lt;p&gt;For DMARC to pass, either SPF or DKIM must &lt;strong&gt;align&lt;/strong&gt; with the From: header domain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPF Alignment:&lt;/strong&gt; The &lt;code&gt;MAIL FROM&lt;/code&gt; domain (used in SMTP envelope) must match or be a subdomain of the &lt;code&gt;From:&lt;/code&gt; header domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DKIM Alignment:&lt;/strong&gt; The &lt;code&gt;d=&lt;/code&gt; domain in the DKIM signature must match or be a subdomain of the &lt;code&gt;From:&lt;/code&gt; header domain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# This fails DMARC even with valid SPF/DKIM:
From: postmaster@postmta.com
MAIL FROM: mailgun.org (sends for postmta.com via Mailgun)
# MAIL FROM domain (mailgun.org) ≠ From domain (postmta.com) — DMARC fails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reading DMARC Reports
&lt;/h3&gt;

&lt;p&gt;DMARC aggregate reports are XML sent to your &lt;code&gt;rua:&lt;/code&gt; email address. They tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many messages passed/failed SPF, DKIM, DMARC&lt;/li&gt;
&lt;li&gt;Which IPs are sending for your domain (authorized and unauthorized)&lt;/li&gt;
&lt;li&gt;Which sources are failing authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use a DMARC report parser like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;dmarcian.com&lt;/strong&gt; (has a free analyzer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kumomta DMARC Reporter&lt;/strong&gt; (open source)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MXToolbox DMARC Analyzer&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Progressive DMARC Deployment
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Phase 1 — Monitor (2-4 weeks):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DMARC1; p=none; rua=mailto:dmarc@postmta.com; pct=25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Phase 2 — Quarantine (2-4 weeks after verifying all legitimate sources authenticate):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DMARC1; p=quarantine; rua=mailto:dmarc@postmta.com; pct=50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Phase 3 — Full Deployment:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DMARC1; p=reject; rua=mailto:dmarc@postmta.com; pct=100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  BIMI: Display Your Logo in Inboxes
&lt;/h2&gt;

&lt;p&gt;BIMI (Brand Indicators for Message Identification) adds your brand logo next to your emails in supporting email clients (Gmail, Apple Mail, Outlook.com).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirements for BIMI:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DMARC at &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Valid SPF and DKIM&lt;/li&gt;
&lt;li&gt;SVG logo published at a known URL&lt;/li&gt;
&lt;li&gt;VMC (Verified Mark Certificate) — optional but required for Gmail (EV certificates from DigiCert or Certum)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;BIMI DNS Record:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default._bimi.postmta.com IN TXT "v=BIMI1; l=https://postmta.com/logo.svg; a=https://postmta.com/bimi.pem"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Authentication Failures and How to Fix Them
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dkim=fail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signature not added or key mismatch&lt;/td&gt;
&lt;td&gt;Check KumoMTA DKIM config, verify DNS TXT record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spf=fail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sending IP not in SPF record&lt;/td&gt;
&lt;td&gt;Add IP to SPF record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dmarc=fail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Neither SPF nor DKIM aligned&lt;/td&gt;
&lt;td&gt;Fix alignment, check MAIL FROM domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;dmarc=pass&lt;/code&gt; but mail goes to spam&lt;/td&gt;
&lt;td&gt;Reputation issue, not authentication&lt;/td&gt;
&lt;td&gt;Check IP reputation, content signals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dkim=neutral&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DKIM signature not attempted&lt;/td&gt;
&lt;td&gt;KumoMTA not signing, check &lt;code&gt;dkim.sign=true&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Authentication Checklist
&lt;/h2&gt;

&lt;p&gt;Before sending any marketing or transactional campaign:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] SPF record published and includes all sending IPs&lt;/li&gt;
&lt;li&gt;[ ] DKIM keys generated and configured in KumoMTA&lt;/li&gt;
&lt;li&gt;[ ] DKIM public key published in DNS with correct selector&lt;/li&gt;
&lt;li&gt;[ ] DMARC record published starting with &lt;code&gt;p=none&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] DMARC aggregate reports going to a monitored inbox&lt;/li&gt;
&lt;li&gt;[ ] DMARC reports reviewed — all legitimate sources passing&lt;/li&gt;
&lt;li&gt;[ ] DMARC progressive rollout planned (none → quarantine → reject)&lt;/li&gt;
&lt;li&gt;[ ] Reverse DNS (PTR) matches your HELO hostname&lt;/li&gt;
&lt;li&gt;[ ] BIMI planned for brand protection&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tools for Email Authentication
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MXToolbox&lt;/strong&gt; — SPF, DKIM, DMARC lookup and DNS check&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kitterman SPF Validator&lt;/strong&gt; — SPF record syntax checker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DMARC Inspector&lt;/strong&gt; — DNS and record validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Admin Toolbox&lt;/strong&gt; — Check SPF/DKIM/DMARC for any domain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mail-Tester&lt;/strong&gt; — Send a test email and get full authentication report&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dmarcian&lt;/strong&gt; — DMARC report aggregation and analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gmail Postmaster Tools&lt;/strong&gt; — Free authentication data for Gmail senders&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Related Guides:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://postmta.com/blog/kumomta-setup-guide" rel="noopener noreferrer"&gt;KumoMTA Setup Guide&lt;/a&gt; — Configure KumoMTA with proper authentication&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://postmta.com/blog/ip-warmup-strategies-2026" rel="noopener noreferrer"&gt;IP Warmup Best Practices&lt;/a&gt; — Build sender reputation alongside authentication&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://postmta.com/blog/bounce-rate-reduction-guide" rel="noopener noreferrer"&gt;Bounce Rate Reduction Guide&lt;/a&gt; — Keep your list clean so authentication matters&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Ready to improve your email deliverability?&lt;/strong&gt; &lt;a href="https://postmta.com" rel="noopener noreferrer"&gt;postmta.com&lt;/a&gt; provides enterprise email infrastructure consulting, MTA setup, IP warmup, and deliverability optimization for high-volume senders.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>ip-warmup-guide.md</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:03:07 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/ip-warmup-guidemd-33oh</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/ip-warmup-guidemd-33oh</guid>
      <description>&lt;h2&gt;
  
  
  Why IP Warmup Is Non-Negotiable
&lt;/h2&gt;

&lt;p&gt;Internet service providers (Gmail, Outlook, Yahoo, Apple Mail) use sender reputation as their primary spam filter. Reputation is a score between -10 and 10 attached to your sending IP address, built from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volume history&lt;/strong&gt; — How much email you send and how consistently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bounce rate&lt;/strong&gt; — Percentage of invalid recipients&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complaint rate&lt;/strong&gt; — How many recipients mark you as spam&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spam trap hits&lt;/strong&gt; — Emails sent to dormant/harvested addresses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engagement&lt;/strong&gt; — Read, click, reply rates on your messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A brand new IP has &lt;strong&gt;zero reputation&lt;/strong&gt;. ISPs treat zero-reputation IPs as high-risk by default. Sending high volume from a cold IP is the fastest way to signal to every major ISP that you're a spammer.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 8-Week IP Warmup Schedule
&lt;/h2&gt;

&lt;p&gt;This schedule works for any major ISP. Adjust based on your bounce and complaint data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Verification (Days 1–7)
&lt;/h3&gt;

&lt;p&gt;Before sending anything, verify your infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] SPF, DKIM, and DMARC DNS records are live and passing&lt;/li&gt;
&lt;li&gt;[ ] Your From domain matches your sending domain&lt;/li&gt;
&lt;li&gt;[ ] List is double opt-in — zero purchased or scraped lists&lt;/li&gt;
&lt;li&gt;[ ] Postmaster tools registered: &lt;a href="https://postmaster.google.com" rel="noopener noreferrer"&gt;Gmail Postmaster&lt;/a&gt;, &lt;a href="https://sendersupport.olc.protection.outlook.com/snds/" rel="noopener noreferrer"&gt;Microsoft SNDS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Dedicated IPs assigned (minimum 2 for rotation)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 2: Soft Launch (Days 8–14)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Day 8–10: 500 emails/day&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send to your most engaged subscribers only (opened in last 30 days)&lt;/li&gt;
&lt;li&gt;No HTML formatting — plain text preferred&lt;/li&gt;
&lt;li&gt;No attachments, no images&lt;/li&gt;
&lt;li&gt;Watch bounce rate: must stay below 2%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Day 11–14: 2,000 emails/day&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expand to 60-day engaged segment&lt;/li&gt;
&lt;li&gt;Include simple HTML (logo + text)&lt;/li&gt;
&lt;li&gt;Track complaint rate: must stay below 0.1%&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: Ramp (Days 15–28)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;15–17&lt;/td&gt;
&lt;td&gt;10,000/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18–20&lt;/td&gt;
&lt;td&gt;25,000/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21–24&lt;/td&gt;
&lt;td&gt;75,000/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25–28&lt;/td&gt;
&lt;td&gt;150,000/day&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Phase 4: Scale (Days 29–56)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;300,000/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;600,000/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;1,000,000/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8+&lt;/td&gt;
&lt;td&gt;Full volume&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Golden rule: Never increase by more than 2–3x week-over-week once above 50K/day.&lt;/strong&gt; Faster ramps trigger ISP throttling.&lt;/p&gt;




&lt;h2&gt;
  
  
  MTA-Level Warmup Controls
&lt;/h2&gt;

&lt;h3&gt;
  
  
  KumoMTA: Traffic Shaper Warmup
&lt;/h3&gt;

&lt;p&gt;Use Lua scripting to enforce warmup caps automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Warmup traffic shaper per IP pool&lt;/span&gt;
&lt;span class="n"&gt;kumo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;define_traffic_shaper&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'warmup-phase-1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;max_message_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;-- ~5,000/day assuming 8h active&lt;/span&gt;
  &lt;span class="n"&gt;max_outbound_connections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;kumo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;define_traffic_shaper&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'warmup-phase-3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;max_message_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;max_outbound_connections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- Assign senders to warmup pools&lt;/span&gt;
&lt;span class="n"&gt;kumo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;define_smtp_source&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'warmup-sender-1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;shaper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'warmup-phase-1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;egress_pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'warmup-pool-1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PowerMTA: Per-IP Rate Limiting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;domain&lt;/span&gt; IP-address-pool warmup-pool-1
&lt;span class="k"&gt;  ip-pool&lt;/span&gt; warmup-pool-1
&lt;span class="k"&gt;    max-msg-rate&lt;/span&gt; 50/m
&lt;span class="k"&gt;    max-rcpt-per-msg&lt;/span&gt; 1
&lt;span class="k"&gt;    max-smtp-out&lt;/span&gt; 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rotate IPs through progressively larger pools as reputation builds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Monitoring Dashboard
&lt;/h2&gt;

&lt;p&gt;Track these metrics daily during warmup:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Good&lt;/th&gt;
&lt;th&gt;Warning&lt;/th&gt;
&lt;th&gt;Danger&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bounce rate&lt;/td&gt;
&lt;td&gt;&amp;lt; 2%&lt;/td&gt;
&lt;td&gt;2–5%&lt;/td&gt;
&lt;td&gt;&amp;gt; 5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complaint rate&lt;/td&gt;
&lt;td&gt;&amp;lt; 0.1%&lt;/td&gt;
&lt;td&gt;0.1–0.5%&lt;/td&gt;
&lt;td&gt;&amp;gt; 0.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spam trap hits&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1–2/week&lt;/td&gt;
&lt;td&gt;3+/week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbox placement&lt;/td&gt;
&lt;td&gt;&amp;gt; 95%&lt;/td&gt;
&lt;td&gt;85–95%&lt;/td&gt;
&lt;td&gt;&amp;lt; 85%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Set up &lt;a href="https://postmaster.google.com" rel="noopener noreferrer"&gt;Gmail Postmaster Tools&lt;/a&gt; and &lt;a href="https://sendersupport.olc.protection.outlook.com/snds/" rel="noopener noreferrer"&gt;Microsoft SNDS&lt;/a&gt; alerts for reputation drops.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Breaks Warmup (And How to Recover)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem: Bounce Spike
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Sending to invalid addresses — likely a dirty list&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Pause sends immediately. Scrub your list against email verification API. Resume at 50% of previous volume.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem: Complaint Spike
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Recipients don't remember opting in, or subject lines are misleading&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Review your subject lines. Re-engage dormant subscribers with a confirmation email before resuming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem: Blacklisted by Spamhaus
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Sending to spam traps or very high bounce rates&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Remove hard bounces immediately. Submit delist request at &lt;a href="https://spamhaus.org/lookup/" rel="noopener noreferrer"&gt;spamhaus.org&lt;/a&gt;. Wait 24–48h before resuming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem: Gmail Promotions Tab
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Normal for marketing email; not a deliverability problem&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Gmail's Promotions tab is not a blacklist. Focus on open rates and click rates regardless of tab placement.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;IP warmup is not optional — it's the foundation of your sender reputation. A proper 8-week warmup gives you inbox placement that lasts years. Rush it and you'll spend months recovering from blacklists and ISP throttling.&lt;/p&gt;

&lt;p&gt;The investment is in the setup: proper traffic shaping, monitoring dashboards, and a clear rollback plan. With KumoMTA's Lua scripting or PowerMTA's IP pools, warmup can be automated and hands-off after the initial configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Need help designing your IP warmup strategy?&lt;/strong&gt; PostMTA's deliverability engineers have warmed hundreds of IP ranges across Gmail, Outlook, Yahoo, and regional ISPs. We'll build your warmup playbook, configure your MTA, and monitor your first 90 days until you're hitting full volume with 98%+ inbox rates.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://postmta.com/contact" rel="noopener noreferrer"&gt;Talk to a deliverability specialist →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to improve your email deliverability?&lt;/strong&gt; &lt;a href="https://postmta.com" rel="noopener noreferrer"&gt;postmta.com&lt;/a&gt; provides enterprise email infrastructure consulting, MTA setup, IP warmup, and deliverability optimization for high-volume senders.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>kumomta-vs-powermta.md</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:02:41 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/kumomta-vs-powermtamd-3cag</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/kumomta-vs-powermtamd-3cag</guid>
      <description>&lt;h2&gt;
  
  
  What Is KumoMTA?
&lt;/h2&gt;

&lt;p&gt;KumoMTA is an open-source, Rust-based Mail Transfer Agent developed by Flying Circus / Prozesshell. Built from the ground up for modern cloud-native infrastructure, KumoMTA handles over &lt;strong&gt;10 billion emails per month&lt;/strong&gt; for enterprises worldwide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apache 2.0 open source license — no per-server fees&lt;/li&gt;
&lt;li&gt;Rust-powered for memory safety and raw performance&lt;/li&gt;
&lt;li&gt;AI-powered deployment assistant for automated optimization&lt;/li&gt;
&lt;li&gt;Lua scripting for dynamic, flexible configuration&lt;/li&gt;
&lt;li&gt;Built-in Prometheus metrics and Grafana dashboard support&lt;/li&gt;
&lt;li&gt;Multi-tenant architecture with traffic shaping per tenant&lt;/li&gt;
&lt;li&gt;Designed for containerized (Docker/Kubernetes) and bare-metal deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KumoMTA represents a greenfield approach: instead of patching legacy Sendmail/postfix architecture, it was designed from scratch for the modern internet — handling TLS 1.3, IPv6 natively, and scale-out clustering without legacy baggage.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is PowerMTA?
&lt;/h2&gt;

&lt;p&gt;PowerMTA is a commercial MTA from &lt;strong&gt;Port25 (now part of Spin子)&lt;/strong&gt; with a 15+ year track record in enterprise email delivery. It runs on Linux and is trusted by ESPs, financial institutions, and high-volume senders globally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commercial proprietary license — annual subscription per server&lt;/li&gt;
&lt;li&gt;C++ core for proven performance and stability&lt;/li&gt;
&lt;li&gt;Native configuration via flat-text config files (PMTA-specific syntax)&lt;/li&gt;
&lt;li&gt;Multi-tenant with per-domain and per-IP traffic policies&lt;/li&gt;
&lt;li&gt;Advanced bounce handling and loop detection&lt;/li&gt;
&lt;li&gt;DKIM signing, SPF, and DMARC support built in&lt;/li&gt;
&lt;li&gt;Virtual MTA (vMTA) architecture for multi-campaign handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PowerMTA's strength is its battle-tested reliability. It's been audited, optimized, and refined over years of production use at massive scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Differences
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;KumoMTA&lt;/th&gt;
&lt;th&gt;PowerMTA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;License&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apache 2.0 (open source)&lt;/td&gt;
&lt;td&gt;Commercial (annual subscription)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rust (memory safe, fast)&lt;/td&gt;
&lt;td&gt;C++ (proven, mature)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lua scripting + YAML&lt;/td&gt;
&lt;td&gt;Native PMTA config syntax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes — AI deployment optimizer&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prometheus + Grafana (native)&lt;/td&gt;
&lt;td&gt;Built-in web admin, SNMP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Traffic Shaping&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-tenant, granular&lt;/td&gt;
&lt;td&gt;Per-IP, per-domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clustering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native scale-out&lt;/td&gt;
&lt;td&gt;Multi-server via shared config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Startup Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prozesshell/Flying Circus&lt;/td&gt;
&lt;td&gt;Port25/Spinute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Min. Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (self-hosted)&lt;/td&gt;
&lt;td&gt;~$2,000/server/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max Volume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10B+/month&lt;/td&gt;
&lt;td&gt;10B+/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Licensing Cost
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;KumoMTA&lt;/strong&gt; eliminates the license fee entirely. Your costs are infrastructure + support if needed. For a company sending 100M emails/month, this saves $24,000–$60,000/year in licensing alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PowerMTA&lt;/strong&gt; charges per server annually. For high-volume senders, this adds up — but includes official support and validated stability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;p&gt;KumoMTA's Rust foundation means it handles connection concurrency far more efficiently than traditional thread-per-connection models. Under load, KumoMTA typically uses 40–60% less memory than comparable PowerMTA configurations.&lt;/p&gt;

&lt;p&gt;PowerMTA's configuration model, while older, is extremely well-documented by the community. Every edge case has been solved and written about.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Deployment
&lt;/h3&gt;

&lt;p&gt;KumoMTA's AI assistant analyzes your sending patterns, domain reputation, and ISP feedback to automatically tune delivery parameters. This is a genuine differentiator — especially for teams without dedicated email delivery engineers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Companies Are Switching to KumoMTA
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cost elimination&lt;/strong&gt; — No per-server licensing fee; reallocate that budget to infrastructure or engineering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern stack&lt;/strong&gt; — Docker and Kubernetes native; fits into GitOps workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI optimization&lt;/strong&gt; — Automatic tuning without hiring a specialist&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rust performance&lt;/strong&gt; — Better handling of connection storms without memory exhaustion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open source transparency&lt;/strong&gt; — Audit the code; no hidden behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-tenant design&lt;/strong&gt; — Native support for running multiple clients/tenants cleanly&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Who Should Use Each
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose KumoMTA if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to eliminate licensing costs&lt;/li&gt;
&lt;li&gt;Your team runs modern cloud infrastructure (Kubernetes, Terraform)&lt;/li&gt;
&lt;li&gt;You need AI-assisted optimization&lt;/li&gt;
&lt;li&gt;You're a startup or growth-stage company scaling email volume rapidly&lt;/li&gt;
&lt;li&gt;You want Lua scripting flexibility for custom logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choose PowerMTA if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need a vendor-backed SLA with guaranteed support response times&lt;/li&gt;
&lt;li&gt;Your team has years of PMTA configuration expertise&lt;/li&gt;
&lt;li&gt;Your compliance framework requires a vendor-supported commercial tool&lt;/li&gt;
&lt;li&gt;You're running legacy infrastructure that would require a full migration to change&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Both KumoMTA and PowerMTA are production-grade MTAs capable of handling enterprise email volumes. The choice comes down to your budget, infrastructure philosophy, and team skills.&lt;/p&gt;

&lt;p&gt;If you want &lt;strong&gt;open source freedom, AI optimization, and modern cloud-native deployment&lt;/strong&gt;, KumoMTA wins. If you need &lt;strong&gt;commercial support guarantees and a decade of battle-tested config patterns&lt;/strong&gt;, PowerMTA is the safer bet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not sure which is right for your infrastructure?&lt;/strong&gt; PostMTA provides free technical consultation for email delivery architecture. We help you evaluate, migrate, and optimize your MTA setup — whether you choose KumoMTA, PowerMTA, or both.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://postmta.com/contact" rel="noopener noreferrer"&gt;Schedule a free 30-minute consultation →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to improve your email deliverability?&lt;/strong&gt; &lt;a href="https://postmta.com" rel="noopener noreferrer"&gt;postmta.com&lt;/a&gt; provides enterprise email infrastructure consulting, MTA setup, IP warmup, and deliverability optimization for high-volume senders.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
    <item>
      <title>Pull the official KumoMTA image</title>
      <dc:creator>Dhiraj Chatpar</dc:creator>
      <pubDate>Mon, 18 May 2026 17:02:16 +0000</pubDate>
      <link>https://dev.to/dhiraj_chatpar_e54b46b388/pull-the-official-kumomta-image-3mjg</link>
      <guid>https://dev.to/dhiraj_chatpar_e54b46b388/pull-the-official-kumomta-image-3mjg</guid>
      <description>&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before installing KumoMTA, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linux server&lt;/strong&gt; (Ubuntu 22.04+ or RHEL 9+ recommended)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; (for containerized deployment) or &lt;strong&gt;kubectl&lt;/strong&gt; (for Kubernetes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain names&lt;/strong&gt; with DNS access for MX, SPF, DKIM, and DMARC records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dedicated IP addresses&lt;/strong&gt; (at least 2 for warmup rotation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL or SQLite&lt;/strong&gt; for delivery tracking (optional but recommended)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus + Grafana&lt;/strong&gt; for metrics (optional but strongly recommended)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Root or sudo access&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Installation Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Docker (Recommended for Most Teams)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pull the official KumoMTA image&lt;/span&gt;
docker pull ghcr.io/prozesshell/kumomta:latest

&lt;span class="c"&gt;# Create configuration directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/kumomta/&lt;span class="o"&gt;{&lt;/span&gt;config,data,log&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Start KumoMTA with basic configuration&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; kumomta &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 25:25 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 587:587 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 465:465 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /opt/kumomta/config:/etc/kumomta &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /opt/kumomta/data:/var/lib/kumomta &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /opt/kumomta/log:/var/log/kumomta &lt;span class="se"&gt;\&lt;/span&gt;
  ghcr.io/prozesshell/kumomta:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option 2: Kubernetes with Helm
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add the KumoMTA Helm repository&lt;/span&gt;
helm repo add kumomta https://charts.kumomta.com
helm repo update

&lt;span class="c"&gt;# Install with custom values&lt;/span&gt;
helm &lt;span class="nb"&gt;install &lt;/span&gt;kumomta kumomta/kumomta &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;replicaCount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; config.mail.tls.enabled&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; resources.requests.cpu&lt;span class="o"&gt;=&lt;/span&gt;500m &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; resources.requests.memory&lt;span class="o"&gt;=&lt;/span&gt;1Gi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Basic Configuration
&lt;/h2&gt;

&lt;p&gt;KumoMTA's main configuration file lives at &lt;code&gt;/etc/kumomta/kumomta.conf&lt;/code&gt;. Here's a production-ready baseline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- KumoMTA Configuration&lt;/span&gt;
&lt;span class="n"&gt;kumo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_server&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;-- SMTP Listener&lt;/span&gt;
&lt;span class="n"&gt;kumo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;define_smtp_listener&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'[::]:25'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;relay_hosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;-- Allow authenticated relays&lt;/span&gt;
  &lt;span class="n"&gt;submission&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- DKIM Signing&lt;/span&gt;
&lt;span class="n"&gt;kumo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;define_dkim_signer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'yourdomain.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;selector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'mail'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;key_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/etc/kumomta/keys/dkim.pem'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'From'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'To'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Subject'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- Traffic Shaping (per tenant)&lt;/span&gt;
&lt;span class="n"&gt;kumo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;define_traffic_shaper&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;max_message_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;-- per second&lt;/span&gt;
  &lt;span class="n"&gt;max_connection_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;max_outbound_connections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- Prometheus Metrics&lt;/span&gt;
&lt;span class="n"&gt;kumo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;define_source&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prometheus'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prometheus'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'[::]:8000'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- Logging&lt;/span&gt;
&lt;span class="n"&gt;kumo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;define_log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/var/log/kumomta/smtp.log'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'info'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After saving, validate and reload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kumomta config validate /etc/kumomta/kumomta.conf
kumomta reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  DKIM and DMARC Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Generate DKIM Keys
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate a 2048-bit DKIM key pair&lt;/span&gt;
openssl genrsa &lt;span class="nt"&gt;-out&lt;/span&gt; /etc/kumomta/keys/dkim.pem 2048
openssl rsa &lt;span class="nt"&gt;-in&lt;/span&gt; /etc/kumomta/keys/dkim.pem &lt;span class="nt"&gt;-pubout&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/kumomta/keys/dkim.pub
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 /etc/kumomta/keys/dkim.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DNS Records
&lt;/h3&gt;

&lt;p&gt;Add these records in your DNS provider:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DKIM Record&lt;/strong&gt; (TXT record at &lt;code&gt;mail._domainkey.yourdomain.com&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DKIM1; k=rsa; p=YOUR_PUBLIC_KEY_HERE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SPF Record&lt;/strong&gt; (TXT at your domain root):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=SPF1 include:_spf.yourdomain.com ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DMARC Record&lt;/strong&gt; (TXT at &lt;code&gt;_dmarc.yourdomain.com&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com; pct=100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  IP Warmup Strategy
&lt;/h2&gt;

&lt;p&gt;Never send high volume from a cold IP. Use this rotation schedule:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Daily Volume Cap&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1,000 emails/day&lt;/td&gt;
&lt;td&gt;Warmup phase — monitor bounces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;10,000 emails/day&lt;/td&gt;
&lt;td&gt;Watch complaint rates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;50,000 emails/day&lt;/td&gt;
&lt;td&gt;Check inbox placement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;200,000 emails/day&lt;/td&gt;
&lt;td&gt;Observe reputation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5+&lt;/td&gt;
&lt;td&gt;Scale as reputation builds&lt;/td&gt;
&lt;td&gt;Add second IP, repeat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;KumoMTA's multi-tenant traffic shaping makes rotating warmup easy — assign each tenant a specific IP pool and let the shaping policies enforce the warmup schedule.&lt;/p&gt;




&lt;h2&gt;
  
  
  Monitoring with Prometheus and Grafana
&lt;/h2&gt;

&lt;p&gt;KumoMTA exposes metrics at &lt;code&gt;http://yourserver:8000/metrics&lt;/code&gt;. Add this to your Prometheus config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;kumomta'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;your-kumomta-host:8000'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key metrics to watch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;kumomta_smtp_messages_total&lt;/code&gt; — total messages processed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kumomta_smtp_delivery_latency_seconds&lt;/code&gt; — delivery latency histogram&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kumomta_smtp_bounce_rate&lt;/code&gt; — bounce percentage by type&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kumomta_tls_connections_total&lt;/code&gt; — TLS vs plaintext ratio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Import the official KumoMTA Grafana dashboard (ID: &lt;code&gt;19876&lt;/code&gt;) for instant visibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Pitfalls
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Skipping IP warmup&lt;/strong&gt; — Cold IPs get blacklisted fast. Follow the rotation schedule strictly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing DKIM keys&lt;/strong&gt; — Without DKIM, Gmail and Outlook will junk your mail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No DMARC monitoring&lt;/strong&gt; — You won't know you're failing authentication until inbox placement drops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insufficient connection limits&lt;/strong&gt; — KumoMTA's default limits are conservative; tune them for your volume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignoring bounce codes&lt;/strong&gt; — Hard bounces damage reputation; process them within hours, not days.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;KumoMTA's modern architecture, Lua configuration flexibility, and AI-assisted deployment make it a powerful choice for high-volume senders ready to leave legacy MTA solutions behind.&lt;/p&gt;

&lt;p&gt;Getting it right the first time matters — misconfigured DKIM, inadequate warmup, or missing monitoring will cost you inbox placement that takes months to rebuild.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Need a production-ready KumoMTA deployment without the guesswork?&lt;/strong&gt; PostMTA's engineering team specializes in KumoMTA setup, IP warmup, and deliverability optimization. We'll have you sending at full volume within weeks, not months.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://postmta.com/contact" rel="noopener noreferrer"&gt;Get a free KumoMTA setup consultation →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to improve your email deliverability?&lt;/strong&gt; &lt;a href="https://postmta.com" rel="noopener noreferrer"&gt;postmta.com&lt;/a&gt; provides enterprise email infrastructure consulting, MTA setup, IP warmup, and deliverability optimization for high-volume senders.&lt;/p&gt;

</description>
      <category>email</category>
      <category>smtp</category>
      <category>mta</category>
    </item>
  </channel>
</rss>
