结果发现,自己做企业邮局可能性不大,因为他们所为的静态IP并不是买个服务器的哪种静态IP。这种IP一般买不到,在电信系统里面是固定的,数来数据,能用的企业邮局也就几个。自己做,只能通过国内邮箱系统接受,到国外是不接受的。。。比如gmail和hotmail。我去万网问,结果他们也弄不下来,说怕被封,看来国家在这方面监管比较严格。如果你和我一样在天真的想着做个自己的企业邮局,好好考虑下吧。如果有了这些条件,可以读下现面的文章,很有用的!
开源的东东,我最烦怕了,因为资料挺少的。好多还是英文。。。以后难免忘掉,还是做个笔记吧!
我选择了hmailserver,因为他足以应服自己网站的应用了。
然后安装上以后,将MX指向mail.cxt8.com,然后将mail.cxt8.com指向我的服务器IP.就做好初步的DNS配置。
然后安装hmailserver,添加域名和smtp协议,简略说过,详细可以阅读网上的文章《hmailserver的完整配置》,人肉搜索,不怕会没掉。
这时dns生效后,你的帐户就能收发邮件了。但厄运才刚刚开始。。。。
gmail、hotmail将会把你发出去的邮件为垃圾邮件,上火了吧!后面还要玩openssl和一些我没玩过的工具。。
下载安装openssl到你本地,然后安装:
1. 第一你的伺服器需要一組非對稱式金鑰: $ openssl genrsa -out yours.key 2048 2048 是金鑰的 bit 長度,yours.key 是金鑰檔案的名稱
2. 第二你用剛剛產生出來的金鑰,去產生一個數位憑證(certificate): $ openssl req -new -x509 -days 3650 -key yours.key -out yours.crt 3650 是此數位憑證的有效期限日數,yours.crt 是數位憑證的檔案名稱
大概會問你一些問題,如下:
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:TW State or Province Name (full name) [Some-State]:Taiwan Locality Name (eg, city) []:Penghu Organization Name (eg, company) [Internet Widgits Pty Ltd]:Error Organizational Unit Name (eg, section) []:error Common Name (eg, YOUR name) []:error.example.org Email Address []:[email protected]
上面斜體字的部份改成你的資料,第一個是國家code,第二個是州或者是省份,第三是地區名,第四是組織公司名,第五是組織單位名稱,第六是網域名稱,第七最後是網站管理者的Email,第六很重要,如果你是認真的產生這個憑證,第六一定要填你的網域名稱,它不是單純只是"Common Name"而已。
yours.key是你的非對稱式金鑰,公開和私密的都在裡面,yours.crt是你的數位憑證,關於非對稱式金鑰和加解密演算法,就不贅述了,如果你不清楚大概也沒關係。
如果你要將公開金鑰匯出的話,可以執行以下指令: $ openssl rsa -in yours.key -out public.key -pubout -outform PEM
public.key就是你的公開金鑰。
http://dirk.liveforchrist.tw/?p=376
這裡設定的目的只有一個,就是讓你寄出去的信比較不容易被當作垃圾信件,Google 有一篇官方文章主題為大量寄件者指南,當中有提到建議寄信伺服器能夠設定這些東西,Yahoo 也有相關的官方文章,因此如果你常常寄信被當作垃圾信,不妨按照這裡的建議協助你做設定。
這裡的前提是你理解並且可以控制你自己網域的 DNS,如果沒有自己的網域或者不知道怎麼設定 DNS,就不需要這些了。
首先我們來設定 SPF。SPF 可不是買防曬乳液的那個 Sun Protection Factor,這裡的 SPF 是指 Sender Policy Framework,一言以蔽之就是防止寄件者被偽造的一種開放協定,如果你認為偽造寄件者很困難的話,你可能想錯了。
到 OpenSPF 官方網站查詢 SPF 的語法,一個範例如下:
v=spf1 mx a:mail.example2.org mx:example3.org ~all
上面這個字串是要放在 DNS 設定裡面的。比如說,你的網域是 example.org,你就必須在 example.org 的 DNS 設定中,加上一個 TXT 紀錄,其內容等於上面那個字串,當有人收到從 example.org 寄的信的時候,例如收到寄件者為 [email protected] 的信的時候,對方就會去查尋 example.org 的 DNS 紀錄,查詢所有 TXT 紀錄中,是否有 SPF 的相關紀錄,如果有,就會被對方來使用驗證這封電子郵件的來源。
假設 example.org 有 DNS 設定如下:
TXT "v=spf1 mx a:mail.example2.org mx:example3.org ~all" A mail.example.org 1.1.1.1 A www.example.org 1.1.1.2 A example.org 1.1.1.2
假設有一使用者 [email protected] 寄了一封信給 [email protected](舉例使用,如有雷同,純屬巧合),[email protected] 的收信主機是 Google 的主機,Google 在收到這封信之後,會去檢查對方的 DNS,也就是 example.org 的 DNS 設定,發現其中有一筆 TXT 指定了 SPF,於是乎 Google 會以這筆 SPF 紀錄來驗證這封電子郵件,驗證的邏輯就是去查 DNS 的紀錄對應 IP 位址,以上面 SPF 的語法來說明: v=spf1 代表版本。 mx 代表所有 example.org 的 DNS 的 MX 紀錄上的主機,它們的 IP 都被認定可為 example.org 寄信。 a:mail.example2.org 代表 mail.example2.org 的 A 紀錄上的 IP 被認定可為 example.org 寄信。 mx:example3.org 代表 example3.org 的 MX 紀錄上的 IP 被認定可為 example.org 寄信。 ~all 代表其他沒有被 SPF 紀錄指定的寄信 IP 都是有問題的,前方的 ~ 符號代表的意思可以這麼看:「保留一個空間讓某些機制去作確認,如果不是上方指定的寄信 IP,也許不一定是有問題的,雖然它們通常是有問題的。」
下方是我這個網域的 SPF 紀錄,給你參考:
v=spf1 mx a:mail.liveforchrist.tw mx:liveforchrist.tw ~all
至於我的其他 DNS 設定,有興趣的自己查看看吧,它們都是公開的資訊。
接著我們來設定 DomainKeys,DomainKeys 是 Yahoo 在使用的,因為 Yahoo 是大宗的郵件主機之一,所以設定這個對寄信給 Yahoo 的收件者有幫助。
在 Ubuntu 上安裝 DomainKeys 套件,執行指令如下: $ sudo apt-get install dk-filter
安裝完之後,我們需要預備非對稱式金鑰,如果你不知道如何產生金鑰,可以參考這篇文章,假設你已經產生出來,並且金鑰放在路徑 /etc/postfix/mail.key,公開金鑰放在 /etc/postfix/public.key。
再來作一些設定檔的更動,編輯檔案 /etc/default/dk-filter,註解所有東西,新增下面三行:
DAEMON_OPTS="-l" DAEMON_OPTS="$DAEMON_OPTS -d example.org -s /etc/postfix/mail.key -S maildk" SOCKET="inet:8892@localhost"
上面第二行的 example.org 換成你自己的網域名,如果你希望寄出來的信件地址是 [email protected],那網域名就是 example.org,後面 -s 後接的字串是你的金鑰位置,然後 -S 後面接的是"Selector",等會設定 DNS 會用到,可以填一個你想要的字串,不要太複雜,這裡的範例填 maildk,等一下就會以這個例子去說明 DNS 的設定。
然後我們要設定 Postfix,寄信出去的 Postfix 會使用 DomainKeys 功能將郵件加上認證資訊,這就是 DomainKeys 的功能,如果不理解的可以參考 Yahoo 的說明,編輯 /etc/postfix/main.cf,加上下面這四行:
milter_default_action = accept milter_protocol = 2 smtpd_milters = inet:localhost:8892 non_smtpd_milters = inet:localhost:8892
設定完重新啟動 postfix 以及 dk-filter,執行命令如下: $ sudo /etc/init.d/dk-filter restart $ sudo /etc/init.d/postfix restart
接著我們要設定 DNS 了,在你的網域上加上兩筆子網域的 TXT 紀錄,一個子網域是 maildk._domainkey,其內容是你的公開金鑰的內容,假設你的公開金鑰路徑是 /etc/postfix/public.key,執行下面命令印出來看看: $ cat /etc/postfix/public.key
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2HH7GQNz5XXcmaPDlA4iUgkx5 sPqLv7glf/468NjtvjxXkdAxHXSFetjvAFrUBue1Y8HfiGfE2R/iTmm9cYL0gidZ VmOVHg+/7fPCbQHZPblHQ4EjdBy2IuI8bV9rQ0j7UubcrP3xcbGdpjseyebRCqZX G5bMYsov8xuJ5zzcLwIDAQAB -----END PUBLIC KEY-----
把中間那個亂碼字串貼成一行,所以 DNS 上的 TXT 紀錄是(記得子網域(subdomain)是 maildk._domainkey,還有公開金鑰內容要改成你自己的):
"k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2HH7GQNz5XXcmaPDlA4iUgkx5sPqLv7glf/468NjtvjxXkdAxHXSFetjvAFrUBue1Y8HfiGfE2R/iTmm9cYL0gidZVmOVHg+/7fPCbQHZPblHQ4EjdBy2IuI8bV9rQ0j7UubcrP3xcbGdpjseyebRCqZXG5bMYsov8xuJ5zzcLwIDAQAB"
只要把 p= 後面的字串改成你自己的公開金鑰內容即可,子網域 maildk._domainkey 前面的 maildk 是剛剛說到的 Selector,所以你剛剛的 Selector 是什麼,這裡就是什麼。
另外一筆 DNS 紀錄是設定子網域 _domainkey 的 TXT 紀錄,其內容如下(記得子網域(subdomain)是 _domainkey):
"t=y; o=~"
設定完,等一段時間 DNS 生效之後,透過 Postfix 去寄信給 Yahoo 的收件者,應該就會看到 DomainKeys 認證的效果了,查看郵件的原始碼可以看到 DomainKeys 的結果是 pass,如下:
Authentication-Results: mta1023.mail.tp2.yahoo.com from=example.org; domainkeys=pass (ok);
刪除線劃掉的是你的網域名稱。
最後,我們來設定 DKIM,設定方式和 DomainKeys 差不多,先安裝 Ubuntu 套件,執行命令如下: $ sudo apt-get install opendkim
安裝完之後,編輯檔案 /etc/opendkim.conf,找到類似下面這三行:
#Domain example.com #KeyFile /etc/mail/dkim.key #Selector 2007
把前面的註解都拿掉,Domain 那一行換成你自己的 Domain,KeyFile 那一行換成你的非對稱式金鑰路徑,例如 /etc/postfix/mail.key,後面的 Selector 類似 DomainKeys 的 Selector 的概念,設定 DNS 會用到,它其實是在 DNS 上你可以彈性設定不同的 Selector 使用不同的金鑰,對不同的子網域作認證,不過這裡如果你剛剛設定過 DomainKeys 了,因為我們的 DomainKeys 的 Selector 範例是 maildk,這裡我們要區隔開來,不可以一樣,所以我們這裡 Selector 就用 mail 這個字串,所以假設網域名是 example.org,修改那三行之後如下:
Domain example.org KeyFile /etc/postfix/mail.key Selector mail
存檔離開。
再來編輯 Postfix 的 main.cf 檔案,讓 Postfix 寄信的時候都會使用 DKIM 將信件認證的資訊加在郵件表頭裡面,編輯 /etc/postfix/main.cf,加上四行如下:
milter_default_action = accept milter_protocol = 2 smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
如果你早先已經設定了 DomainKeys,你可以將 DomainKeys 在 Postfix 的設定和 DKIM 的設定結合,變成下面四行:
milter_default_action = accept milter_protocol = 2 smtpd_milters = inet:localhost:8891,inet:localhost:8892 non_smtpd_milters = inet:localhost:8891,inet:localhost:8892
設定完重新啟動 Postfix,也重新啟動 opendkim,執行命令如下: $ sudo /etc/init.d/opendkim restart $ sudo /etc/init.d/postfix restart
最後我們設定 DNS 紀錄,新增一筆子網域的 TXT 紀錄,子網域是 mail._domainkey,前面的 mail 是上面 DKIM 的 Selector,因為我們這個範例用 mail 字串,所以這裡是 mail,紀錄的內容是你的公開金鑰內容,剛剛 DomainKeys 已經講過如何把公開金鑰傾印出來,所以 DNS 紀錄內容大概長得像如下:
"v=DKIM1; g=*; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2HH7GQNz5XXcmaPDlA4iUgkx5sPqLv7glf/468NjtvjxXkdAxHXSFetjvAFrUBue1Y8HfiGfE2R/iTmm9cYL0gidZVmOVHg+/7fPCbQHZPblHQ4EjdBy2IuI8bV9rQ0j7UubcrP3xcbGdpjseyebRCqZXG5bMYsov8xuJ5zzcLwIDAQAB"
把 p= 後面接的字串換成你自己的公開金鑰,儲存等一段時間,待 DNS 生效之後,透過 Postfix 寄信出去,就會加上 DKIM 的數位簽章了。
對於在 Ubuntu 上安裝 Postfix,有興趣者可以參考這篇文章。