How to Troubleshoot and Fix Exchange Server 550 5.1.1 “Recipient Rejected” Error in Outlook 2007


2 views

html

When an Exchange Server deployment starts rejecting valid emails with the 550 5.1.1 recipient rejected SMTP error, it's often a configuration nightmare. Here's how I debugged this for a client migrating to Exchange/Outlook:

Start with these PowerShell commands to check recipient filtering:

# Check recipient filtering settings
Get-RecipientFilterConfig | Select-Object Enabled,BlockListEnabled,RecipientValidationEnabled

# Verify the recipient exists
Get-Recipient -Identity "name@client.org" | Select-Object PrimarySmtpAddress,RecipientType

Incorrect transport rules often cause this. Check with:

Get-TransportRule | Where-Object {$_.State -eq "Enabled"} | 
    Select-Object Name,State,Priority,Description

Enable protocol logging and examine the SMTP conversation:

# Enable protocol logging
Set-ReceiveConnector "Default Frontend" -ProtocolLoggingLevel Verbose

# Sample log analysis (search for 550 responses)
Get-Content "C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Logs\ProtocolLog\SmtpReceive\*.log" | 
    Select-String "550 5.1.1"

In my case, these solutions resolved the issue:

  • Disabled Recipient Filter agent temporarily: Disable-TransportAgent "Recipient Filter Agent"
  • Modified the default receive connector permissions
  • Added specific IP ranges to connection filtering exceptions

For deeper inspection, create a test script to analyze SMTP responses:

using System.Net.Mail;
using System.Net;

try {
    var client = new SmtpClient("mail.client.org", 25);
    client.Credentials = new NetworkCredential("test@client.org", "password");
    client.Send("from@yourdomain.com", "name@client.org", "Test", "SMTP Test");
} catch (SmtpException ex) {
    Console.WriteLine($"Status: {ex.StatusCode}");
    Console.WriteLine($"Response: {ex.Message}");
    if (ex.InnerException != null) 
        Console.WriteLine($"Details: {ex.InnerException.Message}");
}

After making changes, always verify with:

Test-Mailflow -TargetEmailAddress "name@client.org" -SenderEmailAddress "test@yourdomain.com"

The 550 5.1.1 recipient rejected error typically indicates a delivery failure when Exchange Server rejects incoming messages. This SMTP status code breaks down as:

5 - Permanent failure
1 - Addressing status
1 - Bad destination mailbox address

Based on the described scenario where headers are missing in bounce messages, potential root causes include:

  • Recipient address validation failing in Exchange transport rules
  • DNS resolution issues between sender/recipient domains
  • Missing or incorrect SPF/DKIM/DMARC records
  • Exchange recipient filtering configuration problems

To properly debug this SMTP rejection, gather these technical details:

# PowerShell command to check Exchange recipient filtering
Get-RecipientFilterConfig | fl

# MX record lookup (replace with actual domain)
nslookup -type=mx client.org

The client's IT team should verify these Exchange settings:

# Check accepted domains
Get-AcceptedDomain

# Verify transport rules
Get-TransportRule | Where {$_.Name -like "*reject*"}

Request the Exchange admin to run message tracking:

# Exchange message tracking command
Get-MessageTrackingLog -Sender "name@client.org" -EventID "FAIL"

For more advanced troubleshooting, capture raw SMTP conversations:

// C# SMTP client with logging
var client = new SmtpClient("mail.client.org") {
    EnableSsl = true,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential("user", "pass")
};
client.SendCompleted += (s, e) => {
    if (e.Error != null) {
        File.WriteAllText("smtp_error.log", 
            $"{DateTime.Now}: {e.Error.Message}\n{e.Error.StackTrace}");
    }
};

Verify network-level connectivity using these methods:

# Test SMTP port connectivity
Test-NetConnection mail.client.org -Port 25

# Alternative using PowerShell
$tcp = New-Object System.Net.Sockets.TcpClient
try {
    $tcp.Connect("mail.client.org", 25)
    $tcp.Connected
} finally {
    $tcp.Dispose()
}

Key DNS records to validate:

# Check SPF record
Resolve-DnsName client.org -Type TXT | 
    Where-Object {$_.Strings -like "*v=spf1*"}

# Verify reverse DNS
Resolve-DnsName -Name [server-ip] -Type PTR

If the issue persists, examine the transport pipeline:

# View transport agents
Get-TransportAgent | Format-Table Name,Enabled,Priority

# Check receive connectors
Get-ReceiveConnector | fl Name,Enabled,RemoteIPRanges

Bypass local Outlook to isolate the issue:

# Python SMTP test script
import smtplib

try:
    with smtplib.SMTP('smtp.yourisp.com', 587) as server:
        server.starttls()
        server.login('your@email.com', 'password')
        server.sendmail(
            'you@yourdomain.com',
            'name@client.org',
            'Subject: SMTP Test\n\nTest message body')
    print("Email sent successfully")
except Exception as e:
    print(f"Error: {str(e)}")