www.hj8828.com 33

第二十八章: SMTP:简单邮件传送协议

本文介绍如何telnet到运行简单邮件传输协议 (SMTP)
服务的计算机上的端口25,以解决SMTP通信问题。默认情况下,SMTP 侦听端口
25。

 

电子邮件无疑是最流行的应用程序。[Caceres et
al.1991]说明,所有TCP连接中大约一半是用于简单邮件传送协议SMTP(Simple
Mail Transfer
Protocol)的(以比特计算为基础,FTP连接传送更多的数据)。[Paxson 1993]
发现,平均每个邮件中包含大约1500字节的数据,但有的邮件中包含兆比特的数据,因为有时电子邮件也用于发送文件。

您可以根据您遇到的问题类型选用以下适当的疑难解答步骤。例如,如果您在两台
Microsoft Exchange 2000 Server 服务器之间通过 SMTP
发送邮件时遇到问题,则可以通过在发送服务器上使用 Telnet
连接到目标服务器上的端口 25 来测试 SMTP 连接。或者,如果您在接收来自
Internet 的 SMTP 邮件时遇到问题,则可以按照本文中列出的步骤,测试驻留在
Internet 上但不在您的网络上的主机与您的 SMTP 服务器的连接。更多信息
Microsoft 产品线中有 SMTP 的多个不同变体。Microsoft Windows 产品线的
SMTP 服务包含在 Internet 信息服务 (IIS) 中,而在 Microsoft Windows NT
Server 4.0 中,SMTP 服务包含在 Option Pack 中。在较新版本的 Windows
中,IIS
已被集成到操作系统中,并且您可以使用“控制面板”中的“添加或删除程序”添加
IIS。此外,Exchange 2000 和 Microsoft Exchange Server 2003 都使用 IIS
中的现有 SMTP 服务及其他功能。Microsoft Exchange Server 版本 4.0、5.0 和
5.5 均包含它们自己的 SMTP 版本,所采用的形式为 Internet Mail Connector
(IMC) 或 Internet Mail Service (IMS)。

本主题说明如何使用 Telnet 测试邮件服务器之间的简单邮件传输协议 (SMTP)
通信。默认情况下,SMTP 在端口 25 上进行侦听。如果在端口 25 上使用
Telnet,则可以输入 SMTP 命令用来连接到 SMTP 服务器,且可以将 Telnet
会话当做 SMTP
邮件服务器来发送邮件。您还可以查看连接过程和邮件提交过程中每个步骤是成功还是失败。

图28-1显示了一个用TCP/IP交换电子邮件的示意图。

注意:

在以下方案中,您可能需要使用 Telnet 测试发往或来自
MicrosoftExchangeServer 组织中存在的传输服务器的 SMTP 通信:

www.hj8828.com 1图28-1
Internet电子邮件示意图

在 Exchange 5.0 及更高版本中,Internet Mail Connector (IMC) 被重命名为
Internet Mail Service。
在启动 Telnet 会话之前,必须具有要将此测试邮件发送到的目标用户的完整
SMTP
电子邮件地址。该电子邮件地址必须采用以下格式:[email protected]您也可以具有运行
SMTP 服务的服务器计算机的完全限定域名 (FQDN) 或 IP
地址例如,10.120.159.1)。如果服务器在您的组织中,您可能已经拥有这些信息。如果服务器是外部服务器,查找这些信息最简单的方法是使用
Nslookup.exe 以找到包含这些信息的 DNS 记录。

  • 从位于外围网络之外的主机连接到组织的边缘传输服务器,并发送一封测试邮件。
  • 从组织的边缘传输服务器连接到远程邮件服务器,并发送一封测试邮件。

用户与用户代理(user
agent)打交道,可能会有多个用户代理可供选择。常用的Unix上的用户代理包括MH,Berkeley
Mail,Elm和Mush。

有关 NSlookup 的其他信息,请单击下面的文章编号,以查看 Microsoft
知识库中相应的文章:200525 使用 NSlookup.exe有关如何获取 Internet
邮件交换器记录的其他信息,请单击下面的文章编号,以查看 Microsoft
知识库中相应的文章:203204 XFOR:如何获取 Internet
邮件交换器记录确保运行 SMTP 服务的服务器上已启动 SMTP。要测试 SMTP
是否已启动,您可以运行本文中列出的基本测试,并验证您是否会收到来自远程服务器的
220 消息。这还将验证 SMTP 是否正在运行。

本主题中的步骤表明如何使用 Microsoft Windows 中包含的组件 Telnet
客户端。第三方 Telnet 客户端可能需要不同于 WindowsTelnet 组件的语法。

用TCP进行的邮件交换是由报文传送代理MTA(Message Transfer
Agent)完成的。最普通的Unix系统中的MTA是Sendmail。用户通常不和MTA打交道,由系统管理员负责设置本地的MTA。通常,用户可以选择它们自己的用户代理。

