Smtp

為什麼 sendmail 會跳過我的規則集 98?

  • February 15, 2013

我在 x64 Centos 6.3 上使用 sendmail 8.14.4。並按照adamo提供的說明:如何配置sendmail(或其他郵件伺服器)以接受出站郵件,但不發送出去?將所有郵件發送到特定郵箱,如下所示:

LOCAL_RULE_0
R$* < @ $=w . > $*              $#local $: $1 
R$* < @ $* . > $*               $#local $: quicksilver

這可以很好地與 M4 一起編譯,並將 .cf 文件中的規則與另一個似乎預設存在的文件一起存放。

不幸的是 sendmail 不會將郵件發送到指定的郵箱。

如果我跑

sendmail -d21.12 q@q.com 

調試輸出顯示它正在執行 Parse0 但隨後它正在跳過 ParseLocal (98),如下所示:

... 
rewrite: ruleset Parse0           returns: q < @ q . com . >
rewritten as: q < @ q . com . >
-----trying rule: < @ >
----- rule fails
-----trying rule: $*
-----rule matches: $: $> ParseLocal $1
-----skip subr ParseLocal (98)
rewritten as: q < @ q . com . >
-----trying rule: $*
-----rule matches: $: $> Parse1 $1
rewrite: ruleset Parse1             input: q < @ q . com . >
...

一封測試郵件:

echo 'this is a test'| mail -s test_email q@q.com

直接發送到q@q.com

sendmail -bt
0 q@q.com

翻譯為 q@q.com (不翻譯)但奇怪的是

sendmail -bt
3,0 q@q.com

確實翻譯成水銀

所以在這一點上,我最好的猜測是 sendmail 要麼在發送郵件時沒有首先規範化,要麼 sendmail 以某種方式設置為在規則集 0 之後不執行本地規則。

關於為什麼地址沒有被翻譯的任何想法?

好的……我似乎找到了問題……或者至少解決了它。

我在檢查郵件日誌時注意到,在刪除(重新開始)並重新啟動 sendmail 後,郵件日誌沒有重新出現。我讓機器重新啟動只是為了重置所有內容,現在它可以工作了。

每次使用“service sendmail restart”時,我肯定會重新啟動服務,但現在我偶爾會想到它,這表明停止服務失敗。我想該服務可能從未真正正確停止過,因此每次我重新啟動時,它要麼無法啟動,但報告 OK,因為它已經在執行,或者它正在執行第二個實例。這並不能真正解釋為什麼“sendmail -bt”會進行翻譯,除非在調試時,它將配置的單獨副本載入到私有上下文中。

以防萬一其他人發生在這個執行緒中,comp.mail.sendmail 組中的一位同事提出了一種稍微不同的方法,如下所示:

他說,可以使用 SMART_HOST 將所有電子郵件發送到非本地地址。

define(`SMART_HOST',`local:quicksilver')dnl

將重定向到本地帳戶。我檢查了文件,它看起來是解決問題的另一種好方法。

引用自:https://serverfault.com/questions/478958