歡迎您光臨本站 註冊首頁

全面了解和使用電子郵件伺服器

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  了解電子郵件
  在世界上,數以百萬計的計算機用戶已經訪問過電子郵件。Email已經成為互聯網上最重要的服務,你可能沒用過ftp,沒上過BBS,沒有自己的主頁,但你應該有一個自己的電子郵件信箱。大量的商業網路或Internet服務提供商(ISP)可以使你在世界範圍內訪問電子郵件。電子郵件是在單機系統上的或在網路系統上的用戶用來發送和接收電子信息的任何程序。它有如下優點:
   □你可以在很短時間內把數據發送到目的地。
   □你不用擔心在發送和接收電子郵件的過程中被中斷——因為這些都是由計算機系統來控制的。
   □你不必與通信人預約。
   □你可以在任何時間發送和接收電子郵件。

定製mail環境
  在使用mail程序時,系統會檢測你的起始目錄中的.mailrc文件。你可以根據自己的需要在.mailrc文件中設置不同的環境變數和命令。以下列出了環境變數:
   □#:表示一個註釋行
   □alias:設置單個別名或組別名。用法是:alias alias-name address-list
   □set:設置環境變數。用法是:set variable-name或set variable-name=string
  在使用mail時,你還可以在問號(?)提示符下發出以下命令:
   □askcc:在輸入消息后提示輸入cc:list。默認值是noaskcc
   □asksub:在輸入消息前提示輸入Subject清單。默認時是提示輸入
   □noheader:在啟動mail時,不列印可獲得的消息的標題信息。默認時是列印標題信息
   □ignore:在輸入信息時,忽略中斷字元。如果連接的電話或其他通信線路上有「雜音」,這個變數很有用。默認值是noignore
   □metoo:當你的名字在組別名中時,消息通常不發送給你。默認值是nometoo
  以下是一個.mailrc文件的例子:


   # .mailrc file for XiaoNiao
   # make sure interrupts are NOT ignored
   set noignore
   # set variables so that promptsfor Subject and Cc always appear
   set asksub
   set askcc
   # individual aliase
   alias billy wbracksto
   alias ham xiaoniao@linuxaid.com.cn bbow
   alias me gunter
   # group aliases,mailing list
   alias pirates wangtao@linuxaid.com bbow
   alias research jones jreynold eackerma
   alias framistan wjones imgood linuxcd@linuxaid.net imgood
   #End .mailrc

SMTP協議簡介
  SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它主要規定基礎的電子郵件提交系統怎麼傳遞報文。對於電子郵件系統怎麼從用戶接受電子郵件,用戶介面怎麼給用戶顯示接到的電子郵件,電子郵件如何存儲以及電子郵件系統以怎樣的頻度發送報文等問題卻沒有作出規定。
  在SMTP中,客戶機與伺服器之間的通信是由可讀文本構成的。開始,客戶機通過三次握手與伺服器(通常是TCP 25埠)建立一個TCP連接,然後等待伺服器發送220 READY FOR MAIL。在收到220報文後,客戶機發送HELO命令。之後,電子郵件交互以MAIL命令開始,在MAIL命令中,有一個「FROM:」欄位,用於在出錯是通知發信人。伺服器收到MAIL命令后,發送250 OK作為響應,表示一切正常。MAIL命令成功后,客戶方就可以將收信人地址告訴伺服器,這是用一連串RCPT命令來實現。伺服器接收到每個RCPT命令后,發送250 OK作為響應,表示正確接收;或者發送550 No such user here作為響應,表示沒有這個用戶。客戶方的RCPT命令得到正確響應后,就可以DATA命令發送數據。伺服器收到DATA命令后,發送354 Start mail input;end with.給予響應。其中end with.
規定了用於結束電子郵件報文的五個連續字元,即:回車,換行,圓點,回車,換行,這就是為什麼用MAIL發送郵件時,最後只含有一個圓點的行表示結束的緣故。

3.4 sendmail