注意:

 

本章研究在两个MTA之间如何用TCP交换邮件。我们不考虑用户代理的运行或实现。

有些 Telnet
应用程序要求您打开本地回显功能,以查看键入的命令。要在Microsoft Telnet
会话中执行此操作,请在命令提示符处键入 set local_echo。

 

RFC 821 [Postel
1982]规范了SMTP协议,指定了在一个简单TCP连接上,两个MTA如何进行通信。RFC
822 [Crocker 1982]指定了在两个MTA之间用RFC
821发送的电子邮件报文的格式。

在 Microsoft Windows XP 中,应键入 set localecho 而不是 set
local_echo。
基本测试 按照下列步骤操作,以确保主机和远程 SMTP 服务器能够通信。
如果在您键入以下任一命令之后,收到以下错误信息,则说明 SMTP
服务器因为语法错误或命令错误而无法识别您所键入的内容:500 Command not
recognized检查该命令并再次键入它,或者验证您是否正在与 Microsoft SMTP
服务器直接通信。

www.hj8828.com 2 先决条件

两个MTA之间用NVT
ASCII进行通信。客户向服务器发出命令,服务器用数字应答码和可选的人可读字符串进行响应。这与上一章的FTP类似。

注意:

 

客户只能向服务器发送很少的命令:不到12个(相比较而言,FTP超过40个)。我们用简单的例子说明发送邮件的工作过程,并不仔细描述每个命令。

Microsoft Telnet 不允许您使用 Backspace 键。如果在键入时出错,必须按
Enter 键,然后开始键入新的命令。

 

28.2.1 简单例子

我们将发送一个只有一行的简单邮件,并观察SMTP连接。我们用-v标志调用用户代理,它被传送给邮件传送代理(本例中是Sendmail)。当设置该标志时,该MTA显示在SMTP连接上发送和接收的内容。以>>>开始的行是SMTP客户发出的命令,以3位数字的应答码开始的行是从SMTP服务器来的。以下就是交互会话:

www.hj8828.com 3

只有5个SMTP命令用于发送邮件:HELO,MAIL,RCTP,DATA和QUIT。

我们键入mail启动用户代理,然后键入主题的提示;键入后,再键入报文的正文。在一行上键入一个句点结束报文,用户代理把邮件传给MTA,由MTA进行交付。

客户主动打开TCP端口25。返回时,客户等待从服务器来的问候报文。该服务器的应答必须以服务器的完全合格的域名开始:本例中为noao.edu(通常,跟在数字应答后面的文字是可选的。这里需要域名。以Sendmail打头的文字是可选的)。

下一步客户用HELO命令标识自己。参数必须是完全合格的的客户主机名:sun.tuc.noao.edu。

MAIL命令标识出报文的发起人。下一个命令,RCPT,标识接收方。如果有多个接收方,可以发多个RCPT命令。

邮件报文的内容由客户通过DATA命令发送。报文的末尾由客户指定,是只有一个句点的一行。最后的命令QUIT,结束邮件的交换。

图28-2是在发送方SMTP与接收方SMTP之间的一个SMTP连接。

我们键入到用户代理的数据是一行报文,但在报文段12中共发送了393字节的数据。下面的12行组成了客户发送的393字节数据:

www.hj8828.com 4www.hj8828.com 5

前三行,Received:和Message-Id:由MTA加上;下一行由用户代理生成。

www.hj8828.com 6图28-2
基本SMTP邮件交付

在以下步骤中,您要从命令行中运行
Telnet。要打开命令行,请单击“开始”,单击“运行”,在“打开”框中键入
cmd,然后单击“确定”。1. 您可以通过使用以下格式的 Telnet 命令来启动
Telnet 会话:
注意:在键入每行内容之后按 Enter 键。telnet
服务器名端口号例如,键入:telnet mail.contoso.com 25
注意:您可以将服务器名 替换为您要连接到的 SMTP 服务器的 IP 地址或 FQDN。
记住在键入每个命令之后按 Enter 键。

  • 配置接受连接器以允许匿名访问或基本身份验证由于集线器传输服务器之间正常进行的邮件传输经过加密和身份验证,因此在端口
    25 上使用 Telnet
    测试通信时,内部集线器传输服务器应将接受连接器配置为允许匿名访问或基本身份验证来接收邮件。面向
    Internet 的服务器需要使用匿名访问。

    注意:
    将邮件发送到接受基本身份验证的接收连接器时,您必须有可将用于用户名和密码的文本字符串转换为 Base64 格式的实用程序。由于使用基本身份验证时,用户名和密码非常容易辨别,因此不建议使用无加密的基本身份验证。
  • 连接到远程邮件服务器您可能还需要从组织的边缘传输服务器连接到远程邮件服务器。对于面向
    Internet 的 SMTP 服务器,如果配置为验证源 IP 地址、相应域名系统
    (DNS) 域名以及所有尝试向服务器发送邮件的 Internet 主机的反向查找 IP
    地址,则这有助于避免其拒绝测试邮件。

  • 安装和/或启用 Telnet 客户端在使用 Telnet 对邮件服务器之间的 SMTP
    通信进行测试之前,您可能还需要执行下列一项或多项任务:

    • 安装 Telnet 客户端如果尚未安装)。有关如何在 Windows Vista 或
      Windows Server 2008 上安装 Telnet 客户端的详细信息,请参阅安装
      Telnet 客户端。
    • 在 Windows Server 2008 上启用 Telnet
      客户端。请参阅本主题后面的步骤。
  • 查找 SMTP 服务器的 FQDN 或 IP 地址。如果不知道 FQDN 或 IP
    地址,可以使用 Nslookup 查找 SMTP 服务器的 FQDN 或 IP
    地址。请参阅本主题后面的步骤。
