Linux 版 (精华区)
发信人: tcpip (高级草包), 信区: Linux
标 题: 公报11-家庭网络邮件系统的建立
发信站: 紫 丁 香 (Wed May 3 09:21:54 2000) WWW-POST
家庭网络邮件系统的建立
作者:Jan Stumpel 译者:彭青松
------------------------------------------------------------------------------
--
1.引言
很多读者在读了我在公报第45期(中文版99年8月第九期)上的文章通过exim建立家庭网络
的邮件系统后,很多人给我发来了邮件,主要谈到的内容大致有如下两点:
你的文章真是雪中送炭,我也正为同样问题而发愁呢
我照你所说的做了,但却不起作用
于是我不得不重新坐下再仔细看一下当我发送邮件时会发生哪些情况。因此,下面的这篇
文章就是我对正确安装第43期中提及的内容的详细说明,同时我也解释了一些原因。
2.SMTP
你可能已经知道,所谓SMTP,就是简单邮件传输协议的意思,实际就是指在互联网上的计
算机之间互相传送电子邮件的方法。计算机之间的通信传输是由TCP/IP协议来支持的,
SMTP是在TCP/IP基础上进行通信的协议。下面我们通过试验来看一下SMTP是如何工作的。
最基本的建立TCP/IP连接的的办法是远程登录,如果键入:
telnet host port
你的电脑就和名称为host的电脑在端口port处建立了联接。就好象是你打电话给名为“
host”的公司找Port先生一样。只有当Port先生在,并且他接你的电话,你的电话才会接
通。同样,在被联接的另一台计算机上必须有相应的程序被激活,监听到在该端口上的联
接,要不然你就会得到“connection refused”的拒绝联接的信息。
端口是一个占有16位的数,特定的端口号事先已被分配给服务器。SMTP协议的电子邮件用
端口25,监听端口25的程序称为报文传送代理(MTA)。如果你的Linux主机名为heaven,那
么你打入下行可以呼叫SMTP服务:
telnet heaven 25
你也可以在局域网或互联网上的其他计算机上做同样的工作,但你不一定非得有个网使用
,因为你还可以在同时运行MTA的计算机上进行远程登录操作。你可以键入
telnet heaven smtp
因为远程登录能够通过查看/etc/services来找出SMTP用的是哪个端口,结果应该如下所
示:
Trying 192.168.1.1...
Connected to heaven.home.
Escape character is '^]'.
220 heaven.home ESMTP Exim 3.03 #1 Sun, 8 Aug 1999 12:47:24 +0200
这表明我现在用的是exim 3.03(由于发现了一个重要功能,我最近已从2.05升级了,具体
原因见下面第5节)。如果我同样的办法联接我的ISP的邮件服务器的话,我看到的是
Sendmail 8.8.8/1.19。
我们在以220开头的行下面看不到提示符或其他东西,此时MTA是在等待你的指令呢。下面
怎么办?接下来键入help,会得到如下结果:
help
214-Commands supported:
214- HELO EHLO MAIL RCPT DATA
214 NOOP QUIT RSET HELP
这是你的电脑所支持的SMTP的命令或者称为协议吧。并没有多少命令!SMTP确实是个非常
“简单”的协议。它的命令可以在互联网标准RFC821中查到。后来在一些其他的标准如
RFC1869中又加入了一些扩展命令。支持扩展协议的系统会显示支持Extended SMTP或
ESMTP。这都会在刚进入的提示行中出现,如上面所提到的Exim 3.03一样。SMTP与ESMTP
间的区别并不明显。
要停止SMTP联接,只需键入QUIT命令即可
3.互相问候:HELO与EHLO命令
刚进入时的提示行(以220开头的那行)出现以后,你就可以输入命令了。你输入的第一条
命令可能就是HELO,或者如果你的系统支持ESMTP的话,用的就是EHLO。越是用新版本,
你的命令就应包括你的域名:
EHLO yourdomainname
如果你用的家庭系统并不包含一个正式的域名的话该用什么名字呢?实际上这并无多大影
响,你可以用你自己选择的域名,例如heaven.home。我们现在来键入telnet
smtp.isp.com 25 来试一下我们的ISP的SMTP服务器。在刚进入时的提示行后面打入
EHLO heaven.home
我们会得到一些或多或少的较为详细的问候信息,比如:
250-smtp.isp.com Hello customer123.dialin.isp.com [xxx.yyy.zzz.123], pleased
to meet you
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
问候信息的最前面是250,这是表示SMTP正常的代码。现在在我们建立ppp联接时动态分配
得到的的临时域名(customer123.dialin.isp.com)和临时IP地址(xxx.yyy.zzz.123) 也收
到了问候信息。此信息通过在TCP/IP协议下的网络层进行传输。当使用EHLO命令时,对方
也会先出现代码250,但然后接着显示的就是该系统所支持的除了RFC821基本协议外的
SMTP或ESMTP协议,
不管是EHLO还是HELO命令,邮件服务器(heaven.home)实际并不对其进行检查。这就是说
EHLO/HELO命令总会执行成功的,如果对方主机并不想与你进行会话的话,那么它会首先
拒绝你远程登录到其服务器的请求的。
4.发送邮件
仅通过smtp协议进行远程登录到邮件服务器上,你就可以手工进行发送邮件了,甚至连
MTA或象pine这样的邮件程序都不需要。下面我们自己来试一下,为安全起见,先在自己
的网络上试验。当然我们首先得有一个邮件服务器。用户joe发送一条消息给用户emi,这
需要三个步骤。第一是MAIL FROM:命令,因为SMTP命令并不区分大小写,所以你也可以
在键盘上敲mail from:。
MAIL FROM: joe@home
250 <joe@home> is syntactically correct
我们得到应答代码250,所以刚才敲入的命令正确。下面第二步是RCPT TO:命令,用以指
定邮件接收者。
RCPT TO: emi@home
250 <emi@home> is syntactically correct
仍然是250,正常。第三步就是输入要发送的消息本身,用DATA命令:
DATA
354 Enter message, ending with "." on a line by itself
代码354提示我们输入信息。这里的信息并不单单指我们要发送的消息,还包括信头,即
主题、收件人、抄送人和发件人等。这种信息的结构在标准RFC822中有详细说明。严格的
说,实际现在和SMTP协议已不再有关系了。SMTP只关心前面两步,即MAIL FROM:和RCPT
TO:两条语句。因此,信息中的收件人地址和第二步中的RCPT TO:的地址是两个不同的
概念,二者可以不同。我们可以实际试一下,(当然我们最好还是限于局域网用户),可以
在终端敲入:
To: My Daughter
From: Your Dad
<--(此空行把信头与信的内容隔开)
Happy birthday!
. <--(以点为起点的行是信件结束的标志)
上面的消息会立即送到用户emi。如果她用pine打开此消息的话,她会看到到To: My
Daughter和From: Your Dad。
但当她试图回复此信时问题就来了。直接回复时收件人并不是原发件人,而是信息中的部
分文字。pine会认为Your和Dad是两个不同的地址,并且会警告说你应该在不同的地址之
间加上逗号,而不只是空格。当然在任何服务器上是都是没有Your或Dad用户的。这样的
信的发件人,肯定是个不会替别人着想的人,让人在回信时非得手工改邮件地址不可。
5. 建立家庭网络邮件系统
现在我们可以看出在我在公报第43期的上的中哪儿错了。除了在公报第44期中提到的pine
漏洞之外,读者反应较多的两个问题如下:
报文传送代理(MTA)根本没起作用
我说过Linux上的邮件程序(如pine)可以在邮箱外进行操作。这确实是的,但问题是很多
用户的邮件程序根本就不是运行在邮箱外的,而是事先已经配置好了的。通常在这样的邮
件程序中已经为ISP提供的邮件服务器设置了SMTP服务。在这种情况下,大多数邮件程序
会自动进行SMTP处理,因此根本就不会运行报文传送代理了。补救办法:把邮件程序中的
SMTP服务设为你的Linux邮件,这样就可以自动通过报文传送代理传送信息了。
发件人一栏并没有改变
这是一个比较重要的问题。如上所说,在支持SMTP的主机上进行电子邮件传送需要如下三
个步骤:
1.MAIL FROM:
2.RCPT TO:
3.DATA
如果一切正常的话,对方主机会在前面两步给出传送正确的应答信号(即代码250)。但有
时却没有此信号!很多邮件服务器实际上并不检查Mail From:的地址,却也给出传送正确
的信号。此时必须保证邮件地址必须正确,否则就会被拒收。如果你的ISP检查MAIL FROM
:项的话,我的上面的文章所讲的方法就不适用了。相反,如果你的ISP并不对其进行检
查,你还坚持发送你的邮件的话,你的邮件可能并未能够正确发送,而你也得不到相关的
提示信息。
这就是说我们不但需要在信的内容中填入发件人的电子邮件地址,而且还要在整个邮件的
发件人栏内也填入该地址。此时有两种情况。
如果你用的是exim 2.05或者更早的版本的话唯一的办法是在exim.conf的最后一部分,即
REWRITE CONFIGURATION中加入一句:
*@home joe.bloggs@isp.com F
这将导致将所有MAIL FROM:栏的地址转化为ISP给你提供的地址。不幸的是,用这种办法
不但是发出的信给改了,在本地发的信也改了。这一点实际影响并不大,因为用户在收到
邮件时并不仔细看是发给谁的,而通常都是直接打开来看的。直接回复就可以发送到正确
的地址。
如果你用的是exim 2.10或更高版本的话你可以在exim.conf的remote_smtp中的
TRANSPORTS CONFIGURATION部分中加入一条语句。高版本的exim允许改变发到外面的邮件
的发件人一栏。在driver = smtp行后面插入下行
return_path = "joe.bloggs@isp.com"
这种办法更好一些,因此我建议仍在使用exim 2.05的用户予以升级。Debain下最新版本(
写这篇文章时是3.03)可以在www.debian.org中找到。此升级非常稳定,且不需要更多的
设配置。
--
"这一千多年没写诗了?"
"写了, 不过只写了两句."
"千年得两句, 一定是万古丽句了. 念来听听."
"好吧, 我现丑了" 太白星清了清嗓子, 浑厚的男中音在天庭响起:
大海啊, 都是水;
骏马啊, 四条腿;
※ 来源:·紫 丁 香 bbs.hit.edu.cn·[FROM: freesrc.hit.edu]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.431毫秒