複製鏈接
請複製以下鏈接發送給好友

sendmail

鎖定
sendmail,計算機用語,是一種最重要的郵件傳輸代理程序。
中文名
sendmail
含    義
最重要的郵件傳輸代理程序
目    的
引導用户構建一個需要的郵件系統
用    户
理解電子郵件的工作模式

sendmail簡介

人們在互聯網上最常使用的就是電子郵件,很多企業用户也經常使用免費電子郵件系統。本文就以step by step的方式引導用户從sendmail源代碼開始構建一個可以滿足基本工作需要的郵件系統

sendmail程序介紹

sendmail是最重要的郵件傳輸代理程序。理解電子郵件的工作模式是非常重要的。一般情況下,我們把電子郵件程序分解成用户代理,傳輸代理和投遞代理。用户代理用來接受用户的指令,將用户的信件傳送至信件傳輸代理,如:outlook expressfoxmail等。而投遞代理則從信件傳輸代理取得信件傳送至最終用户的郵箱,如:procmail。
當用户試圖發送一封電子郵件的時候,他並不能直接將信件發送到對方的機器上,用户代理必須試圖去尋找一個信件傳輸代理,把郵件提交給它。信件傳輸代理得到了郵件後,首先將它保存在自身的緩衝隊列中,然後,根據郵件的目標地址,信件傳輸代理程序將找到應該對這個目標地址負責的郵件傳輸代理服務器, 並且通過網絡將郵件傳送給它。對方的服務器接收到郵件之後,將其緩衝存儲在本地,直到電子郵件的接收者查看自己的電子信箱。
顯然,郵件傳輸是從服務器到服務器的,而且每個用户必須擁有服務器上存儲信息的空間(稱為信箱)才能接受郵件(發送郵件不受這個限制)。可以看到,一個郵件傳輸代理的主要工作是監視用户代理的請求,根據電子郵件的目標地址找出對應的郵件服務器,將信件在服務器之間傳輸並且將接收到的郵件緩衝或者 提交給最終投遞程序。有許多的程序可以作為信件傳輸代理,但是sendmail是其中最重要的一個,事實證明它可以支持數千甚至更多的用户,而且佔用的系統資源相當少。不過,sendmail的配置十分複雜,因此,也有人使用另外的一些工具,如qmail、postfix等等。
當sendmail程序得到一封待發送的郵件的時候,它需要根據目標地址確定將信件投遞給對應的服務器,這是通過DNS服務實現的。例如一封郵件的目標地址是ideal@linuxaid.com.cn,那麼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將是試圖直接與來自郵件地址的主機對話並且發送郵件。例如,test@aidgroup.linuxaid.com.cnDNS中沒有對應的MX記錄,因此sendmail在確定MX交換器失敗後,將從DNS取得對方的IP地址並直接和對方對話試圖發送郵件。

sendmail工作環境

sendmail sendmail
假設用户希望在園區網環境中架設一個電子郵件服務器,為本單位用户提供郵件服務。該服務器擁有一個合法的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安裝

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文件,內容如下:
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,這樣用户才可以使用someone@linuxaid.com.cn.這樣的地址收發郵件,故該文件應該包含如下內容:
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等行都是空白行而已。刪除以後再重新啓動就應該沒有問題了。

sendmail安裝配置

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端口已經開始正常服務。

sendmail安裝測試

實現對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中添加賬號進行測試了。

sendmail測試

接下來是測試郵件服務器的郵件發送/接收功能,注意:測試時,不要在只對本地用户進行測試,如:你的域為abc.com,測試時,不要只在郵件服務器上通過mail、elm等程序測試user1@abc.com用户。因為,此時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。 這些技術將在以後的文章內討論。

sendmail使用技巧