28.2.2 SMTP命令

最小SMTP实现支持8种命令。我们在前面的例子中遇到5个:HELO,MAIL,RCPT,DATA和QUIT。

RSET命令异常中止当前的邮件事务并使两端复位。丢掉所有有关发送方、接收方或邮件的存储信息。

VRFY命令使客户能够询问发送方以验证接收方地址,而无需向接收方发送邮件。通常是系统管理员在查找邮件交付差错时手工使用的。我们将在下一节中给出这方面的例子。

NOOP命令除了强迫服务器响应一个OK应答码外,不做任何事情。

还有附加和可选命令。EXPN扩充邮件表,与VRFY类似,通常是由系统管理员使用的。事实上,许多Sendmail的版本都把这两者等价地处理。

4.4BSD中的Sendmail版本8不再将两者等同处理。VRFY不扩充别名也不接受.forward文件。

TURN命令使客户和服务器交换角色,无需拆除TCP连接并建立新的连接就能以相反方向发送邮件(Sendmail不支持这个命令)。其他还有三个很少被实现的命令(SEND、SOML和SAML)取代MAIL命令。这三个命令允许邮件直接发送到客户终端或发送到接收方的邮箱。

www.hj8828.com,如果该命令起作用,您将会收到来自 SMTP 服务器的类似以下内容的消息:220
site.contoso.com Microsoft Exchange Internet Mail Connector <IMC
的版本号> 注意:由于有许多不同版本的 Microsoft SMTP 或第三方 SMTP
服务器,因此您可能会收到来自接收服务器的不同的消息。不过,您肯定会收到包含服务器的
FQDN 和 SMTP 的版本的 220 消息。此外,所有版本的 Microsoft SMTP 在 220
消息中都包含“Microsoft”一词。2. 通过键入以下命令开始通信:EHLO
test.com注意:您可以使用 HELO 命令,但是 EHLO 是扩展 SMTP
动词集中的一个动词,SMTP 的所有当前 Microsoft
实现都支持该动词集。除非您认为扩展 SMTP 动词有问题,否则最好使用 EHLO。

 

28.2.3 信封、首部和正文

电子邮件由三部分组成:

1:信封是MTA用来交付的。在我们的例子中信封由两个SMTP命令指明:MAIL From:
rstevens@sun.tuc.noao.eduRCPT To: estevens@noao.eduRFC
821指明了信封的内容及其解释,以及在一个TCP连接上用于交换邮件的协议。

2:首部由用户代理使用。在我们的例子中可以看到9个首部字段:Received、Message-Id、From、Data、Reply-To、X-Phone、X-Mailer、To和Subject。每个首部字段都包含一个名,紧跟一个冒号,接着是字段值。RFC
822指明了首部字段的格式的解释(以X-开始的首部字段是用户定义的字段,其他是由RFC
822定义的)。长首部字段,如例子中的Received,被折在几行中,多余行以空格开头。

3:正文是发送用户发给接收用户报文的内容。RFC 822指定正文为NVT
ASCII文字行。当用DATA命令发送时,先发送首部,紧跟一个空行,然后是正文。用DATA命令发送的各行都必须小于1000字节。

用户接收我们指定为正文的部分,加上一些首部字段,并把结果传到MTA。MTA加上一些首部字段,加上信封,并把结果发送到另一个MTA。

内容通常用于描述首部和正文的结合。内容是客户用DATA命令发送的。

