實作郵件虛擬主機(虛擬網域)
使用postfix+vm-pop3d
作者:cschen33.tw@yahoo.com.tw
建立日期:2006/05/31
最後更新:2006/06/01

目的:
讓一台主機可以提供不同的網域郵件服務,也就是我們只需要一台主機可以提供不同的公司的郵件服務

作業系統:
FC4,CentOs
使用軟體:
我們要一併考慮郵件伺服器的兩個協定:
1.SMTP:
目前常用的有sendmail/postfix/qmail
找過網路上有關sendmail的資料實在有限,其網路上有http://www.sendmail.org/tips/virtual-hosting.html(細讀之後,其實只是實作類似別名aliases的作法,將信轉來轉去),而實作的只有linuxcon這個很久的管理程式支援這個功能(其pop3以一個vpop3d實作),但資料太過老舊,不支援FC4等
而postfix完整支援,其網頁上有完整的文件http://www.postfix.org/VIRTUAL_README.html,但是語焉不詳,亦不切題,但是它合乎我的需求
2. pop3:
vm-pop3d(支援多種MTA),雖然程種有點舊,但有較詳細的文件http://www.sonicresolutions.com/tech/howto_postfix_vmpop3d.html
vpopmail(主要支援qmail),由於qmail較少見,因此我選擇vm-pop3d

安裝軟體:
1.postfix
假設你已經安裝postfix(略)
2.vm-pop3d
下載軟體vm-pop3d-1.1.6.tar.gz : http://www.reedmedia.net/software/virtualmail-pop3d/#download
 安裝:
  tar xvfz vm-pop3d-1.1.6
  cd vm-pop3d-1.1.6
  ./configure --prefix=/usr
  make
  make install

為虛擬主機設定一個新的群組及使用者
因為虛擬主機上的使用者不存在,但存放檔案時必須要有權限,因此我們要將收信及送信程式都有權限可以讀寫該檔案或目錄
預設:使用者vmail(uid 200),群組vmail(gid 200),你可以依照自己的環境變更
groupadd  vmail -g 200
adduser vmail -u 200 -g vmail
請將/etc/passwd中的vmail的shell改為/sbin/nologin(為了安全的原因)

假設:虛擬主機為xyz.com.tw,使用者teddy
設定postfix :
/etc/postfix/main.cf
加入: 
virtual_mailbox_domain = xyz.com.tw
#你的虛擬主機的網域,可以多個使用逗點分開
virtual_mailbox_base = /var/spool/virtual #虛擬主機郵件的檔案根目錄(不可以亂改要配合vm-pop3d的預設值)
virtual_mailbox_maps=/etc/postfix/vmailbox #設定使用者郵件的目錄所在,這是一個檔案
virtual_uid_maps=200 #存檔使用的使用者uid
virtual_gid_maps=200 #存檔使用的群組gid

/etc/postfix/vmailbox
加入:
teddy@xyz.com.tw     xyz.com.tw/teddy #設定使用者teddy的郵件目錄=virtual_mailbox_base+xyz.com.tw/teddy
/var/spool/virtual/xyz.com.tw/teddy
#請根據不同的使用者加入,加入之後請執行postmap /etc/postfix/vmailbox
postmap 是將文字檔轉為.db檔

先前我們指定了幾個目錄我們需要手動建立,並指定其權限為vmail.vmail
mkdir /var/spool/virtual
chown vmail.vmail /var/spool/vairtual
mkdir /var/spool/virtual/xyz.com.tw
chown vmail.vmail /var/spool/virtual/xyz.com.tw

設定vm-pop3d:
在/etc/xinetd.d/建立一個檔案vm-pop3d
/etc/xinetd.d/vm-pop3d
其內容如下:
service pop3
    {
        socket_type = stream
        protocol = tcp
        wait = no
        user = root
        instances = 25
        server = /usr/sbin/vm-pop3d
        server_args = -i --user vmail
        log_type = SYSLOG local4 info
        log_on_success = PID HOST EXIT DURATION
        log_on_failure = HOST ATTEMPT
        disable = no
    }
#pop3必須使用密碼來驗證,那密碼在那堣S如何設定呢?
#我們可以看一下vm-pop3d的文件man vm-pop3d ,其最後一段
FILES
     /var/spool/mail     mail files
     /var/spool/virtual  virtual mail directories
     /etc/virtual        virtual passwd files
     /etc/inetd.conf     pop3 server program invocation
     /etc/syslog.conf    logging specifications


其虛擬使用者的密碼所在/etc/virtual/虛擬網域
#而其密碼是使用httpd 的htpasswd 來建立
 建立上述必須目錄
mkdir /etc/virtual
mkdir /etc/virtual/xyz.com.tw
建立xyz.com.tw網域的使用者teddy
htpasswd -c /etc/virtual/xyz.com.tw/passwd teddy

目前都設定好了
1.重新啟動postfix: service postfix reload
2.重新啟動xinetd:servcie xinetd restart

測試:
postfix 收信:
本機寄一封信給teddy@xyz.com.tw
檢查/var/spool/virtual/xyz.com.tw/teddy是否存在
vm-pop3d驗證測試:
[root@abc com.tw]# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
Escape character is '^]'.
+OK POP3 Welcome to vm-pop3d 1.1.6 <30242.1149118462@abc.com.tw>
user teddy@xyz.com.tw
+OK
pass teddy
+OK opened mailbox for teddy

OutLook Express設定
只有帳戶名稱不一樣

因為驗證必須包含domain
由teddy 改為teddy@xyz.com.tw

dns 設定
上述設定完畢後,網路上並不知寄給xyz.com.tw網域的信要寄給本主機
因此我們在xyz.com.tw名稱伺服器上設定
xyz.com.tw. IN MX 10 本機的主機全名.

1.在原虛擬網域新增使用者,例: sam@xyz.com.tw
    vi  /etc/postfix/vmailbox
    加入:
    sam@xyz.com.tw    xyz.com.tw/sam
    postmap /etc/postfix/vmailbox
    htpasswd /etc/virtual/xyz.com.tw/passwd sam
2.新增一個虛擬網域,例:def.com.tw
    在/etc/postfix/main.cf 項目viirtual_mailbox_domain=xyz.com.tw, def.com.tw
    建立目錄/etc/virtual/def.com.tw
    建立目錄/var/spool/virtual/def.com.tw
    chown vmail.vmail /var/spool/virtaul/def.com.tw
 
在fc4上原/etc/passwd中的使用者,需要修改才能正常收信
切換 vm-pop3d的原始目錄中
cp vm-pop3d.pam /etc/pam.d/vm-pop3d
且編譯要加入 --enable-pam
詳情請參考:程式網站中的FAQ的(CVS faq)

ip base的設定
在編譯vm-pop3d中可以加入
  --enable-ip-based-virtual  

所謂 ip base 是指一台機器有多個IP每一個IP對應一個網域