Linux 版 (精华区)
发信人: don (驿路梨花), 信区: Linux
标 题: 电子邮件概述
发信站: 哈工大紫丁香 (2000年06月09日11:53:22 星期五), 站内信件
电子邮件概述
作者: 何斌武 (hbwork@dlut.edu.cn,大连理工大学网络中心,April 1999.)
感谢我的导师钱飞教授(http://come.or.jp/~fei/)多年来对大工校园网建设的无私帮
助及对我的热心指导,在他的帮助下,大工校园网建设取得了一定的成绩,我也从他那
学
到了很多,不仅是专业方面的知识,更多的是如何待人,如何作人。
----------------------------------------------------------------------------
----
电子邮件管理
电子邮件是系统管理中最复杂的一项任务,但也是最为重要的一项任务,因为用户使用
较多,作何一个改动都会对所有用户带来影响。同时大多数用户认为电子邮件是UNIX中
最有
价值的服务,尤其是在与Internet相连的系统上,电子邮件更为重要。
本文主要介绍如下内容:电子邮件是如何工作的,电子邮件相关术语,从何处得到更多
的信息,最后给出配置sendmail的实例。
本文不介绍过于复杂的邮件配置如多协议MAIL HUB(将邮件从Internet上转发给UUCP或
DecNET)等。
一、电子邮件概述
1. Email环境的关键 -- sendmail
说明:
本部分内容摘自我的导师钱飞教授大规模计算机网络主要服务之管理方法中之电子邮件
环境的生成方法。
用户在实际利用Email时, 所要用到的命令一般为mail命令,或一些其他专用命 令.这些
直接与用户有关的,用于收发Mail的命令,或程序一般统称为MUA(Mail User Agent).通
常,MUA的使用程序有恨多.例如,MH,MNEWS,ELM等等.
相对于此,将来自MUA的信件转发给指定的用户的程序一般被称之为 MTA (Mail
Transfer Agent). 在UNIX系统上,最著名的MTA既是sendamil程序.sendmail是美国 加
州大学勃克利分校以Allman先生为中心的研究组所开发研制的优秀无偿软件.
sendmail(/usr/lib/sendmail)从各种MUA程序接收信件后, 按照自身的控制格 式文件
(/etc/sendmail.cf)中所描述的规则向外界转发信件. 因此,Email环境的成 败将取决
于sendmail.cf的设定是否合适.
MUA MTA
+---------------+
| /bin/mail |--->|
+---------------+ |
+---------------+ s +----------------------+
| /usr/ucb/mail |--->e ---->| /var/spool/mail/$usr |
+---------------+ n +----------------------
+---------------+ d +----------------------+
| MH |--->m ---->| /usr/bin/uux |
+---------------+ a +----------------------+
+---------------+ i +----------------------+
| mnews |--->l ---->| workstation |
+---------------+ | smtp +----------------------+
+---------------+ |
| elm |--->|
+---------------+
(图1. Email系统的基本结构)
图1中给出了Email系统的基本结构图. Email系统看上去非常简单,实际上却非 常复杂.
首先,用户需要利用mail等MUA程序编辑并发出信件. mail命令将为用户所编辑 的信件
追加一些相应的信息(mail head,称之为信件头),然后将该信件转交给sendm ail程序处
理.sendmail对信件头进行解析,调查该信件之转发方法及信件接收地址.
如果信件接收地址为本地计算机之用户地址,则将该信件追加到/var/spool/ma il目录
下之相应用户(与用户名同名)文件中. 如果件接收地址为UUCP线路之另一侧 之用户地
址,则起动/usr/bin/uux经由UUCP转发信件. 如果线路为TCP/IP线路,则利 用SMTP协议
与sendmail进行通信转发信件.
2. Email环境的设计
在设计Email环境时,一般应遵循以下规则.
(1)Email服务器的集中
在多机网络环境中应注意Email环境的统一配置,同一组织内的Email服务器不宜 过多.
否则,将增加管理负荷.
(2)共享信件缓冲池时,需要考虑资源竞争问题
在小规模网络中,为了实现Email之共享环境, 管理人员一般利用NFS将各台UNIX 工作站
之信件缓冲池(/var/spool/mail)mount到Email服务器上.这时,需要注意 的是,信件系
统是一种典型的分布处理环境, 对于共享文件如果文件自琐(lock) 问题处理不够得当,
有时将会引起重大事故(轻则丢失信件,重则损坏整个硬盘系 统).
(3)统一信件代码
在传统的UUCP中继网络上,网络上各个主要Email中继站上一般采用"7位通"(7位 代码)
之传递方式. 因此,要透过广域网传递多字节文字(中日文等)信件时,必须 进行适当的
代码转换.在日本,网络上的省缺规定为7位JIS代码. 这就是说,用户 利用MUA发送信件
时,必须将信件文本转换成JIS代码文本,或利用专用JIS代码视 窗,或编辑器来直接编辑
JIS码文件.
近年来,随着广域网技术之发展,sendmail(V8)等MTA之改进,在点对点(point to point)
之TCP/IP线路上已经可以实现直接"8位通"之信件传递. 笔者在日常工作 中也常常与中
国国内网友直接交换GB代码信件.但是,需要注意的是,在一些站点 上,由于MTA版本过于
陈旧, 经由这些站点转发的8位码会被自动过滤成7位码(丢 掉高位码),造成乱码.因此,
这时,有必要确认接收侧之MTA版本.可以相信在不远 的将来,广域网上之工作站都将陆
续切换成新的MTA(sendmail V8以上).
(4)不断更新sendmail版本
sendmail作为无偿软件尚在不断地进行着本本更新,以排除安全性问题.众所周 知,利用
sendmail所存在着的一些漏洞来进行网络非法侵入的hacking活动仍很盛行. 为了保护
您的系统避免外侵,建议各个网络管理者跟踪sendmail之版本,尽可能地采 用最新版.目
前的最新版本为sendmail.8.9.3.tar.gz.
(5)确定自己的邮件地址表现
各入网单位必须采用INTERNIC所指定的正式域名. 然后根据自己所在域来确定 邮件地
址形式.
(6)确定线路类型
电子邮件系统的虚拟配信线路大致有以下4种.
a.机内直接配信
本地邮件传送方式.本地计算机内的用户向本地其他用户传递信件.
b.UUCP线路配信
经由UUCP线路向其他计算机上的用户传递信件.
c.SMTP配信
利用SMTP协议经由TCP/IP线路向其他计算机上的用户传递信件.
d.域名服务器下SMTP配信
发送信件时用域名服务器来查寻收方地址,利用域名服务器所提示的MX记录 来确定
接收侧地址, 然后用SMTP(或ESMTP)协议经由TCP/IP线路向其他计算 机上的用户传
递信件.
二、电子邮件系统相关术语
电子邮件是从MUA(Mail User Agent)如mailx/Netscape Mail/Eudora开始的,在写
完信件之后MUA把信件转发给邮件路由如sendmail, 邮件路由然后将信息发送给MTA(Mai
l
Trasfer Agent);然后此信件通过多个主机或网络到达最终的投递代理,由投递代理将
邮件信息追加到接收者的邮箱文件中。
MUA:邮件阅读或发送程序,如SVR4 mailx,elm, pine, 在邮件系统中用户只于MUA
打交道,MUA将邮件系统的复杂性与用户隔离开。
Mail Router: 程序,从用户处接收邮件并决定其目的地址以及如何到达目的地。
比如根据接收者的地址不同,电子邮件可能通过TCP/IP网络发送,或者通过
UUCP或FAX发送。邮件路由使用接收者地址及其内部的配置信息来选择一个最
好的MTA,然后将邮信件转给此MTA。
MTA(Mail Transport agent): 一个专用程序,其作用类似于邮局,用于在两个机器
之间发送邮件。通常,一个机器上只有一个MTA。sendmail程序就是一个MTA,此
外还有其他MTA,如MMDF,Smail 3.x, qmail以及zmailer等。
MTA能够理解特定网络的EMAIL协议并通过网络传输信件,如UUCP可通过UUCP连接
发送信件,但无法处理SMTP信件。
Delivery Agent(投递代理):sendmail自己并不完成最终的邮件发送,它要调作其他
的程序来完成最后的投递服务。在SVR4系统中一般是/bin/mail.
实际情况是MTA,MUA以及Mail Router之间的区别往往比较模糊,如sendmail是一个
主要的Mail Router, 但同时又可以作为MTA,因为sendmail含有SMTP功能,可以在TCP/
IP
网络上传送邮件,而在邮件接收端同样也是由sendmail来完成最终邮件发送之前的准备
工
作;此外一些MUA自带一定的邮件路由功能,如Netscape Mail可以进行SMTP对话, 因此
可
以实现对SMTP电子邮件的发送。
1、不同的MUA
mail: 用户邮件目录 /var/spool/mail/$USER, 变量: $MAIL
用户转发文件 $HOME/.forward
elm: 菜单驱动
pine: 字符界面的全屏幕操作MUA,应用较为广泛,功能较elm强大。
Netscape Mail
Microsoft Outlook Express
2. 背景资料及其它相关资源
RFC 821 STMP
RFC 822 EMAIL格式规范
RFC 1425 ESMTP
RFC 1123 对主机的要求及对前面的RFC的一些修改
sendmail文档
SIOG: Sendmail Installation and Operation Guide
建议仔细阅读,重要指南
Sendmail: An Internet Mail Router
Mail System and Address in 4.2BSD
以上文档sendmail源代码包中自带,由sendmail作者Eric Allmen编写。
Sendmail, Second Edition, O'Reilly
By Bryan Costales with Eric Allman
UNIX Unleashed, System Administrator Edition,
Chapter 24: Mail Administratin
http://www.sendmail.org/
Sendmail FAQ
3. Internet的邮件协议
为了解sendmail所完成的不同工作,需要了解一些Internet协议,协议是软件及硬件
进行通讯时所要遵守的标准.
一般来说协议是分层的,上一层协议使用底层协议作为基础,如ip协议不需要进行
端到端的连接即可以进行数据传送,而smtp或其他高层协议则要进行端到端的连接,
tcp建立在ip层之上,向telnet及smtp等提供面向连接的服务.总的来说,TCP/IP提供
Internet上的基本网络服务,ftp/smtp各种应用层协议则是建立在TCP/IP基础上的.分
层带来的好处是诸如smtp/ftp高层应用程序无需处理数据包的传输与其他主机的连接
等底层任务,它们只需使用TCP/IP所提供的相应服务.
smtp定义如何在Internet上交换email信息,对于smtp来说,只要两端的程序(smtp
Server)能够正常完成SMTP功能,就可以进行邮件交换,而不论服务器的软硬件环境是否
相同.
sendmail完成smtp任务示例:
[hbwork@helius mirror]$ /usr/sbin/sendmail -v hbwork@dlut.edu.cn <
../.pinerc
hbwork@dlut.edu.cn... Connecting to gingko.dlut.edu.cn. via esmtp...
220 gingko.dlut.edu.cn ESMTP Sendmail 8.9.3/8.9.3; Thu, 10 Jun 1999
10:34:48 +09
00 (CDT)
>>> EHLO helius.dlut.edu.cn
250-gingko.dlut.edu.cn Hello helius.dlut.edu.cn [202.118.66.81], pleased
to meet
you
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ONEX
250-ETRN
250-XUSR
250 HELP
>>> MAIL From: SIZE=11795
250 ... Sender ok
>>> RCPT To:
250 ... Recipient ok
>>> DATA
354 Enter mail, end with "." on a line by itself
>>> .
250 KAA13174 Message accepted for delivery
hbwork@dlut.edu.cn... Sent (KAA13174 Message accepted for delivery)
Closing connection to gingko.dlut.edu.cn.
>>> QUIT
221 gingko.dlut.edu.cn closing connection
了解SMTP协议之实现, 请参考RFC 821.
三. DNS与Email之关系
1. 概述
计算机之间通讯使用IP地址,而用户为了使用方便通常使用主机名,DNS则提供
主机名与IP之间的相互解释及其他重要信息.
DNS: 分布式管理系统,将主机的命名及编号分发给各个自治区,如dlut.edu.cn
域只负责维护自己域内的所有主机的信息,当hosta.dlut.edu.cn要向
hostb.dlut.edu.cn发信或telnet时,只需查询大工的dns服务器,dns服务器会将
hostb.dlut.edu.cn的ip地址返回给主机hosta,并且由于edu.cn已经将dlut.edu.cn
域的管理授权给大工,大工的dns服务器为dlut.edu.cn之授权服务器,因此它可以回答
所有关于dlut.edu.cn域的dns查询,而不管查询请求来自本域还是域外的主机.
当两个域之间的主机发送电子邮件时情况如何呢? 比gingko.dlut.edu.cn上的
一个用户向user@pub.dl.lnpta.net.cn发送邮件,大工的dns服务器对域
dl.lnpta.net.cn没有任何了解,但它知道如何找到答案. 当域名服务器收到对非本域
内主机的请求时,将会向根域名服务器(root domain nameserver)请求对应域的授权
服务器的ip地址,如:
cn:
cn nameserver = NS.UU.NET
cn nameserver = IRAUN1.IRA.UKA.DE
cn nameserver = NS.EU.NET
cn nameserver = NS.SESQUI.NET
cn nameserver = NS.CNC.AC.cn
cn nameserver = DNS.EDU.cn
cn nameserver = NS.CN.NET
Authoritative answers can be found from:
NS.UU.NET internet address = 137.39.1.3
IRAUN1.IRA.UKA.DE internet address = 129.13.10.90
NS.EU.NET internet address = 192.16.202.11
NS.SESQUI.NET internet address = 128.241.0.84
NS.CNC.AC.cn internet address = 159.226.1.1
DNS.EDU.cn internet address = 202.112.0.35
NS.CN.NET internet address = 202.97.16.195
net.cn:
Server: helius.dlut.edu.cn
Address: 202.118.66.81
Non-authoritative answer:
net.cn nameserver = ns.cnc.ac.cn
net.cn nameserver = ns.cn.net
net.cn nameserver = ns.bta.net.cn
Authoritative answers can be found from:
ns.cnc.ac.cn internet address = 159.226.1.1
ns.cn.net internet address = 202.97.16.195
ns.bta.net.cn internet address = 202.96.0.133
lnpta.net.cn:
Non-authoritative answer:
lnpta.net.cn nameserver = ns.dcb.ln.cn
lnpta.net.cn nameserver = ns.lnsyptt.net.cn
Authoritative answers can be found from:
ns.dcb.ln.cn internet address = 202.96.75.68
ns.lnsyptt.net.cn internet address = 202.96.64.68
dl.lnpta.net.cn:
dl.lnpta.net.cn nameserver = ns.lnpta.net.cn
ns.lnpta.net.cn internet address = 202.96.64.68
pub.dl.lnpta.net.cn
Name: pub.dl.lnpta.net.cn
Address: 202.96.69.81
由上可以看出,dns是一个大的,分布式的数据库;此数据库含有主机到ip的映
射关系,此外DNS还含有其他信息,当sendmail发送邮件时,必须将接收者的主机名
翻译为IP地址,这个由DNS中的A记录实现,A记录是关于主机的最基础数据;每二个
主机信息则是MX记录, MX记录指出愿意为相应主机接收邮件的一个或多个邮件主
机列表.
2.邮件交换(MX, Mail Exchange)记录
MX记录的意义及用处是什么?主机处理自己的邮件其不足是什么?没有mx记录
岂不是更简单一些? 事实刚好相反, 虽然邮件管理员的日常工作相当复杂,当MX
记录可提供如下功能, 从而将邮件管理的工作简单化:
. 对于未连接Internet的主机(如UUCP Only Host)可以指明一个Internet主机
为其接收邮件,如同具有一个Internet地址一样. 如主机hosta.dlut.edu.cn
与cerius.dlut.edu.cn具有uucp连接,如果后者被定义为前者的MX, 则其他
Internet主机仍可向hosta.dlut.edu.cn发信,当ceruis.dlut.edu.cn收到对
hosta.dlut.edu.cn的信件时,会保持到与hosta建立连接,然后通过UUCP将信
件转发给hosta.
. 如UNIX主机pcsvr.dlut.edu.cn是一组PC的文件服务器,pc上有集成了SMTP客
户端的MUA, 可以向外发信,但不能收信.如果此时发出的信件中的回信地址是
user@pc1.dlut.edu.cn,接收者如何回信? 这时可以将pcsvr.dlut.edu.cn作为
这些PC的MX.
. 主机因为各种原因而不能正常连接到网络上,比如光缆损坏,当主机与Internet
的连接断开后,网络上其他主机到此主机的邮件将存在邮件队列中,如果指定时
时间内邮件未能发送,则邮件信息将返回给发送者. 此时如果设置一个MX主机
作为中间环节,MX主机将暂时接收对此主机的邮件,并在相应主机恢复正常之后
将重新发送到你的主机, 这些MX主机可以在你的网域内或域外,或二者均有,当
然后者要更好一些,因为当你的主干网(WAN)损坏之后域内的主机均不能正常工作.
. MX记录隐藏了一部分的细节信息,允许以更为灵活的方式重新配置你的本地网.
如所有的人均知道我的邮件地址为hbwork@dlut.edu.cn, 不论那一台机器接收
对域dlut.edu.cn的信件都是一样的,即使更改为主机名也无所谓;发信者感觉
不到有任何区别.
. 邮件发送及MX记录
当一个SMTP Client向主机发送信件时,需要作的工作不仅是将主机名翻译为ip
地址,它首先要查看相目标主机有无MX记录,如果有MX记录的话,将根据记录中所
给出的权值对其进行排序,比如dns记录如下:
dlut.edu.cn. IN MX 0 gingko.dlut.edu.cn.
IN MX 10 hazel.dlut.edu.cn.
IN MX 20 saint.synet.edu.cn.
SMTP Client先试权值较小者,如果失败再试同网域内的备份MX,不行再试域外的
备份MX主机,这种设置能够保证EMAIL正常运转,即使外界连接不正常.
在收集并对MX记录排序之后,SMTP Client将取得MX记录的IP地址,并按其优先级高
低进行邮件发送,这一点必须记住! 因为对于user@domain.com来说,并不意味着有
一台主机domain.com,即使有也不一定是接收邮件的主机.
3. sendmail如何利用DNS
Sendmail如通过以下4个方面使用DNS
. 启动时sendmail要通过dns来得到本地的正式主机名,然后将此值赋值给宏$j(The
canonical hostname),如果dns还返回了其他名字,则这些别名将赋值给类(class)
$=w(sendmail所有版本均支持此类,list of our other names).
. 当另外一台主机连接到本机传输邮件时,本机的sendmail将通过DNS查询对方主机
的正式名称(FQDN).
. 当通过网络发送SMTP邮件时,sendmail通过DNS查询目标主机的主机地址(也可能是
多个地址).
. 当sendmail对每个规则RHS(右边的规则)的$[和$]进行扩展时,需要查询$[和$]之间
的主机名或IP地址.
(1)取得本地主机的正式名称(FQDN)
所有版本的sendmail取得本地主机的正式名称所采用的方法基本相同,首先是调作
gethostname(3)取得本地主机名,其返回值根据在/etc/hosts中的每一项是FQDN
还是短主机名而返回相应值.如果gethostname(3)调作失败, 则本地主机名设置
为localhost; 然后再调用gethostbyname(3)以获得本地主机的正式名称以及别名.
如果机器上没有Bind Library, 或者暂时无法编译或安装新版本的sendmail,可以
修改sendmail.cf文件定义变量$j
Dmyour.domain.com
Dj$w.$m
(2)查询远程主机名
当sendmail开始作为daemon运行时,sendmail创建一个 ,并将自己bind到此socket上,
监听进入的SMTP连接,当远程主机连接到本地主机时,sendmail再使用accept(2)库
程序来接收连接. accept过程向sendmail提供远程主机的IP地址,sendmail然后通过
gethostbyaddr(2)将IP地址转化为对方的正式主机名.
由于如下原因,sendmail需要知道对方主机的正式名称:
. 将远程主机名与本地主机名进行比较,以防止sendmaill连接到自己
. 在 HELP SMTP行中远程主机所宣称的主机名要与查询得到的主机名相比较,如果二
者不同可以采取一定的处理,如拒收对方的邮件,这样可以防止邮件炸弹.
. 将此值赋值给宏$s(Send host's name)
. 在很多log信息中(由loglevel(L)选项确定)及Received:头中要包括有关远程主机
的信息.
(3) 查询目标地址
当sendmail准备连接到远程主机进行邮件传送时,它首先要进行一系列的检查,所检查
的项目因版本不同而有所差别.
从sendmail 8.1开始, sendmail检查地址中的主机部分是否包括了方括号,如果有方
括号将忽略MX记录的查询.
从v8.8开始, sendmail首先检查所选定的发送代理是否设置了F=0标志,如果设置了
此标志,则忽略对MX记录的查询.
通常F=0用于Null Client配置,如下mc示例:
define('SMTP_MAILER_FLAGS','0')
FEATURE('nullclient','mail.dlut.edu.cn');
如果sendmail被允许进行MX查找(由sendmail.cf确定), 则sendmail使用res_search()
bind库查找所对应的MX记录,对这些MX记录进行排队,并选择值最小的主机,如果V8找到
两个同值的MX记录,在排队时会进行随机排序. 在找到所有的MX记录或根本没有MX记录
时,sendmail加入由FullBackMxHost(v)所指定的主机.
然后sendmail会依次向MX主机表中的每个主机发送信息,一次一个主机,直到有一个成
功或全部失败. 从sendmail V8.8开始,当此列表中的任一个主机返回5xx STMP代码(永
久性错误), sendmail会对其进行特殊处理.
如果未找到MX记录,则sendmail向指定的主机发送信息,如果均失败,sendmail会试
图向FallBackMxHost选项中所指定的主机发送信息.
不管有无MX记录,sendmail通过gethostbyname(2)得到相应主机的网络地址.
(4)设置MX记录
MX记录只是DNS中将一个主机的邮件转到另外其他机器上的一种方法,具体各项含义请
参考DNS配置部分,其一般形式如下:
hostA IN MX 10 hostB
或:
hostA IN MX 10 hostA
IN MX 20 hostB
应该说明的是后者中的第一条记录并非多余,这种设置方法有其特定的作用.
记录MX记录所应注意的问题:
. MX记录必须指向一个A(地址)记录
hostA IN MX 10 hostB ; 错误设置!
IN MX 20 hostC
hostB IN MX 10 hostC
hostC IN A 1.2.3.4
. MX记录指向CNAME记录会引起额外的dns查找
hostA IN MX 0 mailHub
mailHub IN CNAME nfsmast
nfsmast IN CNAME hostB
hostB IN A 123.45.67.89
. MX记录是非递归的
hostA IN MX 0 hostB
hostB IN MX 0 hostB
IN MX 10 hostC
如上示例中如hostA/hostB全部down掉时,hostA的信件不会发送到hostC上去,
否则会引起MX记录的循环,如上面的配置加上 hostC IN MX 10 hostA.
因此如果hostC作HostA和HostB的MX,可配置dns如下:
hostA IN MX 0 hostB
IN MX 10 HostC
hostB IN MX 0 HostB
IN MX 10 HostC
. 广义符MX记录
*.dom.com. IN MX 10 hostA
不建议使用,因为容易引起混乱:
;domain is domain.com
*.domain.com. IN MX 10 hostB
hostA IN MX 10 hostC
hostC IN A 123.45.67.89
在Internet上广义符MX记录基本上没有任何作用.
(5) MX记录之缓存作用
虽然并不要求所有的主机均需要指定MX记录,但最好对每个主机指定一个MX记录。
假设有下面这样一个DNS记录(只有A记录):
HostA IN A 123.45.67.89
当sendmail第一次查找此主机时,它将会查询本地的DNS服务器以得到HostA的所
有记录,由于只有一个A记录,sendmail只得到HostA的主机地址。
但是应该知道的是请求所有的记录会使本地DNS服务器将这些信息cache起来,当
下一次sendmail查询同一主机时,DNS将从其cache中返回一个A记录,这要比重新查找
快并且能够减少Internet上的网络流量。这个cache信息是一个非权威(noauthoritativ
e)
数据,因为它只是一个拷贝,并且不包含任何MX记录。
当sendmail接收到一个没有MX记录的非权威数据时,sendmail会强制进行一次DNS
查找,这次它指定查找MX记录,此时仍然没有MX记录,因此sendmail也得不到相应的
MX记录。
由于HostA没有MX记录,每当向此主机发送信件时都需要进行一次DNS查找,如果
HostA是一个邮件任务非常繁忙的邮件主机,由于没有DNS数据中的MX记录,在Internet
上会导致很多sendmail因为请求这种无意义的MX查询而浪费很多带宽。
因此强烈建议对于Internet上的每个邮件主机(最好所有主机)至少有一个MX记录,
这时你可以将MX记录指向主机本身,如:
HostA IN A 123.45.67.89
IN MX 0 HostA
上面的配置不会影响HostA的邮件接收,但可以减少DNS的查询数量。
(6)含糊的MX记录(RFC974)
对于如下DNS配置:
foo IN MX 10 HostA
IN MX 20 HostB
IN MX 30 HostC
如果主机B向foo发信时,将会丢弃DNS记录中所有权值等于或大于自身权值的MX记录,
也就是说信件将发信较HostB的权值小的主机, 这样可以防止HostB错误的将信件发送
给自己。
可以配置HostB将foo作为本地主机的一个别名,但这种配置会导致HostB对foo将不
作任何MX记录的查找,因为它认为到foo的邮件是本地邮件。
问题是如果HostB的配置认为foo为非本地邮件时,如果存在如下DNS配置:
;<- no HostA
IN MX 20 HostB ;<- Mail from HostB to foo
IN MX 30 HostC
按照RFC974的解释,这时将会出现问题,因为没有MX记录,sendmail对此可以使用
选项TryNullMXList(w)进行控制(具体说明略).
4. 邮件头地址(Head Address)和信封(envelope)地址
二者的区分相当重要,因为Mail Router对其处理不同,这与邮局对普通信件的处
理很相似,邮局只关心信封上的地址,而不管信封内复印件中的标头地址。
在这一点上SMTP Client与邮局工作极为相似。示例如下:
To: betty@gznet.edu.cn, webmaster@sun.com
发信时只复制一个地址到信封,而不是二者均复制;否则会造成重复发送
(gznet.edu.cn会发送一份到sun.com).
解决方法:
在邮件信封中只列出一个主机的接收者地址,如同邮局寄信一样,一封信可以寄
给一个办公室的两个人,但接收者收到的邮件头中会列出所有收信人的地址,但MTA
不对其作任何处理。
此外邮件别名的使用也是影响对两个地址分别处理的一个原因,假如aliasuser含有
4个用户: user1, user2,user3,user4, 向aliasuser发信时sendmail会将此别名进行展
开,并建立一个包含所有接收者的信封。根据这些名字是否还是别名或者是否有可能在
其他主机上,原始信息可能展开为4个不同的信封并发往4个不同的主机,而每个信封只
含有接收者名字,但原始信息将没有任何变化,含有aliasuser(当然,为了能够正确回
信,邮件地址改为aliasuser@your.dost.domain)。
下面的一个示例将以另一种方式显示信封地址可能与信件头地址不同,sendmail
允许你在命令行上指定接收者地址,假设有如下信息内容:
$cat letter
To: null recipient <>
Subject: Head and Envelope address
Testing
通过如下命令发送此邮件(请使用自己的真实login).
$sendmail hbwork < letter
这时虽然在邮件头中没有收信人地址,但你同样可以收到信件,因为在信封上含有
你的地址,除非你使用了-t标志,sendmail将用你在命令行上指定的地址构造信封。
信封地址与邮件头地址不一定要完全一样。
四. sendmail所完成的工作
为了更好地理解如何设置sendmail, 需要搞清楚sendmail所完成的各种任务,以
及sendmail是如何与其他MUA一起协调工作的.(MUA,MTA,Mail Router, Delivery Agent
,
SMTP Client, SMTP Server). sendmail可以作为一个Mail Router, SMTP Client以及
SMPT Server, 但并不完成最后的邮件发送.
1. sendmail作为邮件路由(Mail Router)
首先, sendmail是一个Mail Router, 完成邮件收集,检查收信人地址,并确定发送的
最佳方式. sendmail是通过如下方式完成这一工作的:
sendmail自身可以得到一些它所需要的信息,比如当前时间以及它所运行的主机名,
但大多数信息则需要由管理员提供;这些信息主要是通过其配置文件sendmail.cf文件
提供. sendmail.cf文件的使用使得对sendmail的配置极为灵活,同时也具有了相当强
大的功能,但sendmail.cf文件对于大多数用户而言相当难懂, 格式及其复杂.此文件
描述了如何对各种邮件进行处理, 从sendmail v8开始,其源代码发行中包含了一些
低层的模块化配置文件,用户可以通过这些模块化的配置文件较为方便的定制自己的
sendmail.cf.
大多数情况下可以利用sendmail所提供的模块化配置很容易地建立自己的配置
文件; 同时sendmail.cf也提供了很多示例文件,在进行sendmail配置时完全可以在
这些示例文件的基础上完成.
对于绝大多数管理员而言,从头开始写自己的sendmail.cf文件是几乎不可能实现也
是一件非常可怕的任务,应尽可能避免这种情况.
2. sendmail作为MTA - 客户端(发送者)和服务器(接收者)
邮于sendmail能够处理SMTP(V8同时可以处理ESMTP),因此它可以作为MTA. 由于SMTP
是一个面向连接的协议,因此总是由客户端和服务器组成(与就是一个发送者和一个接收
者). SMTP Client向SMTP Server发送邮件,SMTP Server不断地监听相应主机的SMTP
端口. sendmail可以作为SMTP Client和SMTP Server,当作为MUA运行时, sendmail
成为一个SMPT Client, 可以和SMTP Server(运行的不一定是sendmail)进行SMTP对话.
当系统启动时sendmail以守护进程启动,保持连续运行,监听SMTP端口以接收进行
的邮件,这时sendmail成为SMTP Server.
3.sendmail不是最终的发送代理
sendmail并不完成最终的投递工作, sendmail会很聪明地将这些任务留给其他程序
去完成.作为一个庞大而又复杂的程序,为了完成对所有用户的邮件发送,sendmail通常
需要以root身份运行,在一定程度上这会给系统的安全带来威胁(事实上sendmail过去
一直存在安全方面的问题),如果最后的邮件发送也由sendmail完成的话,将会额外增加
sendmail的复杂性及安全问题.
五. sendmail的其他辅助文件
sendmail依靠多个辅助文件来完成其工作,最重要的是配置文件sendmail.cf和别名
文件aliases; 统计文件sendmail.st可有可无, 当然这取决于你是否需要这些统计资料
;
sendmail.hf是SMTP帮助文件,当sendmail作为SMTP Server时需要这个文件(大多数站点
也确实是这样作的).当然此外还有其他一些辅助文件,具体请参考SIOG.下面我们对别名
文件和sendmail.cf文件进行讨论.
1. 别名文件
sendmail在进行邮件发送之前首先检查接收者地址是否为别名,如每个Internet站点
应该有一个邮件管理员postmaster,以方便在邮件故障时与其联系,但实际上大多数站点
上并没有postmaster这个用户帐号,而是将postmaster的信件转给邮件管理员个人,比如
albin与hbwork两个个负责管理Email,则在别名文件中应含有如下一行:
postmaster: albin,hbwork
事实上别名文件可以嵌套,sendmail在进行别名替换时会重复处理直到找到最后的接
收者.
在别名文件中,左边必须是本地上的邮件别名,因此不能使用@主机,只能列出帐号,
右边则可以使用完全的邮件地址.
此外邮件别名文件中可以包含另外一个文件,如:
alises::include:/etc/mail/filealiases
文件/etc/mail/filealiases中每行为一个邮件地址. 通常文件用于保存经常变化
的邮件列表用户,可者是其他管理所管理的帐号.
其他两种邮件别名记录:
使用管道将邮件转到其他程序处理:
list-request:|/usr/local/bin/auto_reply
转到其他文件:
nobody: /dev/null
相关命令:
更改别名文件后使用newaliases或sendmail -bi建立邮件别名文件的二进制数
据文件.
2. 本地主机名文件
定义类$w,即本主机所要接收邮件的主机名列表,如希望邮件服务器接收如下形式的
邮件:user@hosta.dlut.edu.cn, user@dlut.edu.cn, user@dlrin.edu.cn, 则类$w应该
包包含hosta.dlut.edu.cn, dlut.edu.cn, dlrin.edu.cn, 通常此文件名为
sendmail.cw,可通过如下查找:
$egrep "^Fw" sendmail.cf
Fw/etc/mail/sendmail.cw
如上所述情况的sendmail.cw文件内容如下(每行一个记录):
hosta.dlut.edu.cn
dlut.edu.cn
dlrin.edu.cn
3. 邮件服务器允许中断的域或主机(hosts that will permit relaying).
从sendmail 8.9开始加强了对出件中继的控制,默认情况下不对第三方进行邮件转发,
需要指定服务器所接受的客户端(PC?)域名或ip地址,以允许本网内的其他用户通过此
邮件服务器向外发信.
$egrep "^FR" /etc/mail/sendmail.cf
FR-o /etc/mail/relay-domains
此文件内容为邮件服务器同意对其进行邮件转发的主机地址或域名,如同一局域网内
的用户或同网域内的用户通过此邮件服务器向外发信(Netscape Mail/Microsoft Outlo
ok
Express 配置中的SMTP Server), 则在此文件中应该加入本网络用户的域名或IP地址,
如:
dlut.edu.cn
202.118.66
具体说明请参考sendmail SIOG.
4.常用文件及目录属性
从sendmail 8.9以后对目录的权限检查更为严格,下面是常见目录的属性:
路径 类型 Owner Group Mode
/ 目录 root root 0755
/etc 目录 root root 0755
/etc/mail 目录 root root 0755
/etc/mail/sendmail.cf 文件 root root 0644 or 0640
OS/etc/mail/sendmail.st 文件 root root 0644
OH/etc/sendmail.hf 文件 root root 0444
OA/etc/mail/aliases 文件 root root 0644
/etc/mail/aliases.* 文件 root root 0644
F/path 目录 root root 0755
F/path/file 文件 n/a n/a 0444 or 0644
/var 目录 root root 0755
/var/spool 目录 root root 0755
OQ/var/spool/mqueue 目录 root root 0700
:include:/path 目录 root root 0755
:include:/path/list 文件 n/a n/a 0644
made by pageshop of CERNET network centre of DaLian region.copyright 1999
--
一条驿路,一种氛围。
一朵梨花,一种思考。
希望能在Linux这条驿路上与你同行!
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.63]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:203.532毫秒