如果该命令成功,您会收到以下消息:250 OK 3. 键入以下命令向接收 SMTP
服务器通知邮件发件人:MAIL
FROM:[email protected]
注意:该地址可以是您想使用的任何 SMTP 地址,但是最好考虑以下问题:1.
有些 SMTP 邮件系统会基于 MAIL FROM:地址筛选邮件,并且会禁止某些 IP
地址连接到 SMTP 邮件系统,或者如果连接 IP 地址与 SMTP
邮件系统所在的域不匹配,它还会禁止该地址向 SMTP
邮件系统发送电子邮件。在本例中,该域是 test.com。2.
如果您在发送邮件时没有使用有效的电子邮件地址,您将无法确定在发送邮件时是否有问题,因为未送达报告
(NDR) 无法到达无效的 IP
地址。如果您使用有效的电子邮件地址,您将会收到来自 SMTP
服务器的以下消息:250 OK – MAIL FROM
[email protected]

www.hj8828.com 7
Windows Server 2008 中启用 Telnet 客户端

28.2.4 中继代理

在我们的例子中本地MTA的信息输出的第1行是:“Connecting to mailhost via
ether”(即“通过以太网连接到邮件主机”)。这是因为作者的系统已被配置成把所有非本地的向外的邮件发送到一台中继机上进行转发。

这样做的原因有两个。首先,简化了除中继系统MTA外的其他所有MTA的配置(所有曾使用过Sendmail的人都能证明,配置一个MTA并不简单)。第二,它允许某个机构中的一个系统作为邮件集线器,从而可能把其他所有系统隐藏起来。

在这个例子中,中继系统在本地域(.tuc.noao.edu)中有一个mailhost的主机名,而其他所有系统都被配置成把它们的邮件发往该主机。我们可以执行host命令来看看在DNS中这个名是如何定义的:

www.hj8828.com 8

如果将来用于中继的主机改变了,只需改变它的DNS名—其他所有单个系统的邮箱配置都无需改变。

目前许多机构都采用中继系统。图28-3是修改后的Internet邮件图,考虑发送主机和最后的接收主机都可能使用中继主机。

www.hj8828.com 9图28-3
在两端都有一个中继系统的Internet电子邮件

在这种情况下,在发送方和接收方之间有4个MTA。发送方主机上的本地MTA只把邮件交给它自己的中继MTA(该中继MTA可能在该机构的域中有一个mailhost的主机名)。这个通信就在该机构的本地互联网上用SMTP。然后,发送方机构的中继MTA就在Internet上把邮件发送到接收方机构的中继MTA上,而这个中继MTA就通过与接收方主机上的本地MTA通信,把邮件交给接收方主机。尽管可能存在其他协议,但这个例子中所有MTA均使用SMTP协议。

  1. 键入以下命令向接收 SMTP 服务器通知邮件的收件人。

 

28.2.5 NVT ASCII

SMTP的一个特色是它用NVT
ASCII表示一切:信封、首部和正文。正如我们在26.4节中谈到的,这是一个7bit的字符码,以8bit字节发送,高位比特被置为0。

在28.4节中,我们讨论了Internet邮件的一些新特性、允许发送和接收诸如音频和视频数据的扩充SMTP和多媒体邮件。我们将看到,MIME和NVT
ASCII一起表示信封、首部和正文,只需对用户代理作一些改变。

注意:

 

28.2.6 重试间隔

当用户把一个新的邮件报文传给它的MTA时,通常立即试图交付。如果交付失败,MTA必须把该报文放入队列中以后再重试。

Host Requirements
RFC推荐初始时间间隔至少为30分钟。发送方至少4~5天内不能放弃。而且,因为交付失败通常是透明的(接收方崩溃或临时网络连接中断),所以当报文在队列中等待的第1个小时内,尝试两次连接是有意义的。

上面我们说明了普通邮件发送,在这里我们将说明MX记录如何用于邮件发送,以及VRFY和EXPN命令的用法。

最好始终使用要发送到的域中的有效收件人 SMTP 地址。例如,如果您要发送到
[email protected],必须确保域中存在
[email protected]。否则,您会收到
NDR。

完成此步骤的最低要求为 WindowsServer2008本地 Administrators
组的成员或等效身份。

28.3.1 MX记录:主机非直接连到Internet

在14.6节中我们提到DNS中的一种资源记录类型是邮件交换记录,称为MX记录。在下面的例子中我们将说明如何用MX记录向不直接连到Internet的主机发送邮件。RFC
974 [Partridge 1986]描述了MTA对MX记录的处理。

主机mlfarm.com不是直接连到Internet的,但是有一个MX记录指向Internet上的一个邮件转发器。

www.hj8828.com 10

有两个MX记录,各有不同的优先级。我们希望MTA从优先级数值低的开始。

www.hj8828.com 11

从输出中我们看到,MTA发现目的主机有一个MX记录,并使用具有低优先级数值的MX记录。

在主机sun运行这个例子之前,它被配置成不使用本地中继主机,所以我们会看到与目的主机的邮件交换。主机sun还被配置成可使用主机noao.edu(通过拨号SLIP链路)上的域名服务器,所以我们能用tcpdump捕获在SLIP链路上进行的邮件发送和DNS通信。图28-4显示了tcpdump输出的开始部分。

