--> -简单邮件传输协议(Simple Mail Transfer Protocol),是定义邮件传输的协议,
它是基于TCP服务的应用层协议,由RFC0821所定义。SMPT协议规定的命令是以明文方式进
行的。为了说明SMTP的工作原理, 我们以向www.linuxaid.com.cn发送邮件为实例进行说
明。
[lix@ns lix] telnet www.linuxaid.com.cn 25
Trying 202.99.11.120...
Connected to www.linuxaid.com.cn.
Escape character is '^]'.
HELO ideal
220 www.linuxaid.com.cn ESMTP Sendmail 8.10.2/8.10.2; Mon, 18 Sep 2000 13:40:44
+0800
250 www.linuxaid.com.cn Hello [210.12.114.130], pleased to meet you
MAIL FROM:ideal@btamail.net.cn
250 2.1.0 IDEAL@btamail.net.cn... Sender ok
RCPT TO:ideal@linuxaid.com.cn
250 2.1.5 ideal@linuxaid.com.cn... Recipient ok
DATA
354 Enter mail, end with '.' on a line by itself
hello , Pls to get to meet u good luck
.
250 2.0.0 e8I5j1M11204 Message accepted for delivery
QUIT
221 2.0.0 www.linuxaid.com.cn closing connection
Connection closed by foreign host.
其中黑体部分是输入的命令,其他内容是对方邮件服务器输出的状态信息。
这里,HELO是客户向对方邮件服务器发出的标识自己的身份的命令,这里假设发送者为ideal;MAIL FROM命令用来表示发送者的邮件地址;RCPT TO:标识接收者的邮件地址,这里表示希望发送邮件给ideal@linuxaid.com.cn,如果邮件接收者不是本地用户,例如RCPT TO:ideal@btamail.net.cn,则说明希望对方邮件服务器为自己转发(Relay)邮件,若该机器允许转发这样的邮件,则表示该邮件服务器是OPEN RELAY的,否则说明该服务器不允许RELAY;DATA表示下面是邮件的数据部分,输入完毕以后,以一个'.'开始的行作为数据部分的结束标识;QUIT表示退出这次会话,结束邮件发送。
这就是一个简单的发送邮件的会话过程,其实当使用outlook express等客户软件发送时,后台进行的交互也是这样的,当然,SMTP协议为了处理复杂的邮件发送情况如附件等等,定义了很多的命令及规定,具体可以通过阅读RFC821来获得。
当你的一个朋友向你发送邮件时,他的邮件服务器和你的邮件服务器通过SMTP协议通信,将邮件传递给你邮件地址所指示的邮件服务器上(这里假设你的本地邮件服务器是linux系统),若你通过telnet协议直接登录到邮件服务器上,则可以使用mail等客户软件直接阅读邮件,但是若你希望使用本地的MUA(Mail User Agent,如outlook express等客户软件)来阅读邮件,则本地客户端通过POP3或IMAP协议与邮件服务器交互,将邮件信息传递到客户端(如:win98系统)。而如果你向你的朋友回复一封信件时,你所使用的MUA也是通过SMTP协议与邮件服务(一般为发送邮件地址对应的email地址)器通信,指示其希望邮件服务器帮助转发一封邮件到你朋友的邮件地址指定的邮件服务器中。若本地邮件服务器允许你通过它转发邮件,则服务器通过SMTP协议发送邮件到对方的邮件服务器。这就是接受和发送邮件的全部过程。
二、什么是mail Relay
邮件服务器一般具有一个或若干个域名(这些域名应该出现在某个配置文件内),邮件服务器在运行时将监听25号端口,等待远程的发送邮件的请求。网络上其他的mail服务器或者请求发送邮件的MUA(Mail User Agent,如outlook express、foxmail等等)会连接邮件服务器的25号端口,请求发送邮件,SMTP会话过程一般是从远程标识自己的身份开始,过程如下:
HELO remote.sys tem.domainname
250 qmailserver.domain
MAIL FROM:user@somewherer.net
250 OK
RCPT TO: user1@elsewhere.net
邮件的接收者user1@elsewhere.net中的域名并不一定是邮件接受服务器的所具有的本地域名,也就是说邮件目的可能不是上面协议交互中的接收方,而是邮件发送者希望接收邮件服务器帮助其转发邮件。这时候本地系统可能有两种回答,接受它:
250 OK
或者拒绝接受它:
553 sorry,.that domain isnot in my domain list of allowed recphosts
第一种情况下,本地邮件服务器是允许relay的,它接收并同意传递一个目的地址不是本地的邮件;而第二种情况则不接收非本地邮件。
为什么不能配置邮件服务器为open relay?
如果系统管理员将自己的邮件服务器设置为open relay,将会导致一些垃圾邮件发送者将你的邮件服务器作为转发自圾邮件的中继站,这将使垃圾邮件的接收者将矛头对准你,可能会导致报复性的邮件炸弹;垃圾邮件还能消耗你大量的资源,占用你的带宽。更为糟糕的事情可能是你的名字可能会上了黑名单,成为其他邮件接收者共同抵制的目标,你的邮件将被这些接收者所拒绝。
因此,系统管理员应当注意不要使自己的邮件服务器是open relay的。
# Person who should get root's mail
#root: marc
最后应该运行'/usr/bin/newaliases'程序使改动生效
3、避免你的Sendmail被未授权的用户滥用
最新版本的Sendmail (8.9.3)加入了很强的防止欺骗的特性。它们可以防止你的邮件服务器被未授权的用户滥用。编辑你的'/etc/sendmail.cf'文件,修改一下这个配置文件,使你的邮件服务器能够挡住欺骗邮件。
编辑'sendmail.cf'文件(vi /etc/sendmail.cf)并更改下面一行:
O PrivacyOptions=authwarnings
改为:
O PrivacyOptions=authwarnings,noexpn,novrfy
设置'noexpn'使sendmail禁止所有SMTP的'EXPN'命令,它也使sendmail拒绝所有SMTP的'VERB'命令。设置'novrfy'使sendmail禁止所有SMTP的'VRFY '命令。这种更改可以防止欺骗者使用'EXPN'和'VRFY'命令,而这些命令恰恰被那些不守规矩的人所滥用。
4、SMTP的问候信息
当 sendmail接受一个SMTP连接的时候,它会向那台机器发送一个问候信息,这些信息作为本台主机的标识,而且它所做的第一件事就是告诉对方它已经准备好了。
编辑'sendmail.cf'文件(vi /etc/sendmail.cf)并更改下面一行:
O SmtpGreetingMessage=j Sendmail v/Z; b
改为:
O SmtpGreetingMessage=j Sendmail v/Z; b NO UCE C=xx L=xx
现在手工重起一下sendmail进程,使刚才所做的更改生效:
[root@deep]# /etc/rc.d/init.d/sendmail restart
以上的更改将影响到Sendmail在接收一个连接时所显示的标志信息。你应该把'`C=xx L=xx'条目中的'xx'换成你所在的国家和地区代码。后面的更改其实不会影响任何东西。但这是'news.admin.net-abuse.email'新闻组的伙伴们推荐的合法做法。
5、限制可以审核邮件队列内容的人员
通常情况下,任何人都可以使用'mailq'命令来查看邮件队列的内容。为了限制可以审核邮件队列内容的人员,只需要在'/etc/sendmail.cf'文件中指定'restrictmailq'选项即可。在这种情况下,sendmail只允许与这个队列所在目录的组属主相同的用户可以查看它的内容。这将允许权限为0700的邮件队列目录被完全保护起来,而我们限定的合法用户仍然可以看到它的内容。
编辑'sendmail.cf'文件(vi /etc/sendmail.cf)并更改下面一行:
O PrivacyOptions=authwarnings,noexpn,novrfy
改为:
O PrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq
现在我们更改邮件队列目录的权限使它被完全保护起来:
[root@deep]# chmod 0700 /var/spool/mqueue
注意:我们已经在sendmail.cf中的'PrivacyOptions='行中添加了'noexpn'和'novrfy'选项,现在在这一行中我们接着添加'restrictmailq'选项。
任何一个没有特权的用户如果试图查看邮件队列的内容会收到下面的信息:
[user@deep] /usr/bin/mailq
You are not permitted to see the queue
6、限制处理邮件队列的权限为'root'
通常,任何人都可以使用'-q'开关来处理邮件队列,为限制只允许root处理邮件队列,需要在'/etc/sendmail.cf'文件中指定'restrictqrun'。
编辑'sendmail.cf'文件(vi /etc/sendmail.cf)并更改下面一行:
O PrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq
改为:
O PrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq,restrictqrun
任何一个没有特权的用户如果试图处理邮件队列的内容会收到下面的信息:
[user@deep] /usr/好好学习in/sendmail -q
You do not have permission to process the queue