藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 系統管理


    

藍森林 http://www.lslnet.com 2006年4月6日 20:18


如何使用ssmtp提交你的port

到處貼,累死了 :)

Contents

* 簡介
* 問題
* 找一個合適的mail agent
* 配置ssmtp
* 使用send-pr
* 參與討論(以Emacs為例)

簡介
本文不是介紹如何新建或是修改一個port的,關於這一部分,請參考 The Porter's Handbook. 本文將主要介紹在當前中國的網絡環境下如何將你所作的改動發給FreeBSD的PR庫.

非常感謝aiwha, delphij, intron, liue等各位在我第一次發PR時的幫助.本文的最新版將放在 http://dryice.3322.org/computer/FreeBSD/Chinese/sendpr.html

問題
因為垃圾郵件太多,FreeBSD的mailing list server對收到的信件做了嚴格的限制:一定要從可以做反向DNS解析的機器發出的信才接收.

所謂反向解析,就是從一個給定的IP,找出對應的域名.我們平時上網用的DNS解析,是從域名到IP,這個是由域名的所有者設定的.而反向DNS解析,是由IP的所有者(通常是ISP)設定的.

我們中很多人用的是動態IP,ISP不可能給我們設反向DNS解析,更不用說很多是內網上網,或是在虛擬機裡裝的FreeBSD了.即使是使用固定IP的網友,也很少有人能讓他的ISP給他設反向解析.這樣,當我們在自己的FreeBSD裡面用send-pr發 PR的時候,過不了多久就會收到退信,像這樣:

450 Client host rejected:
cannot find your hostname, [xxx.xxx.xxx.xxx]

這樣,除非你能在一台有反向解析的FreeBSD機器上有賬號,要不然就只能想辦法騙過FreeBSD的mail server,讓它以為信是從另一台有反向解析的機器上發出的。這就是我們下面要介紹的辦法:使用ssmtp
找一個合適的mail agent
這裡的mail agent是ssmtp的叫法,就是我們要用的帶反向解析的smtp服務器.很可惜,目前我見到的國內的郵件服務商,不論是免費的還是付費的,都是不帶反向解析的.所以大家就只好到國外去找了,方法很簡單:

1. 找一個免費的郵件服務商並找到他的SMTP服務器地址
2. ping這個地址找到IP
3. 到 http://network-tools.com/default.asp?prog=express&Netnic=whois.arin.net 輸入剛才得到的IP,看能不能反查到域名
4. 如果可以,就註冊一個用戶,不能,就重新來 :)

配置ssmtp
ssmtp可以模擬sendmail,把我們在stdin的輸入發送給指定的smtp服務器.它在 ports裡面,/usr/ports/mail/ssmtp,直接make install clean就好了.

安裝完後,需要修改/usr/local/etc/ssmtp/ssmtp.conf文件進行配置:

* mailhub改成你找到的smtp服務器地址
* rewriteDomain和hostname寫郵件商的地址
* FromLineOverride改成YES.注意,這一條非常重要,一定要改成YES!

使用send-pr

好,現在可以來設置使用send-pr了.這一步的關鍵是設置MAIL_AGENT 變量,send-pr會根據就個變量發信.我們需要所它指向ssmtp,我常用的是這樣:

/usr/local/sbin/ssmtp -v -t -au 我的賬號 -ap 我的密碼

可以man ssmtp看參數的具體含意,其中 -au 和 -ap 適用於需要smtp驗證的情況.

好了,現在可以運行send-pr,把``To:''改成自己常用的地址,發一封信試試了. 一開始可以打開ssmtp的``-v''參數,可以看到和smtp服務器的對話,來判斷錯誤出在哪.注意現在很多的smtp服務器都限制只給自己的用戶發信,所以你很可能需要把``From''一欄設成你新申請的mail地址.不過我們可以把reply-to設成自己常用的地址,這樣就不用多檢查一個郵箱了 :)
參與討論(以Emacs為例)
發完了PR並不算完,有時候committer會和我們討論,他想要做一個什麼樣的修改.這時候如果我們還用自己的mail client按照平時的方法回信,信還是會被 FreeBSD的mail server退回來.所以我們要配置自己的mail client也用ssmtp發信.像我用Emacs+Gnus,就是這樣:

(setq message-send-mail-function 'feedmail-send-it)
(add-hook 'message-mail-send-hook
'feedmail-mail-send-hook-splitter)

(setq feedmail-buffer-eating-function
'feedmail-buffer-to-ssmtp)

(setq feedmail-ssmtp-template
"/usr/local/sbin/ssmtp -v -t
-au xxxxx -ap xxxxxxxxxx")

(defun feedmail-buffer-to-ssmtp (prepped errors-to addr-listoid)
"Function which actually calls ssmtp as a subprocess.
Feeds the buffer to it.
derived from feedmail-buffer-to-binmail"
(set-buffer prepped)
(apply
'call-process-region
(append (list (point-min) (point-max)
"/bin/sh" nil errors-to nil "-c"
(format feedmail-ssmtp-template)))))

使用其它mail client的BSDer也應該有辦法,只要把信件的內容做為stdin傳給 ssmtp就可以了.



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com