www.hj8828.com 12图28-4
向一个使用MX记录的主机发送邮件

在第1行,MTA向它的域名服务器查询mlfarm.com的MX记录。跟在2后面的加号“+”意思是设置要求递归的标志位。第2行的响应置位授权比特(跟在2后面的星号“*”),并包含两个回答RR,0个授权RR,以及两个附加的RR(两个主机的IP地址)。

第3~5行与主机mercury.hsi.com上的SMTP建立了一个TCP连接。服务器的初始响应220显示在第6行。

由于某种原因,主机mercury.hsi.com必须把这个邮件报文交付给目的地,mlfarm.com。对于没有连接到Internet上与它的MX站点交换邮件的系统,UUCP协议是一种常用的办法。

在这个例子中,MTA要求一个MX记录,得到一个肯定的结果,然后发送邮件。但不幸的是,MTA与DNS之间的交互随不同的实现而不同。RFC
974指定MTA必须首先要求MX记录,如果没有,就尝试提交给目的主机(也就是说,向DNS要主机的记录和IP地址)。MTA也必须处理DNS中的CNAM记录。

作为一个例子,如果我们从一个BSD/386主机上向rstevens@mailhost.tuc.noao.edu发送邮件,则MTA执行以下步骤:

1:Sendmail向DNS询问主机mailhost.tuc.noao.edu的CNAME记录。我们看到存在一个CNAME记录:

www.hj8828.com 13

2:发布一个要求noao.edu的CNAME记录的DNS查询,回答是不存在。

3:Sendmail向DNS寻求noao.edu的MX记录并得到一个记录:

www.hj8828.com 14

4:Sendmail向DNS查询noao.edu的A记录,并得到返回值140.252.1.54(这个A记录大概是由域名服务器为noao.edu返回的,作为第3步中MX应答的一个附加的RR)。

5:Sendmail向DNS查询noao.edu的A记录,并得到返回值140.252.1.54(这个A记录大概是由域名服务器为noao.edu返回的,作为第3步中MX应答的一个附加的RR)。

与只用DNS的SunOS
4.1.3一起发布的Sendmail版本查询MX记录,并且如果没有找到MX记录就放弃。

使用您要发送到的人员的 SMTP 地址键入以下命令:RCPT
TO:[email protected]
您会收到以下消息:250 OK – Recipient
[email protected]
Domain.Com 5. 键入以下命令通知 SMTP服务器您已准备好发送数据:DATA
您会收到以下消息:354 Send data. End with CRLF.CRLF 6.
您现在已可以开始键入邮件的 822/2822
部分。用户将会在他们的收件箱中看到邮件的这一部分。键入以下命令以添加主题行:Subject:test
message 按两次 Enter 键。此命令不会显示任何信息。

在 WindowsServer2008 中,默认情况下禁用 Telnet
客户端。若要启用,请执行下列步骤:

28.3.2 MX记录:主机出故障

MX记录的另一个用途是在目的主机出故障时可提供另一个邮件接收器。如果看一下主机sun的DNS入口,我们就会看到它有两个MX记录:

www.hj8828.com 15

最低优先级的MX记录表明应该首先尝试直接发送到主机本身,下一个优先级是把邮件发送到主机noao.edu。

在下面的描述中,在关掉目的SMTP服务器后,我们从主机vangogh.cs.berkeley.edu向位于主机sun.tuc.noao.edu的我们自己发送邮件。当端口25上的连接请求到达时,TCP应该响应一个RST,因为没有被动打开的进程为等待该端口而挂起。

www.hj8828.com 16

我们看到MTA尝试联系sun.tuc.noao.edu,然后放弃,并转而联系noao.edu。

图28-5显示了TCP用一个RST向到来的SYN响应的tcpdump输出。

www.hj8828.com 17图28-5
尝试连接一个不在运行的SMTP服务器

第1行vangogh向sun的第1个IP地址140.252.1.29的端口25发送一个SYN。在第2行它被拒绝。然后,vangogh上的SMTP客户尝试sun的第2个IP地址140.252.13.33,也产生一个RST的返回。

SMTP客户不区分第1行它主动打开时所返回的不同差错,而这是导致它在第2行尝试其他IP地址的原因。如果第1次的差错是类似“host
unreachable”,那么第2次尝试或许可行。

如果SMTP客户的主动打开失败的原因是因为服务器主机出故障了,我们将看到客户会向IP地址140.252.1.29重传SYN总共75秒。然后客户向IP地址140.252.13.33发送另一个75秒的其他3个SYN。150秒后客户会移到下一个具有更高优先级的MX记录。

