上一篇說了hmailserver如何設(shè)置反垃圾郵件功能,現(xiàn)在來說說如何讓自己的hmailserver發(fā)出去的郵件不要被別人反垃圾了。
在hmailserver的反垃圾郵件功能中有提到給垃圾評分標準,其中比較主要的四個,SPF、HELO、DNS MX、DKIM簽名,看hmailserver默認的分值,無疑DKIM簽名是最高的,如果校驗DKIM失敗,直接會當作垃圾郵件的。無疑,如果對方的郵件服務(wù)器啟用了這幾個校驗,如果你發(fā)出去的郵件未通過,就會被當作垃圾郵件了,我試了一下,都沒有設(shè)置,發(fā)往gmail的郵件直接發(fā)送失敗,發(fā)往騰訊企業(yè)郵箱的郵件還收到了。
那如何讓這些校驗通過呢?首先你最好得有一個固定IP,這樣才好設(shè)置SPF,需要給你的域名添加一個txt記錄,里面包含你郵件服務(wù)器的IP??梢杂?nslookup來查詢一下qq.com的txt記錄,那就是SPF了,關(guān)于SPF的介紹,可以查看http://baike.baidu.com /view/1372988.htm來了解一下。HELO這是直接在hmailserver的Settings-Protocols-SMTP-Delivery of e-mail中的local host name中填寫。MX記錄解析,這個在域名中添加mx記錄即可,最后就到了DKIM簽名。
DKIM 的全稱是Domain Key Identified Mail,域名密鑰識別郵件,就是郵件服務(wù)器對自己發(fā)的郵件簽名,表示這個郵件是自己發(fā)出去的,如果一個對方郵件服務(wù)器能夠驗證這個簽名,就表明這個郵件可能不是垃圾郵件,因為垃圾郵件一般都會偽造地址發(fā)送的。那豈不是那些垃圾郵件發(fā)送者只要給垃圾郵件也每個簽名也能表示它發(fā)送的不是垃圾郵件?接收郵件服務(wù)器如何能辨別這個簽名真假?那發(fā)送郵件服務(wù)器跟接收郵件服務(wù)之間有個約定,呃,你記好了,我的簽名是如何如何防偽的,這就是基于私鑰與公鑰的簽名。
發(fā)送方基于私鑰給郵件DKIM簽名,接收方根據(jù)發(fā)送方的公鑰來驗證這個DKIM簽名,很明顯,私鑰是給發(fā)送郵件服務(wù)器來使用的,那公鑰如何傳輸呢?不多說了,了解一下就行了,下面是網(wǎng)上的介紹。
一些簽名的具體細節(jié):
1、算法,必須支持rsa-sha256,可選支持rsa-sha1。key size建議1024。
標準化 (Canonicalization). 有的郵件服務(wù)器可能會少量修改文件內(nèi)容,比如換行或者移除一些空格等等。因此DKIM定義了兩種2、標準化方法,simple和relaxed。 simple最簡單,就是一個字節(jié)也不能改,改了就錯。relaxed就是可以少量的修改一些空格等等。郵件頭和內(nèi)容這兩部分的標準化可以選擇不同的方法,表示起來用/隔開,比如simple/relaxed表示頭部用simple方式,內(nèi)容用relaxed方式來標準化。
3、過程,簽名是先對內(nèi)容(body)部分hash,然后把這個body hash放在header里面,再對頭部做簽名。頭部也不是所有字段都簽名的,只有一些常用的字段,或者比較有意義的,會被簽名。像Received和 Return-Path這樣的字段一般不被簽名。而From則必須被簽名。
下面我們來給hmailserver加上DKIM簽名,工欲善其事,必先利其器,咱們得把器準備好,hmailserver這個主角可不能少,當然,用其他的郵件服務(wù)器也可以參考一下。
Openssl,我們要用它來生成私鑰與公鑰,在這里下載openssl的windows版本,根據(jù)需求吧,64位系統(tǒng)就下64位的,我這里下的是Win32 OpenSSL v1.0.0a,安裝這個得先安裝Visual C++ 2008 Redistributables,呃,中文windows就下中文的,英文就下英文的,別搞得裝不上重下,裝好openssl咱就來生成密鑰吧。
詳情可以參考一下這篇文章
http://www.elandsys.com/resources/sendmail/dkim.html
默認openssl安裝在C:\OpenSSL-Win32,按照下面命令生成
cd C:\OpenSSL-Win32\bin
openssl.exe genrsa -out rsa.private 1024 //生成私鑰
openssl.exe rsa -in rsa.private -out rsa.public -pubout -outform PEM //生成公鑰
然后會看到bin目錄下多了兩個文件rsa.private與rsa.public,先把私鑰rsa.private移到hmailserver的安裝目錄去,然后用記事本打開rsa.public,里面有一串base64編碼的字符串,掏出來,然后到域名解析的控制面板去添加一個txt記錄,名稱為hmail._domainkey(hmail這個可自定義,后面的_domainkey是必需的),記錄值為k=rsa; t=y; p=base64,這個p=后面的base64換成rsa.public里面的那串字符串,添加完txt記錄,可以用以下命令來查看一下是否生效了
nslookup
set type=txt
hmail._domainkey.domain.com //domain.com替換為你的域名
如果看到像下面的結(jié)果就表示生效了
非權(quán)威應(yīng)答:
s0907._domainkey.qq.com text =
“k=rsa; t=y; p=MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhAJJepXlnnJe5bFumOeyG8v2W8
LFpudv3kOkV3eMapHGkl1TU6hgVCyNSOJgYgQkvozdZRJ5b9d7FJsrEhHbeR+klTcLYCe1u1HP7HbxdU
fDU34szV/Tc0rE125WENSGXlwIDAQAB”
這里公鑰就設(shè)置完成,然后在hmailserver郵件服務(wù)器中設(shè)置私鑰。
打開到Domains-你的域名-DKIM signing,選上Enabled激活DKIM簽名先,
Private key file就選擇之前移到hmailserver目錄的rsa.private文件,
Selector里填入hmail,這個要跟添加txt記錄時_domainkey前面的值一致。
Header method與Body method都選擇Relaxed,前面說了Simple比較嚴格一些,如果你添加的記錄里面多或少了一個空格,那就通不過了。
Signing algorithm,簽名算法,SHA1肯定是趕不上SHA256安全,不過SHA256加密時占用CPU資源會高一些,根據(jù)你自己的需求選吧。
設(shè)置完成,當然得Save一下,然后發(fā)個郵件給gmail試試,呃,為啥選gmail呢,因為gmail比較好看,比較好看原始郵件,可以在里面查找到 dkim=pass字樣,還有dkim-signature后面的簽名,OK,成功了,DKIM簽名就說到這里,費了一中午時間。
并不是說你做到了這樣你的郵件就不會被判為垃圾郵件了,只是少了許多可能罷了,還有方方面面的原因,比如你的ip在rbl里之類的,不在贅述。
最后還是補充一點關(guān)于SPF記錄的設(shè)置吧,讓你的郵件通過SPF驗證,哪怕你是動態(tài)IP,也一樣過
參考:http://www.linuxfocus.org/ChineseGB/December2004/article354.shtml
SPF 記錄包含在一個 TXT 記錄之中,格式如下:v=spf1 [[pre] type [ext] ] … [mod]
最常見的就是v=spf1 ip4:xxx.xxx.xxx.xxx ~all,還有v=spf1 include:sub.domain.com ~all,實際上一樣的。
參數(shù)描述
v=spf1,SPF 的版本,如果使用 Sender ID 的話,這個字段就應(yīng)該是 v=spf2
ip4:xxx.xxx.xxx.xxx或include:sub.domain.com,include:包含一個給定的域名的測試,include:domain 的形式書寫。
ip4:使用 IPv4 進行驗證,這個可以以 ip4:ipv4 或 ip4:ipv4/cidr 的形式使用。建議使用這個參數(shù),以減少域名服務(wù)器的負荷。
還有幾個可選參數(shù):
ip6:使用 IPv6 進行驗證
a:使用一個域名進行驗證,這將引起對域名服務(wù)器進行一次A記錄查詢,可以按照a:domain, a:domain/cidr a/cidr 的形式來使用。
mx:使用DNS MX記錄進行驗證,MX記錄定義了收信的MTA,這可能和發(fā)信的MTA是不同的,這種情況基于mx的測試將會失敗,可以用mx:domain, mx:domain/cidr或mx/cidr這些形式進行mx驗證。
ptr:使用域名服務(wù)器的PTR記錄進行驗證,這時,SPF使用PTR記錄和反向圖進行查詢。如果返回的主機名位于同一個域名之內(nèi),就驗證通過了,這個參數(shù)的寫法是ptr:domain
exist:驗證域名的存在性,可以寫成exist:domain的形式。
另外可用ext對上面的幾個參數(shù)進行的擴展,如果沒有這個字段,那么僅使用單個記錄進行問詢。
看了上面的幾個應(yīng)該明白了吧,既然我動態(tài)IP沒法用IP地址來驗證,我可以驗證mx、驗證域名是否存在,這樣就可以了,于是老夫發(fā)到gmail的郵件,里面就會顯示已經(jīng)通過了。
信息如下:
Return-Path:
Received: from mail.osmail.cn ([121.35.164.244])
by mx.google.com with SMTP id o2si8011332ybn.89.2010.11.18.23.51.54;
Thu, 18 Nov 2010 23:51:55 -0800 (PST)
Received-SPF: pass (google.com: domain of admin@osmail.cn designates 121.35.164.244 as permitted sender) client-ip=121.35.164.244;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of admin@osmail.cn designates 121.35.164.244 as permitted sender) smtp.mail=admin@osmail.cn; dkim=pass (test mode) header.i=@osmail.cn
dkim-signature: v=1; a=rsa-sha256; d=osmail.cn; s=hmail;
c=relaxed/relaxed; q=dns/txt; h=From:Subject:Date:Message-ID:To:MIME-Version:Content-Type;
bh=KJqaSfBaD5OTEAwPyYjfJB0AduS/gOcD2VRqIXQZ69k=;
b=dMePUGCBJVvJNuATpLIEH8XaL5IeWHufhDYf4nCpWd0MvLt3DtfRCNsuyA413wsGoaSZJ/OXxXU0GdJ
該文章在 2011/8/2 15:41:45 編輯過