分类: LINUX
2008-05-04 23:46:37
Internet E-mail的历史可以追溯到20世纪70年代早期,当第一段信息流过Arpanet(今天Internet的前身)时,E-mail就成为Internet上最广泛的应用程序,并持续到今天。以前的电子邮件传递程序相当简单,通常只是将邮件文件从一部大主机搬移到另一部服务很多用户的大主机上而已。随着Internet的改进,网络本身变得越来越复杂,邮件系统需要更有兼容性的工具才能在不同的网络之间,甚至在不同类型的网络之间传递邮件。80年代早期出现的Sendmail就是为了应付各种不同邮件系统而设计的,它很快成为Internet上最重要的邮差。
当你寄信时,信件是交给邮局处理。同理,当你要求MUA(Mail User Agent,邮件用户代理)送出一封邮件,它只是将该邮件交给一台运行MTA(Mail Transfer Agent,邮件传输代理)软件(例如:Sendmail)的服务器。MTA的任务是接受MUA的委任,将E-mail从一个系统递送到另一个系统,并手下远方MTA送来的邮件。每当MTA收到MUA的寄信请求,它会先判断是否应该受理。通常,如果邮件是来自本地系统的用户,或是本地网络上的系统,或是任何特许可以通过它转发(Relay)邮件到其他目的地的网络,MTA都会受理寄信请求。另一方面,MTA也会依据“收件人”来决定是否收下邮件。如果收件人是本地系统的用户,或是收件人位于它知道如何转递(forword)的其他系统,MTA就会收下信息。
MTA收下邮件之后,它必须决定下一步做什么。它有可能将邮件递送给自己系统上的用户,也有可能将邮件交给另一个MTA来继续传递。对于要交给其他网络的邮件,有可能会经过多个MTA接力传递。如果MTA无法递送信息,也无法转交给其他MTA处理,则退信给原发信者,或是发出通知函给系统管理员。一般,个人的MTA server通常是由ISP托管;公司员工的,则可能由企业的信息系统部门管理。
邮件终点站的MTA,在发现收件人是本地系统的用户之后,必须将邮件交给MDA(Mail Delivery Agent,邮件投递代理)。MDA可能将信息存放在普通文件夹内,也可能存入专门存储电子邮件的特殊数据库。不管是哪一种形式,任何用来长期保存邮件的机制,我们一律统称为邮箱(message storage),或俗称“信箱”。
邮件被存入邮箱后,它就待在那里,等待收件人将它收走。收件人使用MUA来取信、读信。提供邮箱访问服务的服务器软件,并非当初收下信息的MTA,两者的角色是分离的。MUA必须让用户成功通过身份验证,才可取走邮箱里的邮件,呈现给用户阅读。
由于Internet E-mail采用开放式标准,所以MTA、MDA、MUA等不同角色,可分别由许多不同的软件来扮演。实现相同协议的不同软件,可以彼此相互交流,而不管它们是在什么系统上运行。如果将一个完整的E-mail邮件系统集中在一起,你可能会发现,处理SMTP的是一套软件,处理POP3/IMAP的是另一套软件。但邮件系统中的每一种角色都有许多不同的软件可以选择。
邮件系统里各种角色之间的通信,受各式各样的标准与协议的规范。定义这些协议与标准的文件,由Internet Engineering Task Force(IETF)维护管理,IETF以Request For Comments(RFC)的形式公布他们。RFC是一种被赋予正式编号的标准文件,它们用于解释特定的技术或协议。
用于传递信息的标准协议是SMTP(Simple Mail Transport Protocol),它定义于RFC 2821,主旨在于规范两个主机通过网络交换E-mail的对话原则。用于收信的协议是POP(Post Office Protocol),或IMAP(Internet Mail Applicathion Protocol)。IMAP(RFC 2060)与POP(RFC 1939)都是描述如何从邮箱取出邮件。IMAP协议出现比POP略晚,其功能也较完备。但不管是POP还是IMAP,E-mail都是保存在一部中央服务器中,让收件人可以通过网络取信。
SMTP是用于“寄信”的协议。当MUA要求MTA代为送出一封邮件,以及一个MTA将邮件送到另一个MTA时,都使用SMTP协议。原始的SMTP协议并没有身份验证的设计,但是后来的扩充版本——ESMTP,加入了这方面的功能。
当用户想从邮箱取出他们的邮件,必须使用MUA连接到POP或IMAP server,由服务器代为访问邮箱。POP与IMAP之间最大的差异,在于邮箱的管理方式。POP用户通常将所有邮件从服务器搬回自己的主机;IMAP则容许用户通过网络要求服务器代为管理邮件。许多服务器同时提供这两种协议,所以我们通常统称他们为POP/
和其它网络服务的配置文件一样,sendmail的主要配置文件位置在/etc/mail下
[root@ts3-142 mail]# pwd /etc/mail [root@ts3-142 mail]# ls -l ×Ü¼Æ 296 -rw-r--r-- 1 root root 355 03-24 22:19 access -rw-r----- 1 root root 12288 04-20 16:06 access.db -rw-r--r-- 1 root root 0 03-24 22:19 domaintable -rw-r----- 1 root root 12288 04-20 16:06 domaintable.db -rw-r--r-- 1 root root 5521 03-24 22:19 helpfile -rw-r--r-- 1 root root 64 03-24 22:19 local-host-names -rw-r--r-- 1 root root 0 03-24 22:19 mailertable -rw-r----- 1 root root 12288 04-20 16:06 mailertable.db -rw-r--r-- 1 root root 1048 03-24 22:19 Makefile -rw-r--r-- 1 root root 58248 04-20 16:06 sendmail.cf -rw-r--r-- 1 root root 7209 03-24 22:19 sendmail.mc drwxr-xr-x 2 root root 4096 04-20 16:36 spamassassin -rw-r--r-- 1 root root 40251 04-20 18:52 submit.cf -r--r--r-- 1 root root 41329 03-24 22:19 submit.cf.bak -rw-r--r-- 1 root root 940 03-24 22:19 submit.mc -rw-r--r-- 1 root root 127 03-24 22:19 trusted-users -rw-r--r-- 1 root root 0 03-24 22:19 virtusertable -rw-r----- 1 root root 12288 04-20 16:06 virtusertable.db
其主要的配置文件为access、sendmail.cf、sendmail.mc。
为了安全的原因,sendmail的缺省的配置允许发邮件但是不允许从网络上接收邮件(缺省的它们只接受从回环接口上的连接)。我们只需要简单几步配置使得你的MTA接受传入的连接:
首先来看看系统默认的配置,注意25端口的监听范围。
[root@ts3-142 mail]# netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:728 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 127.0.0.1:3645 ESTABLISHED tcp 0 0 :::80 :::* LISTEN tcp 0 0 :::22 :::* LISTEN tcp 0 0 :::443 :::* LISTEN tcp 0 0 :::8443 :::* LISTEN
现在我们要对sendmail.mc文件做修改,使我们的邮件系统能接收外部邮件:
1、在修改配置文件之前,请先备份sendmail.mc和sendmail.cf
[root@ts3-142 mail]# cp sendmail.mc sendmail.mc.orig [root@ts3-142 mail]# cp sendmail.cf sendmail.cf.orig
2、修改sendmail.mc,找到“DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA’)dnl”这行,象下面这样将其注释掉:
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
3、在/etc/mail目录下编译sendmail.cf
[root@ts3-142 mail]# m4 sendmail.mc > sendmail.cf
4、重起sendmail服务
现在让我们再来看看系统25端口的监听范围:
[root@ts3-142 mail]# netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:728 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 :::80 :::* LISTEN tcp 0 0 :::22 :::* LISTEN tcp 0 0 :::443 :::* LISTEN tcp 0 0 :::8443 :::* LISTEN
这说明我们邮件服务已经可以接收外部邮件了。
现在我们要配置我们的邮件服务,使其可以转发本地域及外部的邮件。
首先,还是修改/etc/mail/sendmail.mc配置文件,我们只需要给它添加下面一行即可
FEATURE(promiscuous_relay)dnl
然后重编译sendmail.cf文件
[root@ts3-142 mail]# m4 sendmail.mc > sendmail.cf
最后不要忘记重起sendmail服务
开启了转发功能后,我们还需要对其做些必要的配置,来控制它的转发功能。我想谁都不想自己的邮件服务被用来做为Internet上垃圾邮件的转发“帮凶”。
编辑/etc/mail/access文件
[root@ts3-142 mail]#vi /etc/mail/access localhost.localdomain RELAY localhost RELAY 127.0.0.1 RELAY 192.168.1 RELAY //允许对192.168.1这个网段里的机器转发 172.16.78.142 RELAY //允许对172.16.78.142这个机器转发 .turbolinux.com.cn RELAY //允许对turbolinux.com.cn域里机器转发
然后重起sendmail服务
在sendmail决定消息的接受者的目的地的之前,其先试图在别名中查找。sendmail的主要的别名配置文件是/etc/aliases。为了优化查找,sendmail为其别名记录建立了一个哈希表数据库/etc/aliases.db。该文件通过newalias命令产生(该命令是sendmail –bi的同名)。下面是一个别名的例子:
首先创建一个新用户
#useradd mailtest
然后修改/etc/aliases,在最后添加下面几行
me: mailtest wizards: root, me methere: mailtest@localhost.localdomain
最后更新别名数据库
#newalias
我们可以用下面方法来严整别名是否生效:
#echo “hello there” | mail –s “hello” me #echo “hello there” | mail –s “hello” wizards #echo “hello there” | mail –s “hello” methere
看看是否在wizards组里的用户都收到了邮件。