注意:按两次 Enter 键为了与 Request for Comments (RFC) 822 和 2822
保持一致。它规定 822 命令后面必须跟一个空行。7.
键入以下命令以添加邮件正文:This is a test message you will not see a
response from this command.8. 在下一个空行中键入英文句点 (.),然后按
Enter 键。 您会收到以下消息:250 OK 9. 键入以下命令关闭连接:QUIT
您会收到以下消息:221 closing connection 10.
验证收件人是否收到您发送的消息。如果在应用程序事件日志中出现任何错误事件消息,或者接收邮件时出现问题,请检查主机的配置或通信。高级测试
除本文前面列出的基本测试步骤外,您还可以使用送达回执对邮件进行双向测试。您可以使用此方法验证
SMTP 服务器是否可以接受入站连接,并且为发件人生成一个送达回执以测试 SMTP
服务器的出站连接。

 

28.3.3 VRFY和EXPN命令

VRFY命令无需发送邮件而验证某个接收方地址是否OK。EXPN的目的是无需向邮件表发送邮件就可以扩充该表。许多SMTP实现(如Sendmail)把两者看成一个,但我们提到新的Sendmail区分这两者。

作为一个简单测试,我们可以连到一个新的Sendmail版本,并看到不同之处(已经删除了无关的Te
lnet客户输出)。

www.hj8828.com 18

首先注意到我们故意在HELO命令中键入错误的主机名:bsdi,而不是sun。许多SMTP服务器得到客户的IP地址,完成一个DNS指针查询并比较主机名。这样允许服务器基于IP地址注册到客户的连接,而不是基于用户可能错误键入的名。某些服务器会用幽默的报文回答,如“你是一个骗子”,或“为什么叫你自己⋯⋯”。在这个例子中我们看到,这个服务器通过指针查询只打印出我们的真实域名以及我们的IP地址。

然后我们用一个无效的名字键入VRFY命令,服务器就响应550差错。下一步我们键入一个有效的名字,服务器用本地主机上的用户名回答。然后我们试试EXPN命令,并得到一个不同的回答。EXPN命令决定到该用户的邮件是否被转发,并打印出转发的地址。

许多站点禁止VRFY和EXPN命令,有时是因为隐私,有时因为相信这是安全漏洞。例如,我们可以向白宫的SMTP服务器试试下面的命令:

www.hj8828.com 19

Internet邮件发生了很多改变。应当记得Internet邮件的三个组成部分:信封、首部和正文。新加入的SMTP命令影响了信封,首部中可以使用非ASCII字母,正文中也加入了结构。本节中我们依次对这三部分的扩充进行讨论。

要为测试邮件请求送达回执,请参见本文“基本测试”一节的第 4
步,以确保提供的信息是可以接收送达回执的有效电子邮件地址。然后在本文“基本测试”一节的第
5 步中,在 Telnet 会话中键入以下命令:RCPT
TO:[email protected]
notify=success, failurestelnet mail.contoso.com 25 220 site.contoso.com
Microsoft Exchange Internet Mail Connector <IMC 的版本号> EHLO
test.com250 OK MAIL
FROM:[email protected]
250 OK – MAIL FROM
[email protected]
RCPT
TO:[email protected]
250 OK – Recipient
[email protected]
Domain.Com DATA 354 Send data. End with CRLF.CRLF Subject:test message
按两次 Enter 键。This is a test message you will not see a response from
this command.在下一个空行中键入英文句点 (.),然后按 Enter 键。 250 OK
QUIT 221 closing connection 传送邮件的应答: 500
格式错误,命令不可识别此错误也包括命令行过长)501 参数格式错误502
命令不可实现503 错误的命令序列504 命令参数不可实现211
系统状态或系统帮助响应214 帮助信息220 <domain> 服务就绪221
<domain> 服务关闭传输信道421 <domain>
服务未就绪,关闭传输信道当必须关闭时,此应答可以作为对任何命令的响应)250
要求的邮件操作完成251 用户非本地,将转发向<forward-path>450
要求的邮件操作未完成,邮箱不可用例如,邮箱忙)550
要求的邮件操作未完成,邮箱不可用例如,邮箱未找到,或不可访问)451
放弃要求的操作;处理过程中出错551
用户非本地,请尝试<forward-path>452
系统存储不足,要求的操作未执行552 过量的存储分配,要求的操作未执行553
邮箱名不可用,要求的操作未执行例如邮箱格式错误)354
开始邮件输入,以LF>结束554 操作。

www.hj8828.com 20 使用
Nslookup 查找 SMTP 服务器的 FQDN 或 IP 地址

28.4.1 信封的变化:扩充的SMTP

RFC 1425
[Klensin等,1993a]定义了扩充的SMTP的框架,其结果被称为扩充的SMTP。与其他我们已经讨论过的新特性一样,这些变化以向后兼容的方式被加入,所以不影响已有的实现。

