Linux架设E-mail服务器

12/3/2006来源:Qmail人气:7956

一、了解电子邮件

  在世界上,数以百万计的计算机用户已经访问过电子邮件。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 [email protected]linuxaid.com.cn bbow
   alias me gunter
   # group aliases,mailing list
   alias pirates [email protected] bbow
   alias research jones jreynold eackerma
   alias framistan wjones imgood [email protected] 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发送邮件时,最后只含有一个圆点的行表示结束的缘故。

四、sendmail

1.sendmail简介

  Sendmail是由Eric Allman写的程序,后来经过很多人的贡献,才成为现在的版本。目前几乎所有的Unix/Linux系统都使用sendmail。sendmail的功能非常强大,这就使它的配置文件非常复杂,而且它的规则集非常难看懂。下面就详细介绍一下它的各项配置。

2. 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  扩充负载的支持


  命令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  接收者宿主目录


  命令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   同前缀一起决定邮件优先级


3.sendmail的地址重写规则
  
地址重写是sendmail的核心部分,它的作用是分析来自邮件程序的电子邮件的地址,并将它们重写成邮件传输程序所需要的格式。

3.1 规则集
  
规则集是一组可以由数字引用的相关重写规则。Sn命令标志一个规则集的开始,其中n是这个规则集的编号,其范围从0~29。其中0~4号规则集是被sendmail直接调用的,它们的说明如下:
编号 说  明
0   在规则集3之后调用,它将生成一个三元组:<传输程序,接收方主机,接 收用户名>
1   用于消息中所有发送者地址
2   用于消息中所有接收者地址
3   最大和最复杂的规则集,也是用于地址的第一个规则集,将地址转化成正 规形式,即:[email protected]
4   用于消息中所有地址并将内部地址转换成外部地址形式


3.2 重写规则

  地址重写规则由命令R定义,其格式如下:

   Rlhs   rhs   comment

  lhs,rsh和comment这三个字段之间用tab隔开。重写规则将输入地址与lhs进行匹配,如果成功,就按照rhs进行重写。重写后的结果再次与lhs匹配,如果成功,就再次按照rhs进行重写,直到结果不再与rhs匹配。

4.使用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   在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   用来处理多主机名称问题


4.1 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。


五、如何处理垃圾邮件

1.什么是垃圾邮件

  电子邮件是当今最先进,最快捷的通讯工具之一,随着她的广泛使用麻烦也随之而来。有时候你会莫名其妙的收到一些来路不明的邮件,它们中最多的就是那些令人生厌的广告。也许有一天,你打开电子邮箱检查邮件时,会看到有成千封E-mail,那么恭喜你,你被炸了。只要你上网,这些事就是无法避免的。垃圾邮件的泛滥,占用了网虫本来就不大的信箱空间,使得真正有用的邮件要么因为信箱已满而进不来,要么淹没在一大堆垃圾邮件中。这使得垃圾邮件被选为1998年国际互联网的十大新闻之一。

2. 减少垃圾邮件的方法

  ◆ 大多数都使用一种叫"bot"的应用程序来搜索Internet上的各个网址、聊天室、网上讨论区、新闻组、公共讨论区以及其他任何能够充实他们业已庞大的数据库的地方。你可以尽量少在这些地方公布你的电子邮件地址。
  ◆ 如果你需要在某初留下你的电子邮件地址,使用特殊的书写E-mail地址的方法来对抗E-mail地址自动收集机。很多E-mail地址收集机完全依靠关键字母“@"来收集信箱,假设你的信箱地址为[email protected],当你需要在某处留下你的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>    [email protected] OK
 R<$+ @$ =R>    [email protected] OK
 R<$+ @$*$ =R>   [email protected] OK

 #anything originating locally is ok
 R$*     $: $(dequote""$%26amp;{client_name}$)
 R$=w        [email protected] OK  
 R$=R         [email protected] OK  
 R$* $=R        [email protected] OK  
 [email protected]         [email protected] OK  

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


3.清除电子邮件炸弹的方法

  如果哪天你的电子邮箱被炸了,可以用如下方法解救:
  ◆ 打电话向你上网的ISP服务商求助,他们就会帮你清除E-mail Bomb。
  ◆ 用软件清除。现在有很多软件可以清楚垃圾邮件,如Spam xterminator、SpammerSlammer、SpamKiller、Spam Attack Pro、SpamEater Pro、Bounce Spam Mail

,