1、為什麼不能配置郵件服務器為open relay的?
如果系統管理員將自己的郵件服務器設置為open relay,將會導致一些垃圾郵件發送者將你的郵件服務器作為轉發垃圾郵件的中繼站,這將使垃圾郵件的接收者將矛頭對準你,可能會導致報復性的郵件炸彈;垃圾郵件還能消耗你大量的資源,佔用你的帶寬。更為糟糕的事情可能是你的名字可能會上了黑名單,成為其他郵件接收者共同抵制的目標,你的郵件將被這些接收者所拒絕。
2、什麼是郵件轉發(mail relay)
設置好一個email服務器以後,該服務器將具有一個或若干個域名,這時email服務器將監聽25號端口,等待遠程的發送郵件的請求。網絡上其他的mail服務器或者請求發送郵件的MUA(Mail User Agent,如outlook expressfoxmail等等)會連接email服務器的25號端口,請求發送郵件,SMTP會話過程一般是從遠程標識自己的身份開始,過程如下:
HELO remote.system.domainname
250 qmailserver.domain
MAIL FROM:user@somewherer.net
250 OK
RCPT TO: user1@elsewhere.net
郵件的接收者user1@elsewhere.net中的域名並不一定是本地域名,這時候本地系統可能有兩種回答,接受它:
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安全環境

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"文件設置不可更改位:

sendmail其他方法

如果您是使用 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 的話,

sendmail疑難解答

1、sendmail如何設置虛擬域?
如同Apache一樣,sendmail也允許使用虛擬主機功能,這是通過在mc文件中FEATURE(virtusertable)功能實現的,而虛擬主機的文件缺省是/etc/mail/virtusertable.db,它用/etc/mail/virtusertable文件生成,這個文件的形式類似於aliases文件,即左地址 右地址,中間用Tab鍵分開。例如:
someone@linuxaid.net.cn localuser
這樣一行意味着本來應該發送給someone@otherdomain.com的郵件如今要發送給本機的用户localuser。當然,這意味着:第一,你的DNS記錄中,本機應該是otherdomain.com的MX交換器;第二,你的本機sendmail.cw文件或local-host-names應該包含otherdomain.com這個名字。
當然純粹的這樣的域意義不大,但是sendmail還支持郵件虛擬域的參數翻譯。例如:
@testdomain.com test@linuxaid.com.cn
意味着所有發往xxx@testdomain的郵件都會被髮送到test@linuxaid.com.cn。而
@testdomain.com %1test@linuxaid.com.cn
則代表參數轉義,例如user1@testdomain.com的郵件被髮送到user1test@linuxaid.com.cn,
user2@testdomain.com被髮送到user2test@linuxaid.com.cn。同樣,這樣的功能也要通過MX記錄和CW文件加上去。
建立virtusertable的方法與建立access的辦法是一樣的:
makemap hash virtusertable.db < virtusertable
然後重新啓動sendmail。
2、如何設定用户別名?
用户的別名是由文件/etc/mail/aliases來設定的。最簡單的情況是需要作信件分發的情況。例如,一般情況下,電子郵件出現問題的時候,我們需要把出錯的郵件頭發送到本機的postmaster用户,但是也許你的系統上有多個系統管理員,因此每個人都需要得到一份這個郵件頭的拷貝。這種情況下就需要使用用户別名文件了。
aliases文件的格式是 郵件別名:實際用户名,如果一個別名有多個用户就用逗號分開,每個別名一行。例如,要把發給postmaster的信件發送給supervisor和manager,需要寫上這樣一行:
postmaster:supervisor,manager
別名還可以用在這樣的情況,即定義自動的郵件轉發。例如,某個用户以前在你的系統上接受電子郵件,如今他有了一個新的電子郵件,希望發到你的機器上的郵件自動被轉發到他新的電子郵件地址上,那麼,可以使用類似這樣的別名方式:(假設你的機器是joe@linuxaid.com.cn)
joe:joe@xxxxx.com
以後發給joe@linuxaid.com.cn的電子郵件就自動中轉到joe@newaddr.com。注意左邊自動加上你的機器名字,所以左邊只能是賬號名字,不能是全限定郵件地址。
另一個常用的辦法是重定向。如果你在模板文件中定義了REDIRECT特性,那麼可以使用這個功能。例如,某個人在你的機器上開了一個賬户user1,後來遷移到user2@server2.com。那麼,你可以將其別名寫成
user1: user2@server2.com.REDIRECT
以後當有人向這個地址發信的時候,你的sendmail會將其退回,並且返回一個551 User not local; please try user2@server2.com的信息。
在使用別名的時候,必須注意的是不要造成循環,例如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想讓發送給自己的郵件全部轉發到xxxxx@xxxxxx.com,但是又不希望建立全局的用户別名,那麼可以在自己的宿主目錄下面建立一個.forward文件,內容只要一行:
xxxxxx@xxxxx.com
就可以了。 這種技術可以讓每個用户自己管理自己的郵件別名。