.1 sendmail的功能
  Sendmail是由Eric Allman寫的程序,後來經過很多人的貢獻,才成為現在的版本。目前幾乎所有的Unix/Linux系統都使用sendmail。sendmail之所以能夠流行其主要的原因是它消除了由多個郵件傳輸程序所造成的混亂,可以說sendmail的功能非常強大,這就使得它的結構和配置命令的用法非常複雜,並且它的規則集非常難看懂,對於處學者來說簡直是讀天書。以下就詳細介紹sendmail的結構和配置命令。

.2 sendmail的結構
  我們每次收發電子郵件時就會調用sendmail,一般來說我們習慣用mail命令來收發電子郵件,這時mail命令會自動調用sendmail對郵件地址進行重寫,並且根據接收者地址來判斷目的地址是本機或是其他運行TCP/IP的主機來調用各自的郵件傳輸程序。當調用本地主機的傳輸程序時,sendmail會試圖將郵件添加到接收者用戶的maildrop文件中,如果接收者不存在則將郵件退回。當sendmail調用TCP/IP主機的郵件傳輸程序時,就先會想遠程主機的25埠請求連接,如果連接成功,就以mail命令來交互電子郵件,然後客戶端向伺服器發送一連串RCPT命令,當伺服器返回250 OK則表示正確接收,返回550 No such user here則表示沒有這個用戶。如果連接失敗,就會將郵件存入郵件隊列等待一段時間后重發,如果連接認然失敗就將信退回發送者。

.3 以守護進程方式運行sendmail
  當sendmail作為守護進程運行時要在Linux的啟動描述文件里加入以下代碼:


  if[-f /usr/lib/sendmail];then(cd/usr/spool/mqueue;rm -f lf*)
    /usr/lib/sendmail -bd -q1h;echo -n sendmail>/dev/console
  fi


  第一行檢查sendmail文件是否存在。如果存在則進入郵件隊列目錄並刪除所有鎖定文件。第二行帶兩個參數啟動sendmail。參數-db表示以守護進程方式啟動sendmail,參數-q1h表示每隔一個小時處理一次郵件隊列。
  當以守護進程方式運行sendmail時,如果有遠程客戶主機請求建立TCP 25埠的連接,則sendmail就會根據SMTP協議與遠程客戶主機進行交互並按照規則重寫地址,然後根據接收者地址來判斷目的地址是本機或是其他運行TCP/IP的主機來調用不同的郵件傳輸程序。

.4 sendmail.cf配置文件
  一般來說不必自己去修改sendmail.cf文件。但是有時你可能想要了解一下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的值為value
R  重寫lhs為rhs
S  開始一個規則集合
C  定義類別宏
F  文件定義類別
O  設定sendmail.cf選項
H  定義標頭
P  優先權設定
T  信任的用戶
K  具有鍵值的資料庫
E  重設環境變數
L  擴充負載的支持

S指令
  S指令表示開始一個規則集合,將sendmail.cf中的規則集合起來成為一個可調用的規則集S,S後面緊接著的數字是這個規則集的編號,當遇到下一個S開頭的一行這個規則集就結束。以下是一個V8規則集的用途:    S0    解釋一個郵件傳遞代理程序
   S1    處理寄信人的地址
   S2    處理收信人的地址
   S3    預先處理所以人的地址
   S4    事後處理所有地址
   S5     改寫無別名的local用戶  

R指令
  R指令用來解析地址,將電子郵件的地址分割為基元,並決定基元的種類,如電子郵件地址xiaoniao@linuxaid.com.cn可以分割為:    xiaoniao
   @
   linuxaid
   .
   com
   .
   cn   
  7部分,然後進行基元比較,如果符合LHS,則改為RHS。
C指令
  C指令定義一個類別宏,即用一個一維數組放一個同一類型的宏值。如:
   CA a b c 將A定義為{a,b,c}
F指令
  在C指令定義一個數組時,如果這個數組太長,可以將它放在一個文件中,由F指令來讀入。如:    Fw /etc/sendmail.cw
H指令
  H指令用來定義標頭。郵件包含標頭和內容,中間以一行分隔,標頭的規定如下:   HFrom:<$g> 當送信人沒有給出From標頭時,sendmail會自動從宏$g中得到送信人的地址,然後加上<>作為信箋的標頭之一。