如果客户想使用新的特性,首先通过发布一个EHLO而不是HELO命令启动一个与服务器的会话。相兼容的服务器用250应答码响应。这个应答通常有好几行,每行都包含一个关键字和一个可选的参数。这些关键字指定了该服务器支持的SMTP扩充。新的扩充将在一个RFC中描述并以IANA注册(在一个多行应答中,各行数字应答码的后面都要有一个连字符。最后一行的数字应答码后面跟一个空行)。

我们将给出到4个SMTP服务器的初始连接,其中3个支持扩充的SMTP。我们用Telnet和它们连接,但删掉了不必要的Telnet客户输出。

www.hj8828.com 21

这个服务器用一个多行220应答作为它的欢迎报文。对EHLO命令的250应答中列出的扩充命令是EXPN、SIZE和HELP。第一个和最后一个来自原来的RFC
821规范,但它们是可选命令。ESMTP服务器说明除了新命令外,它们还支持哪些可选的RFC
821命令。

这个服务器支持的SIZE关键字是在RFC 1427 [Klensin,Freed和Moore
1993]中定义的。它让客户在MAIL
FROM命令行中以字节的多少指定报文的大小,这样服务器就可以在客户开始发送该报文之前,验证它是否接收该长度的报文。增加这个命令的原因在于,随着对非ASCII码内容的支持,Internet邮件报文的长度在不断增大。

下一个主机也支持ESMTP,注意250应答指明支持包含一个可选参数的SIZE关键字。这表明该服务器将接受长度不超过461兆字节的报文。

www.hj8828.com 22

关键字8 BIT MIME来自于RFC 1426
[Klensin等,1993a]。它允许客户把关键字BODY加到MAIL
FROM命令中,指定正文中是否包含NVT
ASCII字符或8bit数据。除非客户收到服务器应答EHLO命令发来的8BITMIME关键字,否则禁止客户发送任何非NVT
ASCII字符(当我们在本节中谈到MIME时,我们将看到MIME不要求8bit传送)。

该服务器也通告了XADR关键字。任何以X开头的关键字都指的是本地SMTP扩充。

另一个服务器也支持ESMTP,通知了我们已经看到的HELP和SIZE关键字。它也支持三个以X开头的本地扩充。

www.hj8828.com 23

最后,我们将看到当客户试图通过向一个不支持EHLO的服务器发布EHLO命令来使用ESMTP时将发生什么。

www.hj8828.com 24

对EHLO命令,客户收到一个500应答而不是250应答。客户应发布RSET命令,并跟着一个HELO命令。

(SMTP)
服务的计算机上的端口25,以解决SMTP通信问题。默认情况下,SMTP 侦听端口
25。 您可以根…

 

28.4.2 首部变化:非ASCII字符

RFC 1522 [Moore 1993] 指明了一个在RFC
822报文首部中如何发送非ASCII字符的方法。这样做的主要用途是为了允许在发送方名、接收方名以及主题中使用其他的字符。

首部字段中可以包含编码字(coded word)。它们具有以下格式:

=?charset?encoding?encoded-text?=

charset是字符集规范。有效值是两个字符串us-ascii和iso-8859-x,其中x是一个单个数字,例如在iso-8859-1中的数字“1”。

encoding是一个单个字符用来指定编码方法,支持两个值。

1:Q编码意思是引号中可打印的(quoted-printable),目的是用于拉丁字符集。大多数字符是作为NVT
ASCII(当然最高位比特置0)发送的。任何要发送的字符若其第8比特置1则被作为3个字符发送:第1个是字符是“=”,跟着两个十六进制数。例如,字符é(它的二进制8bit值为0xe9)作为三个字符发送:=E9。空格通常作为下划线或三个字符=20发送。这种编码的目的在于,某些文本中除了大多数ASCII字符外,还有几个特殊字符。

2:B意思是以64为基数的编码。文本中的3个连续字节被编码成4个6bit值。用于表示所有可能的6bit值的64个NVT
ASCII字符如图28-6所示。当要编码的个数不是3的倍数时,等号符“=”被用作填充符。

下面两种编码方式的例子取自RFC 1522:

www.hj8828.com 25www.hj8828.com 26图28-6
6bit值的编码

能处理这些首部的用户代理将输出:

www.hj8828.com 27

为说明以64为基数的编码方法是如何工作的,我们看一下主题行中前面4个编码的字符:SWYg。按照图28-6写出这4个字符的6bit值(S=0x12,W=0x16,Y=0x18以及g=0x20)的二进制码:

010010 010110 011000 100000

然后把这24 bit重新分组成3个8bit字节:

www.hj8828.com 28

它们是I、f和空格的ASCII表示。

 

28.4.3 正文变化:通用Internet邮件扩充

我们已经提到RFC 822指定正文是NVT ASCII文本行,没有结构。RFC 1521
[Borenstein和Freed 1993]
把扩充定义为允许把结构置入正文。这被称为MIME,即通用Internet邮件扩充。

