| 第一節、了解sendmail |
| |
sendmail的啟動文檔一般是/etc/init.d/sendmail,我們通過他可以清楚的了解sendmail 使用的幾個文檔。
# cd /etc/init.d/
# more sendmail
通過這個文檔我可以清楚的看到幾個相關文件:
/usr/lib/sendmail 實際運行的執行文件
/etc/mail/sendmail.cf 主配置文件
/var/spool/mqueue 郵件隊列
/etc/default/sendmail 初始變量設置文件等等。
運行機制簡單的說就是由/etc/init.d/sendmail啟動/usr/lib/sendmail,/usr/lib/sendmail加載/etc/mail/sendmail.cf裡面關sendmail的設置。
#!/sbin/sh
#
# Copyright (c) 1992, 1995, 1997 - 2000 by Sun Microsystems, Inc.
# All rights reserved.
#
#ident "@(#)sendmail 1.16 00/09/06 SMI"
ERRMSG1='WARNING: /var/mail is NFS-mounted without setting actimeo=0,'
ERRMSG2='this can cause mailbox locking and access problems.'
'start')
if [ -f /usr/lib/sendmail -a -f /etc/mail/sendmail.cf
]; then
if [ ! -d /var/spool/mqueue
]; then
/usr/bin/mkdir
-m 0750 /var/spool/mqueue
/usr/bin/chown
root:bin /var/spool/mqueue
fi
MODE="-bd"
if [ -f /etc/default/sendmail
]; then
.
/etc/default/sendmail
fi
if [ -z "$QUEUEINTERVAL"
]; then
QUEUEINTERVAL="15m"
fi
case $QUEUEINTERVAL in
*s
| *m | *h | *d | *w) ;;
*)
QUEUEINTERVAL="15m" ;;
esac
if [ $QUEUEINTERVAL -le
0 ]; then
QUEUEINTERVAL="15m"
fi
/usr/lib/sendmail $MODE
-q$QUEUEINTERVAL $OPTIONS &
for i in $ETRN_HOSTS; do
SERVER=`echo
$i | /usr/bin/sed -e 's/:.*$//'`
CLIENTS=`echo
$i | /usr/bin/sed -n -e 's/,/ /g' \
-e
'/:/s/^.*://p'`
/usr/sbin/etrn
$SERVER $CLIENTS >/dev/null 2>&1 &
done
fi
if /usr/bin/nawk 'BEGIN{s = 1}
$2 == "/var/mail" && $3
== "nfs" && $4 !~ /actimeo=0/ &&
$4 !~ /noac/{s = 0} END{exit
s}' /etc/mnttab; then
/usr/bin/logger -p mail.crit
"$ERRMSG1"
/usr/bin/logger -p mail.crit
"$ERRMSG2"
fi
;;
'stop')
/usr/bin/pkill -x -u 0 sendmail
;;
*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac
exit 0
|
| 第二節、sendmail.cf的配置 |
| |
/etc/mail/sendmail.cf這個文件一般不要修改,其配置規則簡單介紹如下:
sendmail.cf文件通常由若幹個節組成,以下是常見的節名: |
| Local Information |
定義有關個人主機的信息 |
| General Macros |
定義有關本地網絡的宏 |
| Classes |
定義用特殊郵件傳輸程序的主機名群或域名群 |
| Version Number |
標識sendmail.cf文件的版本號 |
| Special Macros |
定義由sendmail所用的一些特殊的宏 |
| Option |
定義sendmail選項 |
| Message Precedence |
定義sendmail所用的各種消息的優先級值 |
| Trusted Users |
定義在發送郵件時可忽略發送者地址的用戶 |
| Format of Headers |
定義sendmail插入的郵件首部格式 |
| Rewriting Rules |
定義用重寫郵件地址的規則 |
| Mailers |
定義sendmail用來調用郵件傳輸程序的指令 |
| Ruleset Zero |
定義一組稱為Ruleset Zero的特殊重寫規則 |
| Machine-dependent part of Ruleset Zero |
定義與配置相關的Ruleset Zero部分 |
|
| sendmail.cf命令從每一行的第一格開始,#開頭的表示注釋,第一個字符表示指令,以下是每個指令的意義: |
| V |
設定組態文件sendmail.cf的版本 |
| M |
指定一個MTA |
| D |
定義宏x的值為values |
| |
命令D用來定義宏,然該宏就可以被sendmail.cf文件中的其他配置命令和sendmail程序自身調用。宏的名字可以是任何單個的ASCII字符,以下是sendmail中所有的內部宏:
|
| a |
RFCs822格式的原始日期 |
| b |
RFCs822格式的當前日期 |
| c |
Hop計數 |
| d |
UNIX格式的日期 |
| e |
SMTP數據項信息 |
| f |
“來自”地址的發送者 |
| g |
相對接收者的發送者的地址 |
| h |
接收主機 |
| i |
隊列標識 |
| j |
節點的正式域名 |
| l |
UNIX的行格式 |
| n |
用錯誤信息中的名字 |
| o |
地址中的操作符集合 |
| p |
sendmail的PID |
| q |
默認的發送者地址格式 |
| r |
所用的協議 |
| s |
發送者主機名 |
| t |
當前時間的數值表示 |
| u |
接收方用戶 |
| v |
sendmail的版本號 |
| w |
該節點的主機名 |
| x |
發送者全名 |
| z |
接收者宿主目錄 |
| |
|
| R |
重寫lhs為rhs |
| |
地址重寫是sendmail的核心部分,它的作用是分析來自郵件程序的電子郵件的地址,並將它們重寫成郵件傳輸程序所需要的格式。
規則集是一組可以由數字引用的相關重寫規則。Sn命令標志一個規則集的開始,其中n是這個規則集的編號,其范圍從0∼29。其中0∼4號規則集是被sendmail直接調用的,它們的說明如下:
|
| 0 |
在規則集3之調用,它將生成一個三元組:<傳輸程序,接收方主機,接 收用戶名> |
| 1 |
用消息中所有發送者地址 |
| 2 |
用消息中所有接收者地址 |
| 3 |
最大和最復雜的規則集,也是用地址的第一個規則集,將地址轉化成正規形式,即:local-part@host.domain |
| 4 |
用消息中所有地址並將內部地址轉換成外部地址形式 |
地址重寫規則由命令R定義,其格式如下:
Rlhs rhs comment
lhs,rhs和comment這三個字段之間用tab隔開。重寫規則將輸入地址與lhs進行匹配,如果成功,就按照rhs進行重寫。重寫的結果再次與lhs匹配,如果成功,就再次按照rhs進行重寫,直到結果不再與rhs匹配。
|
| S |
開始一個規則集合 |
| C |
定義類別宏 |
| F |
文件定義類別 |
| O |
設定sendmail.cf選項 |
| |
命令O給sendmail的選項賦值。賦給選項的值可以是字符,整數,布耳值或時間間隔值。每個選項都在sendmail中進行了定義。以下是sendmail中所有選項的含義和用法:
|
|
選項
|
用 法
|
解 釋
|
| A |
Afile |
指定別名文件的名字 |
| a |
aN |
為@:@等待N分鐘,然重建別名文件 |
| B |
Bc |
定義空代替字符 |
| c |
c |
將郵件隊列排隊以等待郵件傳輸程序 |
| D |
D |
重建別名數據庫 |
| db |
db |
以台方式傳輸 |
| di |
di |
交互式傳輸 |
| dq |
dq |
在下一個隊列運行時傳輸 |
| ee |
ee |
郵遞錯誤信息,總是返回退出狀態0 |
| em |
em |
郵回錯誤信息 |
| ep |
ep |
打印錯誤信息 |
| eq |
eq |
僅返回退出狀態,無錯誤信息 |
| ew |
ew |
寫回退出狀態 |
| f |
f |
保持UNIX風格的From行 |
| g |
gn |
設置郵件傳輸程序默認的GroupID為n |
| H |
Hfile |
定義SMTP幫助文件的名字 |
| I |
I |
使用BIND名字服務器來解析所用的名字 |
| i |
i |
忽略入局信息中的點 |
| L |
Ln |
設置日志級別為n |
| M |
Mxval |
設置宏x的值為val |
| m |
m |
同時發往自身 |
| N |
Nnet |
定義宿主網絡名 |
| o |
o |
接受舊格式首部 |
| Q |
Q |
定義隊列目錄名 |
| q |
qn |
定義用決定何時排隊任務的因子n |
| r |
rt |
設置用超時的內部時間間隔t |
| S |
Sfile |
定義統計日志文件名 |
| s |
s |
在試圖傳輸前總是創建隊列文件 |
| T |
Tt |
設置排隊超時為t |
| u |
un |
設置郵件傳輸程序默認的UserID為n |
| v |
v |
以冗余方式運行 |
| W |
Wpass |
定義用遠程調試的口令 |
| X |
X1 |
如果平均負載超過1則拒絕SMTP連接 |
| x |
x1 |
如果平均負載超過1則排隊郵件 |
| Y |
Y |
在不同的進程中傳輸每個排隊郵件 |
| y |
yn |
每個接收者作業時間優先級差為n |
| Z |
Zn |
每次運行時減少n個作業優先級 |
| z |
zn |
同前綴一起決定郵件優先級 |
| |
|
|
| |
|
|
| |
|
|
| |
|
|
|
| H |
定義標頭 |
| P |
優先權設定 |
| T |
信任的用戶 |
| K |
具有鍵值的數據庫 |
| E |
重設環境變量 |
| L |
擴充負載的支持 |
| 第三節、sendmail別名 |
| |
sendmail別名
別名是sendmail最重要的功能之一。它在aliases中定義。aliases文件的位置由sendmail.cf中的選項A指定,一般位/etc/mail目錄中。aliases是一個文本文件,其中每一行的格式如下:
alias:recipeint[,recipeint,...]
其中alias為郵件中地址的名字,recipient為郵件目的地址的名字。郵件目的地址名可以有很多,每個之間用逗號符隔開。下面介紹別名的幾種主要用法:
保護登陸帳號
許多網絡黑客進攻網絡計算機的第一步是獲取目標機上合法用戶的帳號,而電子郵件帳號一般和登陸帳號相同,這就使黑客有機可乘。但是可以用別名來保護合法用戶的帳號。如一位合法用戶的登陸帳號為mmmmmn,而他的電子郵件帳號可以是tiaozao。只要在別名文件中加入“tiaozao:mmmmmn”就可以達到這一目的。
電子郵件轉發
如果想要將發給mmmmmn用戶的電子郵件自動轉發給root用戶,只需在別名文件中加入“mmmmmn:root”。又如用戶mmmmmn離開這個單位。從安全角度上講應該將他的用戶帳號刪除。但是由他不可能馬上將新的電子郵件帳號通知所有人,所以希望將他原來的電子郵件帳號保留一段時間。這只要在別名文件中加入“mmmmmn:新的電子郵件地址”。
郵件列表的實現
別名最重要的功能就是實現郵件列表。通過它可以實現填寫一個接收者地址而將信發給許多人。例如在主機上設置一個郵件列表boycw,包括mmmmmn,bear,joy
和peng。只需在別名文件中加入:
boycw:mmmmmn,bear,joy,peng
owner_boycw:mmmmmn
當接收者是boycw時,信會自動發給mmmmmn,bear,joy和peng。當發送郵件給boycw時如果出錯,將把錯誤信息發給mmmmmn。
|
| 第四節、access 的用法 |
| |
對付垃圾郵件,以及進行權限控制。
關access的用法在http://www.fanqiang.com/a6/b3/20010724/1000011015.html已經講的很清楚了,我補充點如下:--好象8.10版以的才能使用次功能,主要是增加了LHS
部分的變量內容。
新增的變量為:
Connect: connection information (${client_addr},
${client_name})
From: sender
To: recipient
很容易理解,舉例如下:
From:spammer@some.dom REJECT
To:friend.domain RELAY
Connect:friend.domain OK
Connect:from.domain RELAY
From:good@another.dom OK
From:another.dom REJECT |