当前位置:Linux教程 - Linux - 全面了解和使用电子邮件服务器

全面了解和使用电子邮件服务器

了解电子邮件
  在世界上,数以百万计的计算机用户已经访问过电子邮件。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] 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发送邮件时,最后只含有一个圆点的行表示结束的缘故。

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指令用来解析地址,将电子邮件的地址分割为基元,并决定基元的种类,如电子邮件地址[email protected]可以分割为:    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
  如果用户向另一个一个不存在的地址[email protected]发送了一封邮件,就会收到来自[email protected]的错误信息邮件。
宏o
  宏o定义了地址中的操作符集合,例如:
   Do.%@^=/
  这个宏的定义主要用于重写邮件地址。
宏q
  宏q定义了默认的发送方地址格式,例如:
   Dq$g$?x($x)$.
  其中$?x为一个条件,判断宏x是否被赋值,如果是,则解释宏x的文本,$.表示条件的结束。如宏g的值为[email protected],宏x的值是xiaoniao则宏q的值为:[email protected](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  最大和最复杂的规则集,也是用于地址的第一个规则集,将地址转化成正 规形式,即:[email protected]
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地址收集机完全依靠关键字母“@""来收集信箱,假设你的信箱地址为[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>    $@ 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