MIME不要求任何扩充,我们在本节前面已作了说明(扩充的SMTP或非ASCII标题)。MIME正好加入了一些告知收件者正文结构的新标题(与RFC
822相一致)。正文仍可以用NVT
ASCII码来发送,而不考虑邮件内容。虽然我们前面所述的一些扩充可能会和MIME合在一起产生好的效果—扩充的SMTP
SIZE命令,因为MIME报文能变得很长,以及非ASCII标题—这些扩充并不是MIME所要求的。与另一方交换MIME报文所需的一切,就是双方都要有一个能够理解MIME的用户代理。在任何一个MTA中不需要做任何改变。

MIME定义这5个新标题字段如下:

www.hj8828.com 29www.hj8828.com 30

作为例子,下面两个标题行可以出现在一个Internet邮件报文中:

www.hj8828.com 31

当前MIME版本是1.0,内容类型是无格式ASCII码文本,即Internet邮件的默认选择。PLAIN这个字被认为是内容类型的一个子类型,字符串charset=US-ASCII是一个参数。

Text是MIME的7个被定义的内容类型之一。图28-7总结了RFC 1521
中定义的16个不同的内容类型和子类型。对具体的内容类型和子类型来说都有指定的很多参数。

www.hj8828.com 32图28-7
MIME内容类型和子类型

内容类型和用于内容的传送编码是相互独立的。前者由首部字段Content-Type指明,后者由首部字段Content-Transfer-Encoding指明。在RFC
1521中定义了5种不同的编码格式。

1:7bit,是默认的NVT ASCII;

2:quoted-printable,我们在前面的一个例子中看到有非ASCII首部。当字符中只有很少一部分的第8bit置1时非常有用;

3:base64,如图28-6所示;

4:8bit,包含字符行,其中某些为非ASCII字符且第8bit置1;

5:binary编码,无需包含多行的8 bit数据。

对RFC 821
MTA,以上5种编码格式中只有前3种是有效的。因为这3种产生只包含NVTASCII字符的正文。使用有8BITMIME支持的扩充SMTP允许使用8bit编码。

尽管内容类型和编码是独立的,RFC
1521推荐有非ASCII数据的text使用quoted-printable,而image、audio、video和octet-stream
application使用base64。这样允许与符合RFC
821的MTA保持最大的互操作性。而且,multipart和message内容类型必须以7bit编码。

作为一个multipart内容类型的例子,图28-8显示了一个来自RFC发布清单的邮件报文。子类型是mixed,意思是各部分是顺序处理的,各部分的边界是字符串NextPart,其前面是行首的两个连字符。

每个边界上可跟一行用于指明下一部分首部字段。忽略报文中第1个边界之前和最后一个边界之后的所有内容。

因为在第一个边界后面跟着一个空行,而不是首部,所以在第1个和第2个边界之间的数据的内容类型被假定为具有us-ascii字符集的text/plain。这是新RFC的文字描述。

但是第2个边界后面跟着首部字段。它指定了另一个multipart报文,具有边界OtherAccess。子类型为alternative,有两种不同的选择。第1种OtherAccess选项是用电子邮件获取RFC,第2种选项是用匿名FTP获取。MIME用户代理将列出这两种选项,允许我们选择一个,然后自动地用电子邮件或匿名FTP获取一份复制的RFC。

www.hj8828.com 33图28-8
MIME multipart报文的例子

这一部分是MIME的一个简要概述。MIME的详细细节和例子,见RFC 1521和[Rose
1993]。

电子邮件包括在两端都有的一个用户代理以及两个或多个报文传送代理。可以把一个邮件报文分成三个部分:信封、首部和正文。我们已经看到这三个部分用SMTP和Internet标准是如何进行交换的。所有都作为NVT
ASCII字符进行交换。

我们也看到了一些新的扩充:用于信封和非ASCII首部的扩充SMTP,以及使用MIME的正文增加了结构。MIME的结构和编码允许使用已有的7bit
SMTP MTA交换任意二进制数据。

若要使用 Telnet 端口 25 连接到目标 SMTP 服务器,必须使用 SMTP
服务器的完全限定域名 (FQDN) 或 IP 地址。如果 FQDN 或 IP
地址未知,查找此信息的最简便方法是使用 Nslookup 命令行工具查找目标域的
MX 记录。

注意:
组织的内部网络规定的防火墙或 Internet 代理限制可能会阻止您使用 Nslookup 工具查询 Internet 上的公用 DNS 服务器。 MX 记录不是 Exchange 组织内的内部邮件流绝对必需的。如果要在组织中查找任何集线器传输服务器或已订阅边缘传输服务器的 FQDN,则可以使用 Exchange 命令行管理程序中的下列命令:Get-ExchangeServer | where {$_.isHubTransportServer -eq $true -or $_.isEdgeServer -eq $true} | Format-List Fqdn,ServerRole 有关详细信息,请参阅 Get-ExchangeServer 和 管道传输。