簡介
人們在網際網路上最常使用的就是電子郵件,很多企業用戶也經常使用免費電子郵件系統。本文就以step by step的方式引導用戶從sendmail原始碼開始構建一個可以滿足基本工作需要的郵件系統。
概述
sendmail是最重要的郵件傳輸代理程式。理解電子郵件的工作模式是非常重要的。一般情況下,我們把電子郵件程式分解成用戶代理,傳輸代理和投遞代理。用戶代理用來接受用戶的指令,將用戶的信件傳送至信件傳輸代理,如:outlook express、foxmail等。而投遞代理則從信件傳輸代理取得信件傳送至最終用戶的信箱,如:procmail。
當用戶試圖傳送一封電子郵件的時候,他並不能直接將信件傳送到對方的機器上,用戶代理必須試圖去尋找一個信件傳輸代理,把郵件提交給它。信件傳輸代理得到了郵件後,首先將它保存在自身的緩衝佇列中,然後,根據郵件的目標地址,信件傳輸代理程式將找到應該對這個目標地址負責的郵件傳輸代理伺服器, 並且通過網路將郵件傳送給它。對方的伺服器接收到郵件之後,將其緩衝存儲在本地,直到電子郵件的接收者查看自己的電子信箱。
顯然,郵件傳輸是從伺服器到伺服器的,而且每個用戶必須擁有伺服器上存儲信息的空間(稱為信箱)才能接受郵件(傳送郵件不受這個限制)。可以看到,一個郵件傳輸代理的主要工作是監視用戶代理的請求,根據電子郵件的目標地址找出對應的郵件伺服器,將信件在伺服器之間傳輸並且將接收到的郵件緩衝或者 提交給最終投遞程式。有許多的程式可以作為信件傳輸代理,但是sendmail是其中最重要的一個,事實證明它可以支持數千甚至更多的用戶,而且占用的系統資源相當少。不過,sendmail的配置十分複雜,因此,也有人使用另外的一些工具,如qmail、postfix等等。
當sendmail程式得到一封待傳送的郵件的時候,它需要根據目標地址確定將信件投遞給對應的伺服器,這是通過DNS服務實現的。例如一封郵件的目標地址是[email protected],那么sendmail首先確定這個地址是用戶名(ideal)+機器名(linuxaid.com.cn)的格式,然後,通過查詢DNS來確定需要把信件投遞給某個伺服器。
DNS數據中,與電子郵件相關的是MX記錄,例如在linuxaid.com.cn這個域的DNS數據檔案中有如下設定:
IN MX 10 mail
IN MX 20 mail1
mail IN A 202.99.11.120
mail1 IN A 202.99.11.121
顯然,在DNS中說明linuxaid.com.cn有兩個信件交換(MX)伺服器,於是,sendmail試圖將郵件傳送給兩者之一。一般來說,排在前面的的MX伺服器的優先權別比較高,因此服務 器將試圖連線mail.linuxaid.com.cn的25連線埠,試圖將信件報文轉發給它。如果成功,你的smtp伺服器的任務就完成了,在這以後的任務,將由mail.linuxaid.com.cn來完成。在一般的情況下,mail換器會自動把信件內容轉交給目標主機,不過,也存在這樣的情況,目標主機(比如linuxaid.com.cn)可能並不存在,或者不執行smtp服務,而是由其mx交換器來執行信件的管理,這時候,最終的信件將保存在mx機器上,直到用戶來察看它。
如果DNS查詢無法找出對某個地址的MX記錄(通常因為對方沒有信件交換主機),那么sendmail將是試圖直接與來自郵件地址的主機對話並且傳送郵件。例如,[email protected]中沒有對應的MX記錄,因此sendmail在確定MX交換器失敗後,將從DNS取得對方的IP位址並直接和對方對話試圖傳送郵件。
工作環境
假設用戶希望在園區網環境中架設一個電子郵件伺服器,為本單位用戶提供郵件服務。該伺服器擁有一個合法的IP位址202.99.11.200和一個合法的域名mail.linuxaid.com.cn,並且DNS的MX記錄也指向該域名(註:這裡示例域名和IP位址均為偽造域名和地址)。為了滿足域名需求,DNS的域數據檔案應該包含以下內容:
IN MX 10 mail
mail IN A 202.99.11.200
試驗環境為:redhat6.2、sendmail.8.11.4、qpopper4.0.3。
安裝
Sendmail是目前使用最為廣泛的一種E-mail伺服器。當前其最新的穩定版本為8.14.3。下載得到tar.gz格式的壓縮檔以後,將其存放在/usr/src目錄下。我們以8.11.4為例。
解壓軟體包:
[root@email src]# tar xvfz sendmail.8.11.4.tar.gz
[root@email src]# cd sendmail-8.11.4
編譯安裝:
[root@email sendmail-8.11.4]# cd sendmail
[root@email sendmail]# sh Build
生成配置檔案:
[root@email sendmail]#cd /usr/src/sendmail-8.11.4/cf/cf/
一般該目錄下應該有config.mc的檔案,如果沒有則創建新檔案config.mc,內容為:
divert(-1)
dnl This is the macro config file used to generate the /etc/sendmail.cf
dnl file. If you modify thei file you will have to regenerate the
dnl /etc/sendmail.cf by running this macro config through the m4
dnl preprocessor:
dnl m4 /etc/sendmail.mc > /etc/sendmail.cf
dnl You will need to have the Sendmail-cf package installed for this to work.
include(`/usr/src/sendmail-8.11.4/cf')
define(`confDEF_USER_ID',`8:12')
OSTYPE(`linux')
undefine(`UUCP_RELAY')
undefine(`BITNET_RELAY')
define(`confAUTO_REBUILD')
define(`confTO_CONNECT', `1m')
define(`confTRY_NULL_MX_LIST',true)
define(`confDONT_PROBE_INTERFACES',true)
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')
FEATURE(`smrsh',`/usr/sbin/smrsh')
FEATURE(`mailertable',`hash -o /etc/mail/mailertable')
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable')
FEATURE(redirect)
FEATURE(always_add_domain)
FEATURE(use_cw_file)
FEATURE(local_procmail)
MAILER(smtp)
MAILER(procmail)
FEATURE(`access_db')
FEATURE(`blacklist_recipients')
dnl We strongly recommend to comment this one out if you want to protect
dnl yourself from spam. However, the laptop and users on computers that do
dnl not hav 24x7 DNS do need this.
FEATURE(`accept_unresolvable_domains')
dnl FEATURE(`relay_based_on_MX')
然後運行:
[root@email cf]# sh Build config.cf
該命令將在該目錄下生成config.cf檔案。然後安裝sendmail:
[root@email sendmail]# sh Build install
將config.cf拷貝到/etc/mail目錄下,並改名為sendmail.cf:
[root@email mail]#cp /usr/src/sendmail-8.11.4/cf/cf/config.cf /etc/mail/sendmail.cf
在/etc/mail目錄下創建access檔案,內容如下:
127.0.0.1RELAY
202.99.11 RELAY
這裡表示允許本機和202.99.11.0網段中的機器通過該郵件伺服器的轉發郵件。其中202.99.11應該是你擁有的區域網路IP網段的IP位址,只需要寫網路部分即可。比如說你的用戶有多個網段,只需要在其中設定多個網段即可:
127.0.0.1RELAY
202.99.11 RELAY
200.200.201 RELAY
然後對access檔案生成易於檢索的庫檔案格式:
[root@email mail]# makemap hash access.db < access
創建檔案/etc/mail/local-host-names,其內容為本機的擁有的域名信息,因為在上面的DNS配置檔案中該伺服器有一個域名:email.linuxaid.com.cn,並且MX記錄也指向該域名,因此該伺服器就有兩個域名,一個為email.linuxaid.com.cn及linuxaid.com.cn,這樣用戶才可以使用[email protected].這樣的地址收發郵件,故該檔案應該包含如下內容:
linuxaid.com.cn.
mail.linuxaid.com.cn.
最後還要創建別名資料庫。在/etc/mail/aliases目錄下創建檔案aliases,內容如下:
MAILER-DAEMON: postmaster
postmaster: root
bin: root
daemon: root
nobody: root
然後生成aliases庫:
[root@email mail]# newaliases
然後,就可以啟動Sendmail了:
[root@email mail]# /usr/sbin/sendmail -bd -q20m
在第一次啟動時可能出現如下的錯誤信息:
554 5.0.0 /etc/mail/sendmail.cf: line 41: unknown configuration line ""
554 5.0.0 /etc/mail/sendmail.cf: line 60: unknown configuration line ""
不要緊張,只需要使用vi編輯器將這些行刪除即可,其實41、60等行都是空白行而已。刪除以後再重新啟動就應該沒有問題了。
安裝配置
qpopper是Unix/Linux環境下的pop3伺服器,該軟體配合sendmail使用。其主要是實現支持用戶通過pop3接收信件。
創建從/usr/mail指向/var/spool/mail/的連結:
[root@email src]# ln -s /var/spool/mail/ /usr/mail
解壓qpopper軟體包:
[root@email src]# tar xvfz qpopper4.0.3.tar.gz
[root@email src]# cd qpopper4.0.3
編譯安裝qpopper:
[root@email qpopper4.0.3]# ./configure
[root@email qpopper4.0.3]# make
[root@email qpopper4.0.3]# make install
安裝成功以後,qpopper將會被安裝在目錄/usr/local/sbin/目錄下。設定inetd啟動qpopper。編輯/etc/inetd.conf,查找pop內容的一行,在其前面添加#號,然後在改行後面添加如下內容:
pop-3 stream tcp nowait root /usr/local/sbin/popperqpopper-s
然後查找inetd進程ID號:
[root@email qpopper4.0.3]# ps ax|grep inetd
336 ? S 0:00 inetd
16872 pts/0 S 0:00 grep inetd
找到inetd進程號為226。然後重新啟動inetd進程,重新讀取配置檔案:
[root@www qpopper4.0.3]# kill -HUP 336
這時候查看系統服務連線埠號:
[root@email qpopper4.0.3]# netstat -ln|grep 110
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
則說明110連線埠已經開始正常服務。
安裝測試
實現對IMAP的支持非常簡單,只需要安裝IMAP軟體包的RPM包:
[root@email RPM]# rpm -ivhimap-4.7-5.i386.rpm (這裡是在6.2環境下,如果在7.x環境下需要安裝更高版本的imap)
然後確保/etc/inetd.conf檔案中imap所在行如下所示:
imapstream tcp nowait root /usr/sbin/tcpd imapd
然後重新啟動inetd以更新配置:
[root@email /]# kill -HUP 379 (這裡379是inetd的進程號)
然後查看imap是否成功啟動:
[root@email /]# netstat -ln|grep 143
註:對於6.2版本的imap-4.7來說 支持imap2,所以是143連線埠。RH7.x的imap-2000會支持imap3,因此可能還會監聽220連線埠)
這時候就可以在outlook express中添加賬號進行測試了。
測試
接下來是測試郵件伺服器的郵件傳送/接收功能,注意:測試時,不要在只對本地用戶進行測試,如:你的域為abc.com,測試時,不要只在郵件伺服器上通過mail、elm等程式測試[email protected]用戶。因為,此時user1是本地用戶,所以郵件伺服器可以對其進行Relay。你應該從區域網路上的另一台機器使用Outlook等郵件客戶端對伺服器進行收發測試。
這種配置對於IP固定用戶沒有問題,只需要在access檔案中指定其固定IP即可,而對於需要支持流動用戶,如撥號用戶的套用則不大適合,因為如果完全打開RELAY功能可能導致郵件伺服器的稱為垃圾郵件的轉發站。
解決用戶IP不固定問題有兩種方案,一種為採用SMTP認證,即用戶傳送郵件以前,郵件伺服器進行用戶身份認證,通過則伺服器為其傳送郵件,否則拒絕發信;第二種方案是採用動態轉發授權控制(Dynamic Relay authorization control),其工作原理為:撥號用戶撥接後,首先收郵件,如果用戶能正確收郵件,則DRAC自動在access.db中加入剛才收郵件用戶的IP,並允許此IP可以發信。不過,30分鐘內,此IP不發/收郵件的話,DRAC將從access.db中刪除此IP。此種機制保證撥號用戶在沒有SMTP認證的情況下,也可以通過遠程郵件伺服器傳送E-mail。 這些技術將在以後的文章內討論。
使用技巧
1、為什麼不能配置郵件伺服器為open relay的?
如果系統管理員將自己的郵件伺服器設定為open relay,將會導致一些垃圾郵件傳送者將你的郵件伺服器作為轉發垃圾郵件的中繼站,這將使垃圾郵件的接收者將矛頭對準你,可能會導致報復性的郵件炸彈;垃圾郵件還能消耗你大量的資源,占用你的頻寬。更為糟糕的事情可能是你的名字可能會上了黑名單,成為其他郵件接收者共同抵制的目標,你的郵件將被這些接收者所拒絕。
2、什麼是郵件轉發(mail relay)
設定好一個email伺服器以後,該伺服器將具有一個或若干個域名,這時email伺服器將監聽25號連線埠,等待遠程的傳送郵件的請求。網路上其他的mail伺服器或者請求傳送郵件的MUA(Mail User Agent,如outlook express、foxmail等等)會連線email伺服器的25號連線埠,請求傳送郵件,SMTP會話過程一般是從遠程標識自己的身份開始,過程如下:
HELO remote.system.domainname
250 qmailserver.domain
MAIL FROM:[email protected]
250 OK
RCPT TO: [email protected]
郵件的接收者[email protected]中的域名並不一定是本地域名,這時候本地系統可能有兩種回答,接受它:
250 OK
或者拒絕接受它:
553 sorry,.that domain isnot in my domain list of allowed recphosts
第一種情況下,本地email伺服器是允許relay的,它接收並同意傳遞一個目的地址不屬於本地域名的郵件;而第二種情況則不接收非本地郵件。
email一般都有一個配置檔案,其決定了是否接受一個郵件。只有當一個RCPT TO命令中的接收者地址的域名存在於該檔案中時,才接受該郵件,否則就拒絕該郵件。若該檔案不存在,則所有的郵件將被接受。當一個郵件伺服器不管郵件接收者和郵件接收者是誰,而是對所有郵件進行轉發(relay),則該郵件伺服器就被稱為開放轉發(open relay)的。當email伺服器沒有設定轉發限制時,其是開放轉發的。
3、sendmail如何限制郵件轉發
因為Send Mail 為了怕變成廣告信轉信站所以安裝後只線本機上的使用者寄信,要讓它為你轉信需要修改一點東西。 修改 /etc/mail/access 檔案在裡面增加下面幾行。
localhost RELAY
192.168.1 RELAY
就可以將 192.168.1 網域裡的信轉出去了。
安全環境
sendmail是在Unix環境下使用最廣泛的實現郵件傳送/接受的郵件傳輸代理程式。 由於sendmail郵件伺服器的特點是功能強大而複雜,因此為保證Sendmail的安全性,需要作以下一些工作。
1、設定Sendmail使用"smrsh"
smrsh程式的目的是作為在mailer中為sendmail定義的"/bin/sh"的替代shell。smrsh是一種受限shell工具,它通過"/etc/smrsh"目錄來明確指定執行檔的列表。簡而言之smrsh限制了攻擊者可以執行的程式集。當它與sendmail程式一起使用的時候,smrsh有效的將sendmail可以執行的程式的範圍限制在smrsh目錄之下。
第一步:
決定smrsh可以允許sendmail運行的命令列表。預設情況下應當包含以下命令,但不局限於這些命令:
"/bin/mail" (如果在你的系統中安裝了的話)
"/usr/bin/procmail" (如果在你的系統中安裝了的話)
注意:不可在命令列表里包括命令解釋程式,例如sh(1),csh(1),perl(1),uudecode(1)及流編輯器sed(1)。
第二步:
在"/etc/smrsh"目錄中創建允許sendmail運行的程式的符號連線。
使用以下命令允許mail程式"/bin/mail"運行:
[root@deep]# cd /etc/smrsh
[root@deep]# ln -s /bin/mail mail
用以下命令允許procmail程式"/usr/bin/procmail"運行:
[root@deep]# cd /etc/smrsh
[root@deep]# ln -s /usr/bin/procmail procmail
這將允許位於".forward"和"aliases"中的用戶採用"|program"語法來運行mail及procmail程式。
第三步
配置sendmail使之使用受限shell。mailer程式在sendmail的配置檔案"/etc/sendmail.cf"中僅有一行。必須修改"sendmail.cf"檔案中"Mprog"定義的那一行。將"/bin/sh"替換為"/usr/sbin/smrsh"。
編輯"sendmail.cf"檔案(vi /etc/sendmail.cf)並改動下面這一行:
例如:
Mprog, P=/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, T=X-Unix, A=sh -c $u
應該被改為:
Mprog, P=/usr/sbin/smrsh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, T=X-Unix, A=sh -c $u
當前用以下命令手工重起sendmail進程:
[root@deep]# /etc/rc.d/init.d/sendmail restart
2、"/etc/aliases"檔案
如果沒有加以正確和嚴格的管理的話,別名檔案被用來獲取特權。例如,很多發行版本在別名檔案中帶有"decode"別名。如今這種情況越來越少了。
這樣做的目的是為用戶提供一個通過mail傳輸二進制檔案的方便的方式。在郵件的傳送地,用戶把二進制檔案用"uuencode"轉換成ASCII格式,並把結果郵遞給接收地"decode"別名。那個別名通過管道把郵件訊息傳送到"/usr/bin/uuencode"程式,由這個程式來完成從ASCII轉回到原始的二進制檔案的工作。
刪除"decode"別名。類似的,對於所有用於執行沒有被放在smrsh目錄下的程式的別名,你都要仔細的檢查,可能它們都值得懷疑並應當刪除它們。要想使你的改變生效,需要運行:
[root@deep]# /usr/bin/newaliases
編輯別名檔案(vi /etc/aliases)並刪除以下各行:
# Basic system aliases -- these MUST be present.
MAILER-DAEMON: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
games: root?? 刪除這一行
ingres: root ?? 刪除這一行
nobody: root
system: root ?? 刪除這一行
toor: root?? 刪除這一行
uucp: root ?? 刪除這一行
# Well-known aliases.
manager: root ?? 刪除這一行
dumper: root ?? 刪除這一行
operator: root ?? 刪除這一行
# trap decode to catch security attacks
decode: root ?? 刪除這一行
# Person who should get root's mail
#root: marc
最後應該運行"/usr/bin/newaliases"程式使改動生效
3、避免你的Sendmail被未授權的用戶濫用
最新版本的Sendmail (8.9.3)加入了很強的防止欺騙的特性。它們可以防止你的郵件伺服器被未授權的用戶濫用。編輯你的"/etc/sendmail.cf"檔案,修改一下這個配置檔案,使你的郵件伺服器能夠擋住欺騙郵件。
編輯"sendmail.cf"檔案(vi /etc/sendmail.cf)並更改下面一行:
O PrivacyOptions=authwarnings
改為:
O PrivacyOptions=authwarnings,noexpn,novrfy
設定"noexpn"使sendmail禁止所有SMTP的"EXPN"命令,它也使sendmail拒絕所有SMTP的"VERB"命令。設定"novrfy"使sendmail禁止所有SMTP的"VRFY "命令。這種更改可以防止欺騙者使用"EXPN"和"VRFY"命令,而這些命令恰恰被那些不守規矩的人所濫用。
4、SMTP的問候信息
當 sendmail接受一個SMTP連線的時候,它會向那台機器傳送一個問候信息,這些信息作為本台主機的標識,而且它所做的第一件事就是告訴對方它已經準備好了。
編輯"sendmail.cf"檔案(vi /etc/sendmail.cf)並更改下面一行:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
改為:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b NO UCE C=xx L=xx
如今手工重起一下sendmail進程,使剛才所做的更改生效:
[root@deep]# /etc/rc.d/init.d/sendmail restart
以上的更改將影響到Sendmail在接收一個連線時所顯示的標誌信息。你應該把"`C=xx L=xx"條目中的"xx"換成你所在的國家和地區代碼。後面的更改其實不會影響任何東西。但這是"news.admin.net-abuse.email"新聞組的夥伴們推薦的合法做法。
5、限制可以審核郵件佇列內容的人員
通常情況下,任何人都可以使用"mailq"命令來查看郵件佇列的內容。為了限制可以審核郵件佇列內容的人員,只需要在"/etc/sendmail.cf"檔案中指定"restrictmailq"選項即可。在這種情況下,sendmail只允許與這個佇列所在目錄的組屬主相同的用戶可以查看它的內容。這將允許許可權為0700的郵件佇列目錄被完全保護起來,而我們限定的合法用戶仍然可以看到它的內容。
編輯"sendmail.cf"檔案(vi /etc/sendmail.cf)並更改下面一行:
O PrivacyOptions=authwarnings,noexpn,novrfy
改為:
O PrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq
如今我們更改郵件佇列目錄的許可權使它被完全保護起來:
[root@deep]# chmod 0700 /var/spool/mqueue
注意:我們已經在sendmail.cf中的"PrivacyOptions="行中添加了"noexpn"和"novrfy"選項,如今在這一行中我們接著添加"restrictmailq"選項。
任何一個沒有特權的用戶如果試圖查看郵件佇列的內容會收到下面的信息:
$ /usr/bin/mailq
You are not permitted to see the queue
6、限制處理郵件佇列的許可權為"root"
通常,任何人都可以使用"-q"開關來處理郵件佇列,為限制只允許root處理郵件佇列,需要在"/etc/sendmail.cf"檔案中指定"restrictqrun"。
編輯"sendmail.cf"檔案(vi /etc/sendmail.cf)並更改下面一行:
O PrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq
改為:
O PrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq,restrictqrun
任何一個沒有特權的用戶如果試圖處理郵件佇列的內容會收到下面的信息:
$ /usr/sbin/sendmail -q
You do not have permission to process the queue
7、在重要的sendmail檔案上設定不可更改位
可以通過使用"chattr"命令而使重要的sendmail檔案不會被擅自更改,可以提高系統的安全性。具有"+i"屬性的檔案不能被修改:它不能被刪除和改名,不能創建到這個檔案的連結,不能向這個檔案寫入數據。只有超級用戶才能設定和清除這個屬性。
為"sendmail.cf"檔案設定不可更改位:
[root@deep]#chattr+i /etc/sendmail.cf
為"sendmail.cw"檔案設定不可更改位:
[root@deep]#chattr+i /etc/sendmail.cw
為"sendmail.mc"檔案設定不可更改位:
[root@deep]#chattr+i /etc/sendmail.mc
為"null.mc"檔案設定不可更改位:
[root@deep]# chattr +i /etc/null.mc
為"aliases"檔案設定不可更改位:
其他方法
如果您是使用 Red Hat 7.3 以前的版本,例如 Red Hat 7.1, 7.2, 7.3 ,或者是 Open Linux Server 3.1.1 的話,那么請先確定一下底下的套件是否已經安裝上去了呢?
[root@test root]# rpm -qa | grep sendmail
sendmail-cf-8.11.6-3
sendmail-8.11.6-3
# 若有屬性相依的問題時,請將您的原版安裝光碟拿出來, mount 上去後,
# 仔細的,一個一個的將相依的套件安裝上去囉! ^_^
[root@test root]# rpm -qa | grep m4
m4-1.4.1-5
[root@test root]# rpm -q mailx
mailx-8.1.1-22
那個sendmail 就是主要的郵件伺服器程式,sendmail-cf 是一些設定檔案,這兩個套件是『一定』要安裝的!至於那個 m4 的套件,則是轉換 sendmail 設定檔案的一支程式囉!也要安裝喔!而那個mailx 就是提供最簡單的mail 這支寄信與收信的套件啦!由於我的測試系統是 Red Hat 7.2 ,所以使用的算是比較舊一點點的 sendmail 8.11.6 版,如果您想要換裝新版的 sendmail 8.12.xx 的話,
疑難解答
1、sendmail如何設定虛擬域?
如同Apache一樣,sendmail也允許使用虛擬主機功能,這是通過在mc檔案中FEATURE(virtusertable)功能實現的,而虛擬主機的檔案預設是/etc/mail/virtusertable.db,它用/etc/mail/virtusertable檔案生成,這個檔案的形式類似於aliases檔案,即左地址 右地址,中間用Tab鍵分開。例如:
[email protected] localuser
這樣一行意味著本來應該傳送給[email protected]的郵件如今要傳送給本機的用戶localuser。當然,這意味著:第一,你的DNS記錄中,本機應該是otherdomain.com的MX交換器;第二,你的本機sendmail.cw檔案或local-host-names應該包含otherdomain.com這個名字。
當然純粹的這樣的域意義不大,但是sendmail還支持郵件虛擬域的參數翻譯。例如:
@testdomain.com [email protected]
意味著所有發往xxx@testdomain的郵件都會被傳送到[email protected]。而
@testdomain.com %[email protected]
則代表參數轉義,例如[email protected]的郵件被傳送到[email protected],
[email protected]被傳送到[email protected]。同樣,這樣的功能也要通過MX記錄和CW檔案加上去。
建立virtusertable的方法與建立access的辦法是一樣的:
makemap hash virtusertable.db < virtusertable
然後重新啟動sendmail。
2、如何設定用戶別名?
用戶的別名是由檔案/etc/mail/aliases來設定的。最簡單的情況是需要作信件分發的情況。例如,一般情況下,電子郵件出現問題的時候,我們需要把出錯的郵件頭髮送到本機的postmaster用戶,但是也許你的系統上有多個系統管理員,因此每個人都需要得到一份這個郵件頭的拷貝。這種情況下就需要使用用戶別名檔案了。
aliases檔案的格式是 郵件別名:實際用戶名,如果一個別名有多個用戶就用逗號分開,每個別名一行。例如,要把發給postmaster的信件傳送給supervisor和manager,需要寫上這樣一行:
postmaster:supervisor,manager
別名還可以用在這樣的情況,即定義自動的郵件轉發。例如,某個用戶以前在你的系統上接受電子郵件,如今他有了一個新的電子郵件,希望發到你的機器上的郵件自動被轉發到他新的電子郵件地址上,那么,可以使用類似這樣的別名方式:(假設你的機器是[email protected])
以後發給[email protected]的電子郵件就自動中轉到[email protected]。注意左邊自動加上你的機器名字,所以左邊只能是賬號名字,不能是全限定郵件地址。
另一個常用的辦法是重定向。如果你在模板檔案中定義了REDIRECT特性,那么可以使用這個功能。例如,某個人在你的機器上開了一個賬戶user1,後來遷移到[email protected]。那么,你可以將其別名寫成
user1: [email protected]
以後當有人向這個地址發信的時候,你的sendmail會將其退回,並且返回一個551 User not local; please try [email protected]的信息。
在使用別名的時候,必須注意的是不要造成循環,例如user1轉發給user2,user2又將其轉發給user1....如此循環。在這種情況下,轉發17次後,sendmail將把它退還給發信人。最常見的錯誤發生在你試圖在轉發郵件的同時在本地保留備份的情況下,例如:
user1: user1,user2
就構成了一個循環。
要在本地保留備份,使用轉義符號,例如
user1: user1,user2
建立了別名檔案之後,需要將其初始化,這可以通過newaliases命令完成:
[root@mail mail]# newaliases
/etc/aliases: 17 aliases, longest 31 bytes, 241 bytes total
也可以使用sendmail -bi命令:
[root@mail mail]# sendmail -bi
/etc/aliases: 17 aliases, longest 31 bytes, 241 bytes total
兩種方式實際是完全一樣的。
類似於通過aliases檔案進行郵件轉發,用戶也可以使用自己的轉發檔案,例如,某個用戶user1想讓傳送給自己的郵件全部轉發到[email protected],但是又不希望建立全局的用戶別名,那么可以在自己的宿主目錄下面建立一個.forward檔案,內容只要一行:
就可以了。 這種技術可以讓每個用戶自己管理自己的郵件別名。