Apache James 郵件服務器部署在 Linux 內網,現象:內網郵件收發正常、外網郵件能收到內網、但內網發往外網(QQ、163 等)均失敗,報錯 550 5.7.1 Requested action not taken: relaying denied。本文深度剖析 Relay Denied 根因,給出 DNS 解析缺失修復全流程。
許多管理員認為:配置 config.xml 設置 <relay>、<authentication>、添加 MX 記錄,就能發外網。實則不然 —— 外網發信成功的前提是目標服務器信任你的服務器身份。
mail.0756.net),且正向解析回同一 IP(FCrDNS)。0756.net 的 SPF 記錄必須授權該 IP 發信(v=spf1 ip4:你的公網IP -all)。題主提到「配置文件按教程設置了、添加了 MX 映射」,但MX 記錄只負責「收信」路由(告訴別人發給誰),不負責「發信」身份驗證。發信時,目標服務器檢查的是發信 IP 的 PTR 記錄,而非你的域名 MX 記錄。
curl ifconfig.me 獲取公網出口 IP(假設為 203.0.113.45)。203.0.113.45 的 PTR 設置為 mail.0756.net。nslookup -type=PTR 203.0.113.45
# 應返回 mail.0756.net
dig -x 203.0.113.45
# ANSWER SECTION: 45.113.0.203.in-addr.arpa. IN PTR mail.0756.net.
nslookup mail.0756.net
# 應返回 203.0.113.45
主機名: @ (或 0756.net)
類型: TXT
值: "v=spf1 ip4:203.0.113.45 -all"
config.xml):
<smtpserver ...>
<helloName>mail.0756.net</helloName>
...
</smtpserver>
swaks 或 telnet 向外網郵箱發測試信,觀察郵件頭 Received-SPF: pass、Authentication-Results: dkim=pass。| 配置項 | 正確示例 | 說明 |
|---|---|---|
<helloName> | mail.0756.net | SMTP EHLO 宣告名,必須與 PTR 一致 |
<relay> | <allow>127.0.0.1</allow> <allow>192.168.1.0/24</allow> | 允許中繼的內網網段,不要開放 0.0.0.0/0 |
<authentication> | <handler class="org.apache.james.smtp.auth.PlainAuthHandler"/> | 啟用 SMTP AUTH,外網客戶端需認證才能發信 |
<outgoing> | <gateway>smtp.0756.net</gateway> 或 直連 | 若有智能網關填寫網關,否則直連需上述 DNS 條件 |
<dnsserver> | <dnsServer>114.114.114.114</dnsServer> | 指定可靠 DNS 解析 MX 記錄 |
opendkim-genkey -d 0756.net -s mail -b 2048mail._domainkey.0756.net IN TXT "v=DKIM1; k=rsa; p=MIIBIjAN..."opendkim 簽名)。mxtoolbox.com/blacklists.aspxhelloName 是否與 PTR 一致?James 內網發不了外網,核心原因是缺失反向 DNS (PTR) 解析,導致外網郵件服務器拒絕中繼。MX 記錄只管收信,發信身份驗證依賴 PTR、SPF、DKIM、DMARC 鏈路。聯繫 ISP 為公網 IP 設置 PTR 記錄是解決「Relaying Denied」的關鍵第一步,配合 SPF 授權、HELO 名稱一致、DKIM 簽名,即可實現穩定外網發信。