HReceived:by $j;$b 將Received標頭改為by寄信人主機;日期的格式。
  在標頭中也可以使用條件宏,如:
$?x($x)$. 意思是如果x被賦值,則將x的值賦給$x。
  以下是標頭的內定宏:
$s 寄信人主機
$i 隊列ID
$x 寄信人全名
$_ 寄信人地址
$u 收信人
$a 郵件產生日期
$j 主機名
$b 日期

  命令D用來定義宏,然後該宏就可以被sendmail.cf文件中的其他配置命令和sendmail程序自身調用。宏的名字可以是任何單個的ASCII字元,以下是sendmail中所有的內部宏: 宏 名 含  義 在sendmail.cf中定義
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  接收者宿主目錄
  以下是在sendmail中定義的內部宏的用法:
宏e
  宏e定義了SMTP數據項信息,例如:
   DeWelcome to mail server.
  當連接到主機的TCP 25埠時就會看到一行歡迎信息。
宏j
  宏j定義了接點的正式域名,例如:
   Dalinuxaid
   DBxiaoniao.cn
   Dj$a.$B
  第一行定義了一個內部宏a,表示接點的主機名是linuxaid,第二行定義了一個用戶宏B,表示接點所在的域,第三行將宏a和宏B的值連接起來得到宏j的值:linuxaid.xiaoniao.cn。
宏l
  宏l定義了From的行格式,例如:
   DlFrom $g $d
  在這個定義中引用了$g和$d兩個內部宏。
宏n
  宏n定義了用於錯誤信息的帳號名,例如:
   DnXIAONIAO
  如果用戶向另一個一個不存在的地址lwang@linuxaid.com.cn發送了一封郵件,就會收到來自XIAONIAO@linuxaid.com.cn的錯誤信息郵件。
宏o
  宏o定義了地址中的操作符集合,例如:
   Do.%\@^=/
  這個宏的定義主要用於重寫郵件地址。
宏q
  宏q定義了默認的發送方地址格式,例如:
   Dq$g$?x($x)$.
  其中$?x為一個條件,判斷宏x是否被賦值,如果是,則解釋宏x的文本,$.表示條件的結束。如宏g的值為lwang@linuxaid.com.cn,宏x的值是xiaoniao則宏q的值為:lwang@linuxaid.com.cn(xiaoniao)。

  命令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  同前綴一起決定郵件優先順序




sendmail的地址重寫規則
  地址重寫是sendmail的核心部分,它的作用是分析來自郵件程序的電子郵件的地址,並將它們重寫成郵件傳輸程序所需要的格式。

.1 規則集
  規則集是一組可以由數字引用的相關重寫規則。Sn命令標誌一個規則集的開始,其中n是這個規則集的編號,其範圍從0~29。其中0~4號規則集是被sendmail直接調用的,它們的說明如下:

編 號 說  明
0  在規則集3之後調用,它將生成一個三元組:<傳輸程序,接收方主機,接 收用戶名>
1  用於消息中所有發送者地址
2  用於消息中所有接收者地址
3  最大和最複雜的規則集,也是用於地址的第一個規則集,將地址轉化成正 規形式,即:local-part@host.domain
4  用於消息中所有地址並將內部地址轉換成外部地址形式

.2 重寫規則
  地址重寫規則由命令R定義,其格式如下:
   Rlhs   rhs   comment
  lhs,rsh和comment這三個欄位之間用tab隔開。重寫規則將輸入地址與lhs進行匹配,如果成功,就按照rhs進行重寫。重寫后的結果再次與lhs匹配,如果成功,就再次按照rhs進行重寫,直到結果不再與rhs匹配。

模式匹配
  重寫規則中的lhs由宏,類,字母和模式匹配符號組成。宏,類和字母提供了與輸入地址進行比較的值,模式匹配符號定義了匹配的規則,以下是所有的模式匹配符號: 模式匹配符號 說      明
