When your Postfix logs show a successful delivery (status=sent, dsn=2.0.0) but the message never appears in the recipient's inbox - especially with major ISPs like AT&T/Bellsouth - you're facing one of email's most frustrating scenarios. The server accepted the message, but something happened after the handoff.
The log snippet shows a complete SMTP transaction:
status=sent (250 ok ; id=20120227140036M0700qer4ne)
postfix/qmgr[5595]: D53A72713E5: removed
This indicates AT&T's MX server (gateway-f1.isp.att.net) accepted responsibility for delivery. The "250 ok" response means successful reception, not necessarily final delivery.
- Greylisting: AT&T may temporarily reject then requeue messages
- Content filtering: Silent drops of messages flagged as spam
- IP reputation issues: Your server's IP might be on blocklists
- Missing PTR records: Reverse DNS not properly configured
- SPF/DKIM failures: Authentication issues causing silent rejection
First, verify your server's basic configuration:
postconf -n | grep -E 'myhostname|mydomain|smtpd_banner|mynetworks'
Then check your IP's reputation:
dig +short $(hostname -f)
# Then check the IP against:
# https://mxtoolbox.com/blacklists.aspx
# https://www.spamhaus.org/lookup/
Add these to main.cf for enhanced logging:
# Enable detailed delivery status notifications
smtpd_discard_ehlo_keyword_address_maps =
hash:/etc/postfix/discard_ehlo
disable_vrfy_command = yes
smtpd_data_restrictions =
reject_unauth_pipelining
# Improved logging
debug_peer_level = 2
debug_peer_list = att.net,bellsouth.net
Since you can't rely on bounce messages, implement these alternatives:
- Email headers analysis:
Received: from mail.example.com (mail.example.com [192.0.2.1]) by gateway-f1.isp.att.net with ESMTP id x1234 for
; Mon, 27 Feb 2023 09:02:37 +0000 - Third-party verification services:
# Using Telnet to test SMTP directly telnet gateway-f1.isp.att.net 25 EHLO yourdomain.com MAIL FROM:
RCPT TO:
For production environments, consider implementing a Perl/Python script to parse Postfix logs and track delivery statuses:
#!/usr/bin/perl
use strict;
use warnings;
open(my $fh, '<', '/var/log/mail.log') or die $!;
while(<$fh>) {
if(/postfix\/smtp.*(status=sent).*to=<([^>]+)>/) {
my $email = $2;
log_delivery($email, 'sent');
}
elsif(/postfix\/bounce/) {
# Handle bounce messages
}
}
close $fh;
sub log_delivery {
my ($email, $status) = @_;
# Implement your tracking logic here
# Consider writing to a database or monitoring system
}
For AT&T/Bellsouth specifically:
- Register with their postmaster portal (postmaster.att.net)
- Ensure your IP isn't on their internal blocklists
- Follow their bulk sender guidelines if sending >10k messages/day
- Consider using their approved submission port (587 with auth)
When your Postfix logs show successful delivery (status=sent) but messages never reach the recipient's inbox at ISPs like AT&T/Bellsouth, you're dealing with one of the most frustrating email delivery scenarios. The SMTP protocol's "250 OK" response only confirms that the receiving server accepted responsibility for delivery - not that the message actually reached the inbox.
Here's how to systematically approach this issue:
# Check your server's bounce handling configuration
postconf -n | grep -E 'notify_classes|bounce|delay'
# Typical output you should verify:
notify_classes = bounce, delay, resource, software
bounce_service_name = bounce
delay_notice_recipient = postmaster
AT&T and other large ISPs often implement silent filtering. To test this:
# Create a test email with full headers
telnet localhost 25
EHLO yourdomain.com
MAIL FROM: <test@yourdomain.com>
RCPT TO: <your@bellsouth.net>
DATA
Subject: Test email with headers
X-Mailer: Test Suite
Message-ID: <custom123@yourdomain.com>
Date: $(date -R)
This is a test message body.
.
QUIT
Enhance your logging to capture more delivery details:
# In main.cf add:
debug_peer_list = att.net, bellsouth.net
debug_peer_level = 2
# For better tracking:
smtp_destination_concurrency_limit = 1
smtp_destination_rate_delay = 1s
Implement a simple tracking system using Python:
import re
from datetime import datetime
def parse_postfix_log(log_file, recipient_domain):
pattern = r'(?P<date>\w{3} \d{1,2} \d{2}:\d{2}:\d{2}).*?postfix/smtp.*?to=<(?P<recipient>.*?)>.*?relay=(?P<relay>.*?),.*?status=(?P<status>.*?)\)'
results = []
with open(log_file) as f:
for line in f:
if recipient_domain in line and 'status=sent' in line:
match = re.search(pattern, line)
if match:
results.append({
'timestamp': datetime.strptime(match.group('date'), '%b %d %H:%M:%S'),
'recipient': match.group('recipient'),
'relay': match.group('relay'),
'status': match.group('status')
})
return results
Verify your server's reputation and DNS configuration:
# Check your SPF record
dig TXT yourdomain.com
# Verify DKIM signing
openssl s_client -connect yourmailserver:25 -starttls smtp -crlf
# Check blacklists
for bl in dnsbl.spamhaus.org bl.spamcop.net; do
host -t a $(hostname -i | awk -F. '{print $4"."$3"."$2"."$1}'."$bl")
done
When messages disappear, request headers from test recipients to identify:
- X-AT&T-Headers: Special headers AT&T adds during processing
- Received-SPF: Authentication results
- X-Filter-ID: Indicates filtering actions
Implementing these diagnostic steps will help pinpoint where in the delivery chain messages are being dropped, even when SMTP logs show successful transmission.