最近幫公司更換 mail server,因為原本使用 Synology 內建的 mail server 功能,發現彈性小,問題多,公司又不想花錢買 mail server,所以只好自己研究一番,遇到許多雷也一一解決,因次寫這篇心得文來記錄一下,本篇不教怎麼安裝 hmailserver (因為安裝精靈會引導,非常簡單)。
一個好的 mail server 需要那些設定, mail server 並不是安裝起來,測試可收可寄就了事
如果只是安裝起來就開始用,容易遇到:
別人可能會仿造我方寄出的信
寄出去的信容易被歸類為垃圾郵件
收到病毒信沒有有效的防禦管道
收到大量垃圾郵件造成困擾
基本設定篇:
-DNS該做的事
A Record
建立一筆 Mail Server 的 A Record
說明:建立一筆 主機<->IP 對應,後續才能設定 MX Record
e.g. A mail 123.45.67.89
MX Record
說明:收信用,讓要寄送到我的網域的 Mail Server 知道我的 Mail Server IP 位置
設定 MX紀錄 對應 Mail Server 的 A Record
SPF Record
設定 SPF 的 IPv4 位置對應(有些DNS代管的TXT Record 不需要加上雙引號 ")
說明:SPF 作用為宣告我寄出去的信會從哪個 IP 發出 (SMTP協定如果只要寄信不需要設定 MX、A Record,所以沒設這條無法確認寄件者 IP 的合法性)
e.g. "v=spf1 ip4:123.45.67.89 mx -all" (要注意寄出IP位置如果和收信IP不同,不能只設定 mx,要加入 ip4)
PTR Record (IP 反解)
要上 ISP 網站去向提供你 IP 的業者申請 PTR 反解,驗證你發送 SMTP 出去的這個 IP 確實為你的 mail server domain 所用的 IP,減少被對方 mail server 當作垃圾郵件的機率
以中華電信為例,申請反解的位置&反解說明(這個說明已經很清楚就不用加長這篇文章的圖文量了): https://domain.hinet.net/dns_reverse_c/
進階設定篇:
防毒過濾引擎 - 以 Microsoft Security Essentials、Kaspersky、NOD32 為例 (如果之後有機會測試別家防毒會陸續新增,也歡迎網友提供)
1. 安裝防毒軟體,並查詢你的防毒軟體有支援 指令指定掃描 模式(要能夠停用自動刪除檔案功能,最好能停用即時掃描,檢測到病毒的後續處理是 hmailserver,不是防毒軟體)
2. 設定 hmailserver 的外部程式參數和位置、檢測到病毒的回傳值,郵件檔案變數為 %FILE% (每家防毒軟體都不一樣,請參考官方文件)
Kaspersky Endpoint Security 設定方式:
命令列指令:"C:\Program Files (x86)\Kaspersky Lab\Kaspersky Endpoint Security 10 for Windows SP2\avp.com" scan "%FILE%" /i0 /R:C:\mail_scan_log\report.txt
傳回值:102
Kaspersky Free 設定方式:
命令列指令:"C:\Program Files (x86)\Kaspersky Lab\Kaspersky Free 19.0.0\avp.com" scan "%FILE%" /i0 /R:C:\mail_scan_log\report.txt
傳回值:2
Microsoft Security Essentials 設定方式:
命令列指令:"C:\Program Files\Microsoft Security Client\MpCmdRun.exe" -Scan -ScanType 3 -File "%FILE%" -DisableRemediation
傳回值:2
NOD32 設定方式 (參考 https://support.eset.com/kb3417/):
命令列指令:"C:\Program Files\ESET\ESET NOD32 Antivirus\ecls.exe" /mail "%FILE%" /log-file=C:\mail_scan_log\report.txt
傳回值:50
垃圾郵件過濾引擎 - 以 SpamAssassin 為例
1. 從 www.jam-software.com 下載並安裝 SpamAssassin for Windows (這是收費軟體(能夠用服務以背景執行),但如果以視窗模式執行則免費)
2. 安裝好後執行 spamd.exe 開始視窗模式
3. 設定 hmailserver 的垃圾郵件設定把 SpamAssassin 打勾即可
可以按測試來檢查 hmailserver 有沒有正確和 spamd.exe 通訊
安裝 OpenSSL for Windows (以便稍後設定 DKIM 和 加密憑證)
1. 從 slproweb.com 下載並安裝 OpenSSL (選 Light 版即可)
2. 新增 OpenSSL 的 bin 路徑至環境變數內 (e.g. C:\OpenSSL-Win64\bin)
設定 DKIM 簽章
說明:利用非對稱金鑰的特性,由我的 Mail Server 的 private key 編碼的 DKIM Header 如果能被我在DNS宣告的 public key 正確解開,能證明信件確實是從我的 mail server 發出的(SPF只能認證到OSI第四層,DKIM的方式能認證到OSI應用層第七層)
使用 openssl 產生 public key 與 private key
openssl.exe genrsa -out gmail.com.private 1024
openssl.exe rsa -in gmail.com.private -out gmail.com.public -pubout -outform PEM
進入 DNS 新增一筆 TXT Record
主機名稱格式為 "<selector name>._domainkey"
值格式為 "k=rsa;p=<你的公開金鑰>" (<你的檔案名稱>.public 裡面的金鑰)
待 DNS 生效後(使用 nslookup -q=txt <selector name>._domainkey.<你的網域名稱> 查詢),至 hmailserver 設定並啟用 DKIM
設定 DMARC (示範介面為 Hinet DNS 代管,但是 Hinet 的 DNS 代管不支援底線開頭的 TXT Record ,要設定這筆請轉用別家,或自架 DNS Server)
說明:DMARC 作用為 當 SPF 或 DKIM 驗證失敗時,要向哪個單位通知,讓管理者知道誰在仿冒我的郵件網域,設定 DMARC 前置條件為 設定完 SPF + DKIM
其中 p 參數有三種模式, 讓收信方參考的規則:
none : 無規則
quarantine: 隔離,假如信件沒通過 SPF & DKIM 檢查,將信隔離(放到垃圾信匣)
reject: 拒絕,假如信件沒通過 SPF & DKIM 檢查,將信拒絕(直接丟棄或拒連)
e.g. "v=DMARC1; p=reject; rua=mailto:admin@gmail.com"
-建立自我簽署憑證啟用加密傳輸
1. 使用 openssl 建立自我簽署憑證
openssl req -nodes -new -x509 -keyout mailserver.key -out mailserver.cert
2. 匯入憑證至 hmailserver
3. 設定 SMTP、POP3 使用加密憑證(下圖是我的設定,供參考)
都設定完成後,可以寄一封信到 Gmail ,透過檢視原始郵件可以驗證設定是否正確
參考資料:
http://slproweb.com/products/Win32OpenSSL.html
https://answers.microsoft.com/zh-hant/outlook_com/forum/osecurity-oother/%E5%AF%84%E4%BF%A1%E6%96%B9%E8%88%87%E6%94%B6/19e32c5d-9599-49da-b91b-768ff270d568
https://technet.microsoft.com/zh-tw/library/jj937231(v=exchg.150).aspx
http://jackli.logdown.com/posts/665785/hmailserver-added-dkim-records
https://support.google.com/a/answer/2466563?hl=zh-Hant
https://www.raidenmaild.com/tw/kb/how-to-setup-dmarc.html
SPF 測試工具:
http://ithelp.ithome.com.tw/articles/10023169
http://www.kitterman.com/spf/validate.html

雖然文章一段時間,最近公司也想要換掉Linux Base的Mail Server,好奇想問:您設定spamassassin來做垃圾郵件防禦,但要如何看出哪些郵件被阻擋呢?有時候總會有被誤判郵件的時候...
您如果擔心直接被阻擋,可以僅打開標記功能,或可以設定哪個範圍的分數僅標記,幾分以上才直接阻擋,然後觀察一陣子再逐漸調整你認為最佳的設定
謝謝你這麼快速的回覆,我的意思是說郵件使用者能知道他那些郵件被阻擋嗎?
以 hmailserver 來說,你說的阻擋應該是指你有設定當分數超過指定門檻後直接刪除,這樣使用者是不會收到通知的,如果只是標記,使用者還是會收到信,只是在標題上面會加上垃圾郵件的識別,如果使 linux base 的 mail server 應該可以更彈性的設定。
這樣了解了,謝謝你的幫忙!受益無窮
請問一下 若寄不出去信 如下錯誤 應該要怎麼解決 Remote server (61.20.35.24) issued an error. hMailServer sent: DATA Remote server replied: 552 Sorry, your host is blocked by spam detection system.
看起來是對方的 mail server 把你的 mail server public ip 列為垃圾郵件的黑名單,這個要換IP才能解喔(不過建議先查為甚麼你的IP會被列入黑名單,是不是有設定到 Relay 之類的東西,被人利用拿來發廣告信)
想請問你的情境是一般的Windows 嗎,若不是安裝在 Windows Server ,僅是一般的 Windows 10 or 11 是可以架設的嗎
可以 https://www.hmailserver.com/documentation/latest/?page=system_requirements