Sendmail郵件服務器快速指南

12/3/2006來源:Qmail人氣:15373

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

概述

sendmail是最重要的郵件傳輸代理程序。理解電子郵件的工作模式是非常重要的。一般情況下,我們把電子郵件程序分解成用戶代理,傳輸代理和投遞代理。 用戶代理用來接受用戶的指令,將用戶的信件傳送至信件傳輸代理,如:Outlook exPRess、Foxmail等。而投遞代理則從信件傳輸代理取得信件傳送至最終用戶的郵箱,如:procmail。

當用戶試圖發送一封電子郵件的時候,他并不能直接將信件發送到對方的機器上,用戶代理必須試圖去尋找一個信件傳輸代理,把郵件提交給它。信件傳輸代理得到了郵件后,首先將它保存在自身的緩沖隊列中,然后,根據郵件的目標地址,信件傳輸代理程序將找到應該對這個目標地址負責的郵件傳輸代理服務器, 并且通過網絡將郵件傳送給它。對方的服務器接收到郵件之后,將其緩沖存儲在本地,直到電子郵件的接收者察看自己的電子信箱。

顯然,郵件傳輸是從服務器到服務器的,而且每個用戶必須擁有服務器上存儲信息的空間(稱為信箱)才能接受郵件(發送郵件不受這個限制)。可以看到,一個郵件傳輸代理的主要工作是監視用戶代理的請求,根據電子郵件的目標地址找出對應的郵件服務器,將信件在服務器之間傳輸并且將接收到的郵件緩沖或者 提交給最終投遞程序。 有許多的程序可以作為信件傳輸代理,但是sendmail是其中最重要的一個,事實證明它可以支持數千甚至更多的用戶,而且占用的系統資源相當少。不過,sendmail的配置十分復雜,因此,也有人使用另外的一些工具,如qmail、postfix等等。

當sendmail程序得到一封待發送的郵件的時候,它需要根據目標地址確定將信件投遞給對應的服務器,這是通過DNS服務實現的。例如一封郵件的目標地址是[email protected]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將是試圖直接與來自郵件地址的主機對話并且發送郵件。例如,[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和qpopper:

sendmail.8.11.4.tar.gz http://www.sendmail.org/current-release.html
qpopper4.0.3.tar.gz http://www.eudora.com/qpopper_general/

Sendmail的配置和安裝

Sendmail是目前使用最為廣泛的一種E-mail服務器。當前其最新的穩定版本為8.11.4。下載得到tar.gz格式的壓縮包以后,將其存放在/usr/src目錄下。

解壓軟件包:

[[email protected] src]# tar xvfz sendmail.8.11.4.tar.gz
[[email protected] src]# cd sendmail-8.11.4

編譯安裝:

[[email protected] sendmail-8.11.4]# cd sendmail
[[email protected] sendmail]# sh Build

生成配置文件:

[[email protected] 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')


然后運行:

[[email protected] cf]# sh Build config.cf

該命令將在該目錄下生成config.cf文件。然后安裝sendmail:

[[email protected] sendmail]# sh Build install

將config.cf拷貝到/etc/mail目錄下,并改名為sendmail.cf:

[[email protected] mail]#cp /usr/src/sendmail-8.11.4/cf/cf/config.cf /etc/mail/sendmail.cf

在/etc/mail目錄下創建access文件,內容如下:

127.0.0.1 RELAY
202.99.11 RELAY

這里表示允許本機和202.99.11.0網段中的機器通過該郵件服務器的轉發郵件。其中202.99.11應該是你擁有的局域網絡IP網段的IP地址,只需要寫網絡部分即可。比如說你的用戶有多個網段,只需要在其中設置多個網段即可:

127.0.0.1 RELAY
202.99.11 RELAY
200.200.201 RELAY

然后對access文件生成易于檢索的庫文件格式:

[[email protected] 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庫:

[[email protected] mail]# newaliases

然后,就可以啟動Sendmail了:

[[email protected] 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的安裝配置

qpopper是Unix/Linux環境下的pop3服務器,該軟件配合sendmail使用。其主要是實現支持用戶通過pop3接收信件。

創建從/usr/mail指向/var/spool/mail/的鏈接:

[[email protected] src]# ln -s /var/spool/mail/ /usr/mail

解壓qpopper軟件包:

[[email protected] src]# tar xvfz qpopper4.0.3.tar.gz
[[email protected] src]# cd qpopper4.0.3

編譯安裝qpopper:

[[email protected] qpopper4.0.3]# ./configure
[[email protected] qpopper4.0.3]# make
[[email protected] qpopper4.0.3]# make install

安裝成功以后,qpopper將會被安裝在目錄/usr/local/sbin/目錄下。設置inetd啟動qpopper。編輯/etc/inetd.conf,查找pop內容的一行,在其前面添加#號,然后在改行后面添加入下內容:

pop-3 stream tcp nowait root /usr/local/sbin/popper qpopper -s

然后查找inetd進程ID號:

[[email protected] qpopper4.0.3]# ps ax|grep inetd
336 ? S 0:00 inetd
16872 pts/0 S 0:00 grep inetd

找到inetd進程號為226。然后重新啟動inetd進程,重新讀取配置文件:

[[email protected] qpopper4.0.3]# kill -HUP 336

這時候查看系統服務端口號:

[[email protected] qpopper4.0.3]# netstat -ln|grep 110
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN

則說明110端口已經開始正常服務。

IMAP服務器安裝測試

實現對IMAP的支持非常簡單,只需要安裝IMAP軟件包的RPM包:

[[email protected] RPM]# rpm -ivh imap-4.7-5.i386.rpm (這里是在6.2環境下,如果在7.x環境下需要安裝更高版本的imap)

然后確保/etc/inetd.conf文件中imap所在行如下圖所示:

imap stream tcp nowait root /usr/sbin/tcpd imapd

然后重新啟動inetd以更新配置:

[[email protected] /]# kill -HUP 379 (這里379是inetd的進程號)

然后查看imap是否成功啟動:

[[email protected] /]# 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。 這些技術將在以后的文章內討論。

FAQ

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]

意味著所有發往[email protected]的郵件都會被發送到[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])

joe:[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命令完成:

[[email protected] mail]# newaliases

/etc/aliases: 17 aliases, longest 31 bytes, 241 bytes total

也可以使用sendmail –bi命令:

[[email protected] mail]# sendmail -bi

/etc/aliases: 17 aliases, longest 31 bytes, 241 bytes total

兩種方式實際是完全一樣的。

類似于通過aliases文件進行郵件轉發,用戶也可以使用自己的轉發文件,例如,某個用戶user1想讓發送給自己的郵件全部轉發到[email protected],但是又不希望建立全局的用戶別名,那么可以在自己的宿主目錄下面建立一個.forward文件,內容只要一行:

[email protected]

就可以了。 這種技術可以讓每個用戶自己管理自己的郵件別名。



上海天天彩选4专题信息 7m足球即时比分网 cba雷速体育用品 安卓手机小鱼赚钱怎么玩 足彩进球彩 女神异闻录赚钱容易 山西快乐十分 2016年那个行业最赚钱吗 雷速体育比分直播下载 乐天国际游戏 如何通过微信订阅号赚钱 足球直播信号源 捕鱼来了炮台 开泰式按摩店赚钱吗 新浪nba比分数据查询 单机麻将免费下载 五分彩