<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Postfix Operations Guides on Netdata</title><link>https://www.netdata.cloud/guides/postfix/</link><description>Recent content in Postfix Operations Guides on Netdata</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://www.netdata.cloud/guides/postfix/index.xml" rel="self" type="application/rss+xml"/><item><title>How Postfix actually works in production: a mental model for operators</title><link>https://www.netdata.cloud/guides/postfix/postfix-how-it-works-in-production/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-how-it-works-in-production/</guid><description>&lt;p>Postfix is not a monolith. It is a collection of small, specialized programs that a supervisor process spawns on demand, coordinated by a single-threaded queue manager, with all durable state living as files on disk. Every operational failure in Postfix, from queue gridlock to inode exhaustion to silent DNS degradation, traces back to how these pieces interact.&lt;/p>
&lt;p>The specific symptom matters less than the architecture underneath it. The same model that explains why one slow destination stalls all outbound mail also explains why a burst of inbound traffic degrades delivery performance, and why a restart on a large queue looks like recovery before it looks like failure again.&lt;/p></description></item><item><title>Postfix active queue saturation: hitting qmgr_message_active_limit</title><link>https://www.netdata.cloud/guides/postfix/postfix-active-queue-saturation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-active-queue-saturation/</guid><description>&lt;p>Mail stops flowing. The deferred queue grows. CPU is low, network paths are healthy, and DNS resolves fine. You run &lt;code>postqueue -p&lt;/code> and see tens of thousands of messages in the active queue. The queue manager has hit &lt;code>qmgr_message_active_limit&lt;/code> and cannot schedule new deliveries.&lt;/p>
&lt;p>This is head-of-line blocking by design. The active queue has a hard ceiling (default 20,000 messages). Once reached, the queue manager stops scanning both the incoming and deferred queues. No new messages enter active delivery until an existing one is delivered or deferred. The system does not degrade gradually; it works, then it stops.&lt;/p></description></item><item><title>Postfix backscatter storm: bounces to forged senders and blocklisting</title><link>https://www.netdata.cloud/guides/postfix/postfix-backscatter-storm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-backscatter-storm/</guid><description>&lt;p>Your mail queue is growing with bounces to envelope senders at domains you have never heard of. Within hours, your IP lands on a DNSBL and legitimate mail stops reaching its destination.&lt;/p>
&lt;p>This is a backscatter storm. Postfix accepted mail for recipients it could not deliver to, then generated non-delivery reports (NDRs) to the forged envelope sender. Those NDRs hit innocent third parties whose addresses the spammer forged.&lt;/p>
&lt;p>The fix: reject unknown recipients at SMTP time instead of accepting and bouncing later. The challenge is identifying which misconfiguration let the mail through, stopping the storm without losing legitimate mail, and repairing your sender reputation.&lt;/p></description></item><item><title>Postfix bounce rate spike: 5xx failures, bad address lists, and reputation risk</title><link>https://www.netdata.cloud/guides/postfix/postfix-bounce-rate-spike/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-bounce-rate-spike/</guid><description>&lt;p>A bounce rate spike is easy to miss. Postfix records a bounce as a completed transaction, so naive delivery metrics stay green while mail permanently fails. The &lt;code>status=bounced&lt;/code> entries pile up in the logs, sender reputation degrades with every message, and sustained high bounce rates trigger blocklist listings at major destinations.&lt;/p>
&lt;p>This guide covers how to identify a bounce rate spike, classify the 5xx failure codes driving it, and stop the bleeding before reputation damage compounds.&lt;/p></description></item><item><title>postfix check warnings: configuration drift and permission problems</title><link>https://www.netdata.cloud/guides/postfix/postfix-check-warnings-config-drift/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-check-warnings-config-drift/</guid><description>&lt;p>&lt;code>postfix check&lt;/code> walks the Postfix file tree, verifies permissions against the &lt;code>postfix-files&lt;/code> manifest, and reports drift. It returns non-zero when it finds problems but does not stop or restart the running master. Safe to run in production at any time, which also makes the warnings easy to ignore.&lt;/p>
&lt;h2 id="what-this-means">What this means&lt;/h2>
&lt;p>The expected filesystem state is defined in &lt;code>postfix-files&lt;/code>, which ships with the package and encodes ownership, group, and permission bits for every file and directory Postfix touches. When reality diverges from the manifest, you get a warning.&lt;/p></description></item><item><title>Postfix Connection refused: blocked port 25 and rejected outbound delivery</title><link>https://www.netdata.cloud/guides/postfix/postfix-connection-refused/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-connection-refused/</guid><description>&lt;p>You see &lt;code>status=deferred (connect to mx.example.com[192.0.2.1]:25: Connection refused)&lt;/code> filling your mail logs. The deferred queue is growing. Postfix cannot establish outbound TCP connections to destination mail servers.&lt;/p>
&lt;p>&amp;ldquo;Connection refused&amp;rdquo; is not the same as &amp;ldquo;Connection timed out.&amp;rdquo; Connection refused means the TCP handshake was actively rejected with a RST packet: the destination IP is reachable, but nothing is listening on that port, or something in the path is rejecting the connection. Connection timed out means the SYN packet was silently dropped: a firewall rule, a network partition, or an ISP dropping egress traffic.&lt;/p></description></item><item><title>Postfix connection storm: dictionary attacks, anvil rate limits, and connection floods</title><link>https://www.netdata.cloud/guides/postfix/postfix-connection-storm-dictionary-attack/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-connection-storm-dictionary-attack/</guid><description>&lt;p>A flood of inbound SMTP connections hits your Postfix server. The smtpd process count climbs, file descriptors tighten, and legitimate mail starts queuing behind connection churn. Throughput drops even though the system is busy. The likely cause is a connection storm: a dictionary attack harvesting recipient addresses, a credential-stuffing run against your submission port, or a misbehaving client with a broken connection pool.&lt;/p>
&lt;p>The distinguishing signal is the ratio of connections to messages. A dictionary attack opens many connections, probes for valid recipients, and disconnects without delivering mail. A legitimate flash crowd opens connections that carry real messages. Telling them apart quickly determines whether you throttle, block, or scale.&lt;/p></description></item><item><title>Postfix Connection timed out: delivery deferrals to unreachable destinations</title><link>https://www.netdata.cloud/guides/postfix/postfix-connection-timed-out/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-connection-timed-out/</guid><description>&lt;p>The mail log shows the same deferral line for every message to one or more destinations:&lt;/p>
&lt;pre tabindex="0">&lt;code>status=deferred (connect to mx.example.com[192.0.2.1]:25: Connection timed out)
&lt;/code>&lt;/pre>&lt;p>Postfix sent a TCP SYN to the destination MX on port 25 and received no SYN-ACK within &lt;code>smtp_connect_timeout&lt;/code> (default 30 seconds). Something on the network path silently dropped the SYN. Postfix defers the message and schedules a retry with exponential backoff.&lt;/p>
&lt;p>Distinguish this from two other errors that produce similar queue growth but need different fixes:&lt;/p></description></item><item><title>Postfix content_filter backpressure: incoming queue growth when Amavis or Rspamd slows</title><link>https://www.netdata.cloud/guides/postfix/postfix-content-filter-backpressure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-content-filter-backpressure/</guid><description>&lt;p>When your content filter (Amavis, Rspamd, or a commercial scanner) slows down or stalls, mail accumulates in Postfix&amp;rsquo;s incoming queue while the active queue stays small. This is the reverse of the more familiar queue gridlock pattern where a slow destination fills the active queue, and it confuses operators who expect active to be large whenever mail is stuck.&lt;/p>
&lt;p>The signature is specific: incoming queue growing, active queue flat or small, deferred queue low, and the filter port (commonly 127.0.0.1:10024 for Amavis) refusing connections or timing out. SMTP clients may experience slow DATA-phase responses. Upstream senders start retrying, which amplifies load on a system that is already falling behind.&lt;/p></description></item><item><title>Postfix daemon memory growth: leaking RSS and OOM risk</title><link>https://www.netdata.cloud/guides/postfix/postfix-daemon-memory-growth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-daemon-memory-growth/</guid><description>&lt;p>Postfix daemons are disposable. Each smtpd, smtp, cleanup, or local process handles one session or message, then exits, keeping per-process RSS bounded at roughly 1 to 5 MB. When RSS climbs steadily on a qmgr process or a delivery agent that should have been recycled hours ago, you are looking at either a memory leak or a queue structure grown beyond normal operating size.&lt;/p>
&lt;p>The one daemon that is legitimately long-lived is qmgr(8). It holds active queue entries, per-destination concurrency state, and recipient lists in memory. Its RSS scales with queue depth. But sustained RSS growth on short-lived daemons, or qmgr growth that does not recede after the queue drains, points at a leak heading toward the OOM killer.&lt;/p></description></item><item><title>Postfix deferred queue growing: why mail piles up and how to drain it</title><link>https://www.netdata.cloud/guides/postfix/postfix-deferred-queue-growing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-deferred-queue-growing/</guid><description>&lt;p>Sustained growth in &lt;code>/var/spool/postfix/deferred/&lt;/code> means delivery failures are outpacing retry successes. The queue is accumulating messages faster than the queue manager can drain them.&lt;/p>
&lt;p>The problem compounds in two ways. First, every message that fails retry stays in the deferred queue while fresh mail continues to enter the system. Second, the queue manager uses exponential backoff, so older deferred messages may not be retried for up to &lt;code>maximal_backoff_time&lt;/code> (default 4000s, roughly 66 minutes). Even after you fix the root cause, the queue takes hours to drain because most messages are in their backoff cool-off period.&lt;/p></description></item><item><title>Postfix destination concurrency limit: tuning per-destination delivery</title><link>https://www.netdata.cloud/guides/postfix/postfix-destination-concurrency-limit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-destination-concurrency-limit/</guid><description>&lt;p>Postfix does not open unlimited outbound connections to a single destination. The queue manager (&lt;code>qmgr&lt;/code>) enforces a per-destination concurrency cap controlling how many simultaneous delivery attempts may target the same recipient domain at once. This parameter, &lt;code>smtp_destination_concurrency_limit&lt;/code>, is behind two common operational failures: queue gridlock from one slow destination monopolizing active queue slots, and reputation penalties from hammering a fragile destination that then throttles or blocklists your IP.&lt;/p>
&lt;p>The default works for general-purpose MTAs sending moderate volume to healthy destinations. But with rate-limited providers, corporate servers with strict connection caps, or a backlog that needs draining fast, the default can be either too aggressive or too conservative. Since Postfix 2.5, the concurrency limit is a ceiling that an adaptive feedback algorithm approaches and retreats from based on delivery outcomes, similar to TCP congestion control. Understanding both the limit and the feedback algorithm is necessary before making changes.&lt;/p></description></item><item><title>Postfix DNS resolver failure: when a broken resolver defers mail to everyone</title><link>https://www.netdata.cloud/guides/postfix/postfix-dns-resolver-failure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-dns-resolver-failure/</guid><description>&lt;p>Mail is deferring to every destination. Gmail, Outlook, corporate partners, even your own relayhost. The master process is running, the queue manager is responsive, and the SMTP listener accepts connections. But the deferred queue keeps growing, and the deferral reasons point to DNS: &amp;ldquo;Host or domain name not found&amp;rdquo; or &amp;ldquo;Name service error for name=&amp;hellip; type=MX: Host not found, try again.&amp;rdquo;&lt;/p>
&lt;p>Postfix depends entirely on DNS for MX resolution, A/AAAA address lookups, reverse PTR verification, and DNSBL queries. It has no internal DNS cache. When the resolver breaks, deliveries defer rather than bounce. The deferral reason is often generic enough that operators chase the wrong problem.&lt;/p></description></item><item><title>Postfix double-bounce loop: MAILER-DAEMON mail multiplying in the queue</title><link>https://www.netdata.cloud/guides/postfix/postfix-double-bounce-mailer-daemon-loop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-double-bounce-mailer-daemon-loop/</guid><description>&lt;p>The Postfix queue is growing fast and &lt;code>postqueue -p&lt;/code> output is dominated by messages from &lt;code>MAILER-DAEMON&lt;/code> or &lt;code>double-bounce@&amp;lt;your hostname&amp;gt;&lt;/code>. The count climbs steadily despite no corresponding increase in legitimate mail volume. Queue slots, disk I/O, and inodes are being consumed by bounce generation, and legitimate mail is getting delayed or stuck behind the noise.&lt;/p>
&lt;p>Left unchecked, the loop can exhaust inodes on the queue filesystem (each queued message is a separate file), starve the queue manager of active delivery slots, and delay legitimate mail for hours.&lt;/p></description></item><item><title>Postfix file descriptor limits: raising ulimit and systemd LimitNOFILE</title><link>https://www.netdata.cloud/guides/postfix/postfix-file-descriptor-limits/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-file-descriptor-limits/</guid><description>&lt;p>Postfix logs &lt;code>fatal: socket: Too many open files&lt;/code> or begins silently dropping connections when per-process file descriptor limits are too low. The default soft limit on many distributions is 1024, which is adequate for a development mail server but insufficient for any production MTA handling concurrent SMTP sessions and active queue processing simultaneously.&lt;/p>
&lt;p>The most common operator mistake is editing &lt;code>/etc/security/limits.conf&lt;/code>, restarting Postfix, and finding the limit unchanged. On systemd-managed distributions, services do not read PAM limits. The effective file descriptor limit for a systemd service comes from the unit file&amp;rsquo;s &lt;code>LimitNOFILE&lt;/code> directive, the global &lt;code>DefaultLimitNOFILE&lt;/code> in &lt;code>/etc/systemd/system.conf&lt;/code>, or the kernel&amp;rsquo;s compiled-in default. Editing only one layer leaves the limit silently unchanged.&lt;/p></description></item><item><title>Postfix flushing and clearing the deferred queue: postqueue and postsuper</title><link>https://www.netdata.cloud/guides/postfix/postfix-flush-clear-deferred-queue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-flush-clear-deferred-queue/</guid><description>&lt;p>A deferred queue is growing and you need to act. The difference between using &lt;code>postqueue&lt;/code> and &lt;code>postsuper&lt;/code> well and badly is the difference between controlled recovery and a self-inflicted stampede.&lt;/p>
&lt;p>Postfix holds messages that failed temporary delivery in the deferred queue for retry with exponential backoff. The retry scheduler uses &lt;code>minimal_backoff_time&lt;/code> (default 300s) and &lt;code>maximal_backoff_time&lt;/code> (default 4000s) to space out attempts. When you intervene manually, you are overriding that scheduler. Sometimes that is the right call, like when a relay host has recovered and the mail is now deliverable. Often it is not.&lt;/p></description></item><item><title>Postfix greylisting delays: 450 4.7.1 deferrals and slow first delivery</title><link>https://www.netdata.cloud/guides/postfix/postfix-greylisting-delays/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-greylisting-delays/</guid><description>&lt;p>Mail to Gmail, Yahoo, Hotmail, and other major destinations shows a consistent delay of roughly 300 seconds on first delivery. The mail log shows &lt;code>450 4.7.1&lt;/code> or &lt;code>451 4.7.1&lt;/code> deferrals from the destination MX. The deferred queue climbs slowly but not explosively. On retry, the messages deliver successfully. This is greylisting, not a Postfix fault.&lt;/p>
&lt;p>Greylisting intentionally rejects the first delivery attempt from an unknown sender triplet (client IP, sender address, recipient address) with a 4xx temporary failure. The destination expects legitimate MTAs to retry and spam bots to give up. Postfix handles this correctly by deferring the message and scheduling a retry. The goal is to align retry timing with the destination&amp;rsquo;s greylisting window, and to whitelist trusted senders if you run postgrey for inbound filtering.&lt;/p></description></item><item><title>Postfix HELO command rejected: need fully-qualified hostname</title><link>https://www.netdata.cloud/guides/postfix/postfix-helo-hostname-rejected/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-helo-hostname-rejected/</guid><description>&lt;p>You see lines like this filling your mail log:&lt;/p>
&lt;pre tabindex="0">&lt;code>NOQUEUE: reject: RCPT from unknown[203.0.113.45]: 504 5.5.2 &amp;lt;desktop-abc123&amp;gt;: Helo command rejected: need fully-qualified hostname; from=&amp;lt;user@example.com&amp;gt; to=&amp;lt;recipient@example.org&amp;gt; proto=ESMTP helo=&amp;lt;desktop-abc123&amp;gt;
&lt;/code>&lt;/pre>&lt;p>Postfix is rejecting the connection because the client sent a bare hostname in its HELO or EHLO command instead of a fully-qualified domain name. The restriction responsible is &lt;code>reject_non_fqdn_helo_hostname&lt;/code> in your &lt;code>smtpd_helo_restrictions&lt;/code>.&lt;/p>
&lt;p>Most rejections are legitimate: bots and spam scripts routinely send garbage or bare names in HELO. The problem starts when a legitimate client gets caught &amp;ndash; a desktop mail client sending its machine name, an internal monitoring server using a short hostname, or an application hardcoded with &lt;code>localhost&lt;/code> as its HELO string. All trigger the same 504 rejection.&lt;/p></description></item><item><title>Postfix Host or domain name not found: DNS name service errors deferring mail</title><link>https://www.netdata.cloud/guides/postfix/postfix-host-not-found-name-service-error/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-host-not-found-name-service-error/</guid><description>&lt;p>Mail is piling up in the deferred queue. Postfix logs the same deferral repeatedly:&lt;/p>
&lt;pre tabindex="0">&lt;code>status=deferred (Host or domain name not found. Name service error for name=example.com type=MX: Host not found, try again)
&lt;/code>&lt;/pre>&lt;p>The enhanced status code is 4.4.3 (directory server failure). Postfix will retry, but retries keep producing the same error because the resolver is broken, not the destination.&lt;/p>
&lt;p>The key tell: all destinations are affected equally. If Gmail, Outlook, and a corporate partner all fail with &amp;ldquo;Host not found&amp;rdquo; at the same time, your resolver is the problem. If only one domain fails, that is a real DNS issue at the destination.&lt;/p></description></item><item><title>Postfix inode exhaustion: the queue filesystem blind spot behind No space left on device</title><link>https://www.netdata.cloud/guides/postfix/postfix-inode-exhaustion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-inode-exhaustion/</guid><description>&lt;p>Postfix reports &lt;code>No space left on device&lt;/code> in your logs. You check &lt;code>df -h /var/spool/postfix&lt;/code> and see 50% free space. Mail acceptance is failing and queue operations are erroring. The obvious explanation does not match reality.&lt;/p>
&lt;p>The cause is almost always inode exhaustion on the queue filesystem. Postfix creates one file per queue entry: every incoming message, every deferred retry, every bounce notification. Each file consumes one inode regardless of how few bytes it occupies. A deferred queue with 500,000 tiny messages might use only a couple of GB of block space but exhaust every inode on the partition.&lt;/p></description></item><item><title>Postfix IP blocklisted: deliverability collapse and sender reputation</title><link>https://www.netdata.cloud/guides/postfix/postfix-blocklisted-ip-reputation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-blocklisted-ip-reputation/</guid><description>&lt;p>A blocklist entry is a symptom, not the root cause. Your sending IP appeared on Spamhaus, SpamCop, SORBS, or a provider-internal list because something in your mail stream triggered their detection. Delisting requests fail or the IP is relisted within hours until you identify and stop that activity.&lt;/p>
&lt;p>The first sign is usually deferrals spiking against one provider, bounces climbing, and the deferred queue growing while injection holds steady. Two patterns dominate: sudden listing from a compromised account or spam outbreak flooding garbage through your server, and gradual erosion from chronic issues like bad recipient lists, backscatter, or weak authentication accumulating negative reputation signals over weeks until a threshold is crossed. The diagnostic path differs for each.&lt;/p></description></item><item><title>Postfix mail flow: injection rate outpacing delivery rate</title><link>https://www.netdata.cloud/guides/postfix/postfix-mail-flow-injection-vs-delivery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-mail-flow-injection-vs-delivery/</guid><description>&lt;p>The queue is growing, delivery latency is climbing, and the gap between what Postfix accepts and what it delivers is sustained. This divergence surfaces before queue-depth alerts fire.&lt;/p>
&lt;p>Injection rate and delivery rate should track within about 10% over any 5-minute window. When they diverge consistently, the outbound path is constrained. The constraint might be a single slow destination monopolizing active queue slots, a DNS resolver failure silently deferring all deliveries, a content filter that has stopped responding, or destination-side rate limiting. Each cause has a distinct signature in the logs and queue directories.&lt;/p></description></item><item><title>Postfix mail for domain loops back to myself: MX and myhostname misconfiguration</title><link>https://www.netdata.cloud/guides/postfix/postfix-mail-loops-back-to-myself/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-mail-loops-back-to-myself/</guid><description>&lt;p>The bounce message &amp;ldquo;mail for example.com loops back to myself&amp;rdquo; is a routing error, not a delivery timeout. It appears in logs as &lt;code>status=bounced (mail for example.com loops back to myself)&lt;/code> with DSN 5.4.6. Postfix resolved the destination domain&amp;rsquo;s MX record, found the best-preference MX points at this host, but found no matching entry in &lt;code>mydestination&lt;/code>, &lt;code>virtual_mailbox_domains&lt;/code>, &lt;code>virtual_alias_domains&lt;/code>, or &lt;code>relay_domains&lt;/code>. Instead of looping, Postfix bounces the message.&lt;/p>
&lt;p>This typically surfaces after a DNS or MX change, a relay-host migration, adding a virtual domain without updating delivery maps, or converting a null client to a full internet site. The fix is to align the domain ownership tables with the MX record. Raising retry limits will not help because the routing decision itself is wrong.&lt;/p></description></item><item><title>Postfix maildrop queue growing: pickup daemon and local submission failures</title><link>https://www.netdata.cloud/guides/postfix/postfix-maildrop-queue-growing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-maildrop-queue-growing/</guid><description>&lt;p>Files are accumulating in &lt;code>/var/spool/postfix/maildrop/&lt;/code>. Cron output is not arriving in mailboxes. Monitoring alerts that depend on local mail delivery are silently failing. &lt;code>postqueue -p&lt;/code> shows normal SMTP traffic flowing, but locally submitted messages are stuck in a directory that should be transient.&lt;/p>
&lt;p>The maildrop queue is the only Postfix queue that does not receive mail from the network. It holds messages submitted locally through the &lt;code>sendmail&lt;/code> command or the &lt;code>postdrop&lt;/code> setgid helper. Every cron job that produces output, every monitoring script that sends mail, and every local application that invokes &lt;code>/usr/sbin/sendmail&lt;/code> writes here. The single-threaded pickup daemon drains it within seconds, handing each message to cleanup for header rewriting and content normalization before it enters the incoming queue.&lt;/p></description></item><item><title>Postfix master process not running: the whole MTA is down</title><link>https://www.netdata.cloud/guides/postfix/postfix-master-process-not-running/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-master-process-not-running/</guid><description>&lt;p>When the Postfix master process is not running, the entire MTA is down. No mail is received on port 25. No delivery agents are spawned. The queue manager cannot run. Local submissions via sendmail queue up but go nowhere. Upstream senders either timeout, defer, or bounce.&lt;/p>
&lt;p>Symptoms are uniform regardless of cause: &lt;code>postqueue -p&lt;/code> returns a fatal error, SMTP connections to port 25 are refused, and no &lt;code>master&lt;/code> process appears in the process table. The underlying cause varies: OOM kill, stale lock file from an unclean shutdown, port conflict, configuration error, or PID namespace confusion in a container.&lt;/p></description></item><item><title>Postfix message size exceeds fixed limit: 552 5.3.4 and message_size_limit</title><link>https://www.netdata.cloud/guides/postfix/postfix-message-size-exceeds-limit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-message-size-exceeds-limit/</guid><description>&lt;p>The error &lt;code>552 5.3.4 Message size exceeds fixed limit&lt;/code> appears in Postfix logs when a message, including headers, body, and MIME encoding overhead, exceeds &lt;code>message_size_limit&lt;/code>. This is a hard rejection, not a deferral. The sender receives a bounce, and the message never enters the queue.&lt;/p>
&lt;p>The default &lt;code>message_size_limit&lt;/code> is 10240000 bytes (approximately 10 MB). Base64 encoding inflates binary attachments by roughly 33 percent, so a 7 MB attachment becomes approximately 9.3 MB of encoded data before headers are added. Many operators discover this only when users report that &amp;ldquo;sometimes attachments work, sometimes they don&amp;rsquo;t.&amp;rdquo;&lt;/p></description></item><item><title>Postfix Milter timeouts: smtpd hangs when a milter stops responding</title><link>https://www.netdata.cloud/guides/postfix/postfix-milter-timeouts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-milter-timeouts/</guid><description>&lt;p>When a before-queue milter like OpenDKIM, milter-greylist, or a custom policy daemon stops responding, smtpd processes block during the SMTP transaction. Each connection that hits a milter callback waits for the full timeout duration before Postfix gives up. During that wait, the smtpd process handling that connection is occupied and counts toward the service&amp;rsquo;s maxproc limit.&lt;/p>
&lt;p>The first visible symptom is usually not mail bouncing or deferring. It is mail acceptance slowing down. SMTP clients connect, get a 220 greeting, then stall during the DATA phase. As more smtpd processes accumulate waiting for milter responses, fewer remain available for new connections. Eventually new connections queue in the listen backlog or are refused entirely.&lt;/p></description></item><item><title>Postfix monitoring checklist: the signals every production mail server needs</title><link>https://www.netdata.cloud/guides/postfix/postfix-monitoring-checklist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-monitoring-checklist/</guid><description>&lt;p>A production Postfix server fails in ways that look healthy until they suddenly do not. Deferred queues fill with retrying messages while disk space appears fine. Inodes exhaust on a filesystem that &lt;code>df&lt;/code> reports at 50% free. A single slow destination silently monopolizes the active queue, starving all other mail. Outbound TLS certificates expire on connections nobody monitors, and deliveries start deferring with cryptic SSL errors.&lt;/p>
&lt;p>Four cumulative maturity levels: survival, operational, mature, expert. Walk through each as a gap analysis. Confirm you collect and alert on every signal at each level before moving up.&lt;/p></description></item><item><title>Postfix monitoring maturity model: from survival to expert</title><link>https://www.netdata.cloud/guides/postfix/postfix-monitoring-maturity-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-monitoring-maturity-model/</guid><description>&lt;p>Postfix is a modular, queue-based MTA where mail flow depends on a chain of cooperating daemons, filesystem-backed queues, DNS resolution, and external filters. Monitoring maturity is not about collecting more metrics for their own sake. It is about closing the gap between what you can detect and what actually causes incidents: inode exhaustion hiding behind &amp;ldquo;No space left on device,&amp;rdquo; active queue saturation from one slow destination, silent filter backpressure, or deferred queues that grow for hours before anyone notices.&lt;/p></description></item><item><title>Postfix No space left on device: disk and inode exhaustion halting the queue</title><link>https://www.netdata.cloud/guides/postfix/postfix-no-space-left-on-device/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-no-space-left-on-device/</guid><description>&lt;p>Postfix logs show &lt;code>fatal: ... No space left on device&lt;/code> or &lt;code>warning: not enough free space in mail queue&lt;/code>. You run &lt;code>df -h&lt;/code> and the queue filesystem has free space. Mail acceptance stalls, delivery stops, and the queue grows.&lt;/p>
&lt;p>The most common cause is inode exhaustion. Postfix creates one file per queued message across its queue subdirectories: maildrop, incoming, active, deferred, bounce, defer, hold, and corrupt. A mail storm, a backscatter loop, or months of accumulated deferred messages can exhaust millions of inodes while disk space barely moves. &lt;code>df -h&lt;/code> looks fine. &lt;code>df -i&lt;/code> shows 100%.&lt;/p></description></item><item><title>Postfix not listening on port 25 or 587: connection refused</title><link>https://www.netdata.cloud/guides/postfix/postfix-smtp-port-not-listening/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-smtp-port-not-listening/</guid><description>&lt;p>&amp;ldquo;Connection refused&amp;rdquo; on port 25 or 587 means no process on the host is completing the TCP handshake on that port. This is distinct from a timeout, where something accepts the SYN but never responds. &amp;ldquo;Refused&amp;rdquo; means either no process is listening, or the kernel is actively rejecting the connection.&lt;/p>
&lt;p>The most common real-world causes: the master process is down, Postfix is bound to loopback only, the smtpd process pool is exhausted, or a firewall is intercepting traffic before Postfix sees it. Less common but worth checking: &lt;code>inet_protocols&lt;/code> mismatch on IPv6-disabled hosts, port conflicts with other MTAs, and postscreen handoff failures.&lt;/p></description></item><item><title>Postfix open relay: unauthorized relay through a misconfigured server</title><link>https://www.netdata.cloud/guides/postfix/postfix-open-relay-unauthorized/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-open-relay-unauthorized/</guid><description>&lt;p>A Postfix server that accepts mail from unauthenticated, non-local clients and forwards it to arbitrary external domains is an open relay. Treat any confirmed occurrence as a PAGE-level security incident: automated scanners find open relays within hours, and a single relayed spam batch can trigger blocklist listings that take days to clear.&lt;/p>
&lt;p>The most common causes are configuration changes that widen trust: &lt;code>mynetworks&lt;/code> set too broadly, restrictions evaluated in the wrong order, a SASL backend that accepts empty credentials, or a backup-MX setup without recipient validation.&lt;/p></description></item><item><title>Postfix process limit reached: smtpd 'to limit' warnings and connection delays</title><link>https://www.netdata.cloud/guides/postfix/postfix-process-limit-to-limit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-process-limit-to-limit/</guid><description>&lt;p>The &lt;code>warning: service smtpd: ... to limit&lt;/code> message in your mail log means Postfix has run out of smtpd processes. The master daemon caps concurrent instances of each service at a maxproc value defined in master.cf. For smtpd, that cap defaults to 100, inherited from &lt;code>default_process_limit&lt;/code>. When all 100 smtpd processes are busy, new TCP connections on port 25 either queue in the kernel listen backlog or get refused.&lt;/p>
&lt;p>This is an info-level log entry, which means it is easy to miss in default alerting. The first symptom most teams notice is external: clients reporting slow mail delivery, monitoring showing connection timeouts to port 25, or deferred mail piling up because inbound messages are not being accepted.&lt;/p></description></item><item><title>Postfix queue gridlock: one slow destination stalls all mail</title><link>https://www.netdata.cloud/guides/postfix/postfix-queue-gridlock-slow-destination/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-queue-gridlock-slow-destination/</guid><description>&lt;p>Mail delivery has stopped for everyone, but nothing looks broken. CPU is low. Network throughput is low. The active queue is full, the deferred queue is growing, and none of the usual suspects (DNS failure, content filter backpressure, disk exhaustion) explain it. This is Postfix queue gridlock: a single slow or throttling destination has consumed the active queue, and the queue manager&amp;rsquo;s fair scheduler is letting it starve every other destination.&lt;/p></description></item><item><title>Postfix queue message age: the delivery latency queue depth cannot show</title><link>https://www.netdata.cloud/guides/postfix/postfix-queue-message-age/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-queue-message-age/</guid><description>&lt;p>A queue of 10 messages whose oldest is 3 hours old is worse than 10,000 messages aged 5 seconds. Depth tells you volume. Age tells you latency. They answer different questions, and conflating them leads to missed incidents.&lt;/p>
&lt;p>Postfix exposes no built-in &amp;ldquo;oldest message age&amp;rdquo; metric. The showq daemon reports per-message arrival times to postqueue, but no aggregate age, no percentile, no histogram. Most monitoring setups track queue depth as a count and stop there. A flat depth line looks healthy. But if messages enter and leave the queue at the same rate, depth stays constant even when every message takes 4 hours to deliver instead of 4 seconds.&lt;/p></description></item><item><title>Postfix queue partition disk full: /var/spool/postfix out of space</title><link>https://www.netdata.cloud/guides/postfix/postfix-disk-space-queue-partition/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-disk-space-queue-partition/</guid><description>&lt;p>When the filesystem holding &lt;code>/var/spool/postfix&lt;/code> runs out of bytes, all mail I/O stops. The queue manager cannot write new queue files, cleanup cannot inject messages, and pickup cannot move mail from maildrop into incoming. Postfix may still listen on port 25 and accept TCP connections, but every accepted message eventually fails with &amp;ldquo;No space left on device&amp;rdquo; or is rejected by the SMTP server&amp;rsquo;s free-space check.&lt;/p>
&lt;p>This is a cliff-edge failure with no graceful degradation. The master process may also fail to update its PID file at &lt;code>/var/spool/postfix/pid/master.pid&lt;/code>, leaving stale state that complicates recovery.&lt;/p></description></item><item><title>Postfix rate limited by destination: 421 and 4.7.1 throttling from major providers</title><link>https://www.netdata.cloud/guides/postfix/postfix-rate-limited-by-destination/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-rate-limited-by-destination/</guid><description>&lt;p>When a major email provider starts throttling your Postfix server, the symptom is distinctive: mail to that one provider defers while everything else flows. You see 421 &amp;ldquo;too many connections&amp;rdquo; or 4.7.1 rate-limit responses in your mail logs, the deferred queue fills with messages to that domain, and retries with exponential backoff make the pile worse. Other destinations deliver normally.&lt;/p>
&lt;p>Postfix itself is not malfunctioning. The remote MX is enforcing per-IP or per-domain rate limits, and Postfix&amp;rsquo;s queue manager is correctly deferring and retrying. The problem is that your sending pattern exceeds what the provider will accept, or your IP reputation has degraded to the point where the provider tightens those limits.&lt;/p></description></item><item><title>Postfix Relay access denied: 554 5.7.1 and blocked senders</title><link>https://www.netdata.cloud/guides/postfix/postfix-relay-access-denied/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-relay-access-denied/</guid><description>&lt;p>The mail log shows a pattern like this:&lt;/p>
&lt;pre tabindex="0">&lt;code>NOQUEUE: reject: RCPT from unknown[10.0.2.15]: 554 5.7.1 &amp;lt;user@external.example&amp;gt;: Relay access denied; from=&amp;lt;app@internal.corp&amp;gt; to=&amp;lt;user@external.example&amp;gt; proto=ESMTP helo=&amp;lt;app01.internal.corp&amp;gt;
&lt;/code>&lt;/pre>&lt;p>A client connected to Postfix, sent MAIL FROM and RCPT TO for a recipient on an external domain, and Postfix rejected the message before queuing it. The recipient domain is not one Postfix considers local or a configured relay destination, and the client failed every authorization check. This is Postfix enforcing relay control exactly as designed.&lt;/p></description></item><item><title>Postfix relay recipient map stale or slow: rejected valid recipients and smtpd hangs</title><link>https://www.netdata.cloud/guides/postfix/postfix-relay-recipient-map-stale/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-relay-recipient-map-stale/</guid><description>&lt;p>In a relay or gateway Postfix setup, &lt;code>relay_recipient_maps&lt;/code> validates recipients before mail enters the queue. When this map goes stale or responds slowly, you see one of two failure modes: valid recipients rejected with a 550 response (stale &lt;code>.db&lt;/code> file, no queue entry to investigate), or &lt;code>smtpd&lt;/code> processes hanging during RCPT TO because a network-backed lookup never returns (connection capacity drops, new connections queue or fail).&lt;/p>
&lt;p>The same failure modes and fixes apply to &lt;code>local_recipient_maps&lt;/code>.&lt;/p></description></item><item><title>Postfix SASL authentication failed: brute force on submission and credential errors</title><link>https://www.netdata.cloud/guides/postfix/postfix-sasl-authentication-failed/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-sasl-authentication-failed/</guid><description>&lt;p>Postfix logs &amp;ldquo;SASL LOGIN authentication failed&amp;rdquo; or &amp;ldquo;SASL PLAIN authentication failed&amp;rdquo; when an SMTP client on port 587 (submission) or 465 (smtps) sends an AUTH command that the SASL backend rejects. Postfix does not verify credentials itself. It delegates to a backend via &lt;code>smtpd_sasl_type&lt;/code> (&lt;code>dovecot&lt;/code> or &lt;code>cyrus&lt;/code>), which may in turn proxy to LDAP, Active Directory, PAM, or SQL.&lt;/p>
&lt;p>The critical first distinction: sporadic failures from specific clients indicate misconfigured credentials, a password rotation, or an expired app password. A sustained flood of failures from one or many IPs with varying usernames is a credential brute-force. When all authentication fails for every client simultaneously, the backend is down or unreachable.&lt;/p></description></item><item><title>Postfix TLS certificate expiry: expired certs and handshake failures</title><link>https://www.netdata.cloud/guides/postfix/postfix-tls-certificate-expiry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-tls-certificate-expiry/</guid><description>&lt;p>An expired TLS certificate on a Postfix server breaks mail delivery in two distinct ways, and teams frequently detect only one. The inbound symptom is loud: clients that require STARTTLS fail handshakes, connections drop, and complaints arrive quickly. The outbound symptom is quiet: mail to destinations enforcing mutual TLS or DANE silently defers into the deferred queue, where it sits under Postfix&amp;rsquo;s increasing backoff schedule until someone notices the queue growing.&lt;/p></description></item><item><title>Postfix TLS downgrade: mandatory TLS falling back to plaintext</title><link>https://www.netdata.cloud/guides/postfix/postfix-tls-downgrade-plaintext/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-tls-downgrade-plaintext/</guid><description>&lt;p>When mail to a destination configured for mandatory TLS is delivered in plaintext, that is a security incident, not a delivery problem. Postfix TLS security levels exist to prevent this: at &lt;code>encrypt&lt;/code> and above, the message should be deferred if TLS is unavailable, not silently downgraded. If plaintext delivery is happening where policy forbids it, the policy enforcement chain is broken.&lt;/p>
&lt;p>The default logging makes this symptom nearly invisible. With &lt;code>smtp_tls_loglevel&lt;/code> at its default of &lt;code>0&lt;/code>, no TLS negotiation details are logged for outbound connections. Failed handshakes and silent fallbacks to plaintext produce no log output at all. By the time someone notices, the policy violation may have been ongoing for hours or days.&lt;/p></description></item><item><title>Postfix TLS handshake failures: SSL_accept errors and cipher mismatches</title><link>https://www.netdata.cloud/guides/postfix/postfix-tls-handshake-failures/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-tls-handshake-failures/</guid><description>&lt;p>&lt;code>SSL_accept error&lt;/code> in your mail logs means the TLS handshake on an inbound connection failed mid-negotiation. The remote SMTP client connected, STARTTLS was offered, and the OpenSSL handshake aborted before a session was established. Postfix either rejects the message (mandatory TLS) or silently falls back to plaintext (opportunistic TLS).&lt;/p>
&lt;p>Default Postfix does not log failed opportunistic TLS handshakes. Both &lt;code>smtpd_tls_loglevel&lt;/code> and &lt;code>smtp_tls_loglevel&lt;/code> default to 0. You see successful TLS connections but not the ones that failed and fell back to cleartext. You may be delivering mail in plaintext to destinations you believe require encryption, with the only visible symptom being a deferred queue growing with delivery delays.&lt;/p></description></item><item><title>Postfix too many open files: file descriptor exhaustion and refused connections</title><link>https://www.netdata.cloud/guides/postfix/postfix-too-many-open-files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-too-many-open-files/</guid><description>&lt;p>Postfix logs &amp;ldquo;too many open files&amp;rdquo; or &amp;ldquo;unable to fork.&amp;rdquo; Inbound SMTP connections fail. Queue files cannot be opened or written. The master process is still running, ports are still bound, and the disk has free space and inodes.&lt;/p>
&lt;p>This is file descriptor exhaustion: a Postfix process has reached its per-process soft limit on open file descriptors. Each open socket, queue file, and pipe handle counts toward the limit. On most Linux distributions the default soft limit is 1024, which is inadequate for a production MTA. Under enough concurrent load, a process hits the ceiling and Postfix fails.&lt;/p></description></item><item><title>Postfix User unknown in recipient table: 550 recipient address rejected</title><link>https://www.netdata.cloud/guides/postfix/postfix-user-unknown-recipient-rejected/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/postfix/postfix-user-unknown-recipient-rejected/</guid><description>&lt;p>A sender gets &lt;code>550 5.1.1 &amp;lt;user@domain&amp;gt;: Recipient address rejected: User unknown in local recipient table&lt;/code> (or the virtual mailbox or relay variant). Postfix rejected the recipient at SMTP &lt;code>RCPT TO&lt;/code> time, before queueing, because the address was not found in the map for that address class. This validation is controlled by &lt;code>smtpd_reject_unlisted_recipient&lt;/code> (default: &lt;code>yes&lt;/code>).&lt;/p>
&lt;p>The problem is either that a legitimate recipient is missing from the map, or that the domain is in the wrong address class and Postfix is checking the wrong map. Before changing restrictions or disabling validation, identify which map Postfix consulted, test the lookup with &lt;code>postmap -q&lt;/code>, and reconcile the map against your authoritative directory. The reject string identifies the address class.&lt;/p></description></item></channel></rss>