$*  匹配0個或多個詞法單位
$+  匹配一個或多個詞法單位
$-  匹配一個詞法單位
$=x  匹配類x中的任何詞法單位
$~x  匹配不在類x中的任何詞法單位
$x  匹配宏x中的所有詞法單位
$%x  匹配宏x中在NIS圖中命名的所有詞法單位
$!x  匹配宏x中不在NIS圖中命名的所有詞法單位
$%y  匹配在NIF hosts.byname圖中的所有詞法單位

  sendmail首先以選項O定義的操作符作為分隔符,將輸入地址分裂成若干個詞法單位,操作符本身也算個詞法單位,然後再根據lhs定義的模式進行匹配。

地址改寫
  如果輸入地址與lhs匹配成功后,就按照rhs定義的改寫規則進行改寫。rhs由字元,宏和地址改寫符號組成,其中字元將被原樣複製到改寫結果中,宏將在展開后複製到改寫結果中,而地址改寫符號定義了一些特殊的改寫行為,以下是sendmail的地址改寫符號及其作用: 符  號 說     明
$n  代替詞法單位$n
$[name$]  將name$代表的主機別名或IP地址替換為正規名
$>n  調用規則集n
$@  終止規則集
$:  終止重寫規則

使用M4
  如果一行一行輸入整個sendmail.cf文件不僅麻煩也容易出錯。最簡單的方法是用M4處理程序自動產生一個sendmail.cf文件。M4是一種宏前置處理器,用來把組態文件轉換成sendmail.cf文件。它的用法很簡單,在/etc下面找到sendmail.mc文件,修改後使用:
   $m4 sendmail.mc>sendmail.cf

  將會生成一個sendmail.cf文件。並自動覆蓋原來的sendmail.cf文件。以下是一個標準的sendmail.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/sendmaiul.cf by running this macro config through the m4
dnl preprocessor;
dnl
dnl m4 /etc/sendmail.mc> /etc/sendmail.cf
dnl
dnl You will need to have the sendmail-cf package installed for this to
dnl work.
include(/usr/lib/sendmail-cf/m4/cf.m4)
define(confDEF_USER_ID,\8:12\)
OSTYPE(linux)
undefine(UUCP_RELAY)
undefine(BITNET_REBUILD)
define(confAUTO_REBUILD)
define(confTO_CONNECT,lm)
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)
FEATURE(virtusertable,hash -o /etc/mail/virtusertable)
FEATURE(redirect)
FEATURE(always_add_domain)
FEATURE(use_cw_file)
FEATURE(local_procmail)
MAILER(procmail)
MAILER(smtp)
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(accetp_unresolvable_domains)
dnl FEATURE(relay_based_on_MX)


  以下是sendmail.mc文件中各個指令的意義:
 divert(-1)  管理輸出字元串      
 dnl  在define后通常會自動產生空格,可以用dnl來刪除
 include  包含一個文件
 define arg 1 arg 2  定義宏argument1設為值argument2
 undifine arg 1  取消arg1的定義
 OSTYPE(Linux)  定義操作系統的類型
 FEATURE  功能選項,對應到/usr/lib/sendmail-cf/feature裡面的 文件名稱所定義者
 MAILER  定義所有必要的郵件遞送代理程序,MTA
 MASQUERADE_AS  用來處理多主機名稱問題

sendmail別名
  別名是sendmail最重要的功能之一。它在aliases中定義。aliases文件的位置由sendmail.cf中的選項A指定,一般位於/etc目錄中。aliases是一個文本文件,其中每一行的格式如下:
   alias:recipeint[,recipeint,...]

  其中alias為郵件中地址的名字,recipient為郵件目的地址的名字。郵件目的地址名可以有很多,每個之間用逗號符隔開。下面介紹別名的幾種主要用法:
  ◆ 保護登陸帳號
    許多網路黑客進攻網路計算機的第一步是獲取目標機上合法用戶的帳號,而電子郵件帳號一般和登陸帳號相同,這就使黑客有機可乘。但是可以用別名來保護合法用戶的帳號。如一位合法用戶的登陸帳號為xiaoniao,而他的電子郵件帳號可以是aaabbb。只要在別名文件中加入「aaabbb:xiaoniao」就可以達到這一目的。
  ◆ 電子郵件轉發
    如果想要將發給xiaoniao用戶的電子郵件自動轉發給root用戶,只需在別名文件中加入「xiaoniao:root」。又如用戶xiaoniao離開這個單位。從安全形度上講應該將他的用戶帳號刪除。但是由於他不可能馬上將新的電子郵件帳號通知所有人,所以希望將他原來的電子郵件帳號保留一段時間。這隻要在別名文件中加入「xiaoniao:新的電子郵件地址」。
  ◆ 郵件列表的實現
    別名最重要的功能就是實現郵件列表。通過它可以實現填寫一個接收者地址而將信發給許多人。例如在主機上設置一個郵件列表xn_group,包括xiaoniao,lyong,twang 和lwang。只需在別名文件中加入:
    xn_group:xiaoniao,lyong,twang,lwang
    owner_xn_group:xiaoniao


  當接收者是xn_group時,信會自動發給xiaoniao,lyong,twang和lwang。當發送郵件給xn_group是如果出錯,將把錯誤信息發給xiaoniao。

用forward轉寄郵件
  普通用戶可以在自己的目錄下增加一個.forward文件,當用戶收到信時,會自動以.forward文件中的地址轉寄出去。

如何處理垃圾郵件


.1 什麼是垃圾郵件
  電子郵件是當今最先進,最快捷的通訊工具之一,隨著她的廣泛使用麻煩也隨之而來。有時候你會莫名其妙的收到一些來路不明的郵件,它們中最多的就是那些令人生厭的廣告。也許有一天,你打開電子郵箱檢查郵件時,會看到有成千封E-mail,那麼恭喜你,你被炸了。只要你上網,這些事就是無法避免的。垃圾郵件的泛濫,佔用了網蟲本來就不大的信箱空間,使得真正有用的郵件要麼因為信箱已滿而進不來,要麼淹沒在一大堆垃圾郵件中。這使得垃圾郵件被選為1998年國際互聯網的十大新聞之一。

.2 減少垃圾郵件的方法
  ◆ 大多數都使用一種叫"bot"的應用程序來搜索Internet上的各個網址、聊天室、網上討論區、新聞組、公共討論區以及其他任何能夠充實他們業已龐大的資料庫的地方。你可以盡量少在這些地方公布你的電子郵件地址。
  ◆ 如果你需要在某初留下你的電子郵件地址,使用特殊的書寫E-mail地址的方法來對抗E-mail地址自動收集機。很多E-mail地址收集機完全依靠關鍵字母「@"來收集信箱,假設你的信箱地址為xiaoniao@linuxaid.com.cn,當你需要在某處留下你的E-mail地址時,如果將你的信箱地址寫成xiaoniao AT linuxaid DOT com DOT cn,自動機就識別不出這是個E-mail地址,而稍具常識的網蟲卻能看懂這個信箱地址。
  ◆ 如果是Unix主機上的sendmail郵件伺服器可以通過以下方法來對抗垃圾郵件:
    只允許指定的主機和域轉發,首先定義一個文本文件sendmail.cR,文件中的每一行是一台主機的完整域名或一個域。按照以下文件修改sendmail.cf,則sendmail只對發送地址或目的地址是本機或sendmail中定義的主機或域進行中轉。


 FR-o/etc/sendmail.cR

 Scheck_rcpt
 #anything terminating locally is ok
 R<$+ @$ =w>    $@ OK
 R<$+ @$ =R>    $@ OK
 R<$+ @$*$ =R>   $@ OK

 #anything originating locally is ok
 R$*     $: $(dequote""$&{client_name}$)
 R$=w        $@ OK  
 R$=R         $@ OK  
 R$* $=R        $@ OK  
 R$=@         $@ OK  

 #anything else is bogus
 R$*     $#error $:"550 Relaying Denied"

.3 清除電子郵件炸彈的方法
  如果哪天你的電子郵箱被炸了,可以用如下方法解救:
  ◆ 打電話向你上網的ISP服務商求助,他們就會幫你清除E-mail Bomb。
  ◆ 用軟體清除。現在有很多軟體可以清楚垃圾郵件,如
Spam Exterminator、SpammerSlammer、SpamKiller、Spam Attack Pro、SpamEater Pro、Bounce Spam Mail


[火星人 ] 全面了解和使用電子郵件伺服器已經有890次圍觀

http://coctec.com/docs/linux/show-post-69839.html