使用 SMTP 发送电子邮件
Duwamish Online
Aaron Ching
Microsoft Developer Network
2000年12月
摘要:本文讨论使用 Internet 信息服务 (IIS) 提供的简单邮件传输协议 (SMTP) 服务发送电子邮件的优点。文中同时讲述了配置和测试 Duwamish Online 服务的情况。
简介
Duwamish Online 应用程序向客户发送电子邮件,通知其订单状态;向操作小组成员发送电子邮件,帮助他们监视应用程序的运行情况。该应用程序使用 Microsoft® Windows® 2000 中的 Internet 信息服务 (IIS) 提供的简单邮件传输协议 (SMTP) 服务。其原因是 SMTP 能够非常容易地处理应用程序消息传递需求,并保证在借助功能齐备的消息传递系统(如 Microsoft® Exchange Server)的情况下,既能使用我们的 Internet 服务提供商 (ISP)(即 Microsoft 信息技术组)提供的外部电子邮件服务器,也能使用我们自己的电子邮件服务器。
由于功能齐备的消息传递系统可为接收和待发电子邮件的处理提供一整套服务,因此对于仅使用电子邮件系统处理待发邮件的站点来说,Windows 2000 中的 SMTP 服务是更具成本效益的解决方案(随操作系统免费附送)。
我们将在本文中讲述 DuwamishOnline.com 的 SMTP 服务配置和测试。不过,将首先简要介绍一下 SMTP 的工作方式。
SMTP 的工作方式?
简单邮件传输协议是核心 Internet 协议 (IP) 之一,其设计主旨是可靠有效地传输电子邮件。
SMTP 的最初构想相对来说比较简单。用户或应用程序(此处为 Duwamish Online)撰写邮件,其中包含收件人电子邮件地址(例如 "[email protected]")、邮件主题及邮件内容。
传递邮件的第一步是将邮件传送至指定的 SMTP 服务器。SMTP 服务器根据收件人电子邮件地址的域名(例如 "somecompany.com"),开始与域名系统 (DNS) 服务器通信,DNS 服务器将查找并返回该域的目标 SMTP 服务器的主机名(例如 "mail.somecompany.com")。
最终,启动邮件传递的 SMTP 服务器将通过传输控制协议 / Internet 协议的端口 25 直接与目标 SMTP 服务器进行通信。如果收件人电子邮件地址的用户名与目标服务器中的一个授权用户帐户匹配,则原始电子邮件将最终传送至该服务器,等待收件人通过客户程序收取。
如果启动邮件传递的 SMTP 服务器无法与目标服务器直接通信,则 SMTP 协议能够提供通过一个或多个中继 SMTP 服务器传送邮件的机制。中继服务器将接收原始邮件,然后尝试将其传递至目标服务器,或重定向至另一中继服务器。此过程将一直重复,直到邮件传递至目标服务器,或超过指定的超时时间为止。
在 Windows 2000 中设置 SMTP
从 Microsoft Windows NT® 的以前版本开始,SMTP 服务就一直作为 Internet 信息服务的一个组件。由于 SMTP 服务在 Duwamish Online 中主要用来处理容量相对较小的待发电子邮件(用于确认订单),所以在业务初期不必专门用一台计算机来实现此功能。最后,我们决定将 SMTP 服务放在订单处理服务器上,该服务器已连接到外部的 Internet 网段。
下面是用来为 Duwamish Online Web 站点设置 SMTP 服务的步骤。
安装 SMTP 服务
若要安装 SMTP 服务,请执行以下操作:从开始菜单,指向设置\控制面板。双击添加/删除程序,单击添加/删除 Windows 组件,然后单击组件按钮。
“在 Windows 组件向导”中选择 Internet 信息服务 (IIS),然后单击详细信息。选择 SMTP 服务组件,然后单击确定。
注要支持 SMTP 服务,还需要其他几个 IIS 组件。它们是 Internet 信息服务管理单元、万维网服务器和公用文件组件。这些组件均是自动选定的,且随 SMTP 服务组件一起安装。
配置 SMTP 服务
如果 SMTP 服务安装在连接 Internet 的主机上,且面向 Internet 的防火墙不阻止 SMTP 通信访问端口 25,则 SMTP 服务的默认设置应能传递所有待发电子邮件。不过,可能仍有一些要为 SMTP 服务器考虑的安全设置。其中大多数设置都可通过“Internet 服务管理器”管理控制台进行更改。
若要启动 IIS 管理控制台,请执行以下操作:从开始菜单,指向程序\管理工具。
单击 Internet 服务管理器以启动管理控制台。
若要设置服务器日志记录,请执行以下操作:在 Internet 信息服务对话框的左侧窗格中展开目录树。用鼠标右键单击默认 SMTP 虚拟服务器,然后选择属性。
在属性对话框中单击常规选项卡。为该服务器选中启用日志记录复选框。默认情况下不启用该属性。
选择首选的日志文件格式。默认设置为 W3C 扩充日志文件格式。
单击日志文件格式下拉菜单旁边的属性按钮。
如果需要,请调整日志文件翻转的时间安排和文件名。
单击扩展属性选项卡。
选择任何感兴趣的项,然后单击确定。
注为了限制日志文件的大小,不应选择过多的项。此处建议了一些可能有用的项:日期、时间、客户 IP 地址、用户名、服务名、方法、发送字节数以及接收字节数。
若要设置访问控制,请执行以下操作:在属性对话框中单击访问选项卡。单击中继按钮,控制可将电子邮件中继至 SMTP 服务器的计算机。
在中继限制对话框中单击添加。
在计算机对话框中输入允许通过 SMTP 服务器中继电子邮件的计算机 IP 地址。单击确定应用更改。
注如果待发邮件从同一台计算机发送到 SMTP 服务器,则中继权限的默认设置将能很好地工作。不过,如果邮件从另一台计算机发出,则需要将该计算机的 IP 地址或域名添加到权限列表中,以使中继正常工作。
指定智能主机进行中继
如果 SMTP 服务器位于阻止所有直接 SMTP 通信(通过端口 25)的防火墙之后,则需查找网络上是否有允许将所有 SMTP 邮件中继至 Internet 的智能主机。
从根本上说,智能主机可以是另一台具有待发电子邮件中继权限的 SMTP 服务器,它将邮件从其他内部 SMTP 服务器直接中继至 Internet。因此,智能主机应能同时连接内部网络和 Internet,这样才能充当电子邮件网关。
识别出网络上的智能主机后,即可设置 SMTP 服务器。
若要设置 SMTP 服务器,请执行以下操作:在属性对话框中单击传递选项卡,然后单击高级按钮,打开高级传递对话框。
在智能主机字段中键入智能主机完全合格的域名 (FQDN)。或者输入智能主机的 IP 地址,并在前后都加上 [ 和 ],如“[10.10.10.1]”。[] 有助于加快 DNS 的查询进程。
单击确定完成上述更改。
验证 SMTP 服务
有多种方式可验证 SMTP 服务是否工作正常。
通过电子邮件客户程序进行测试
首先,可选择使用标准的 Internet 电子邮件客户程序(如 Microsoft Outlook® Express)进行快速验证。找到可指定待发电子邮件 (SMTP) 服务器的位置,将其更改为新的 SMTP 服务器域名。向通常使用的电子邮件地址发送测试邮件,验证发送是否正常。
通过收取目录进行测试
也可以撰写一个符合 SMTP 规范 (RFC 822) 的简单电子邮件文本文件。下面是在记事本中输入的示例文本文件内容:
From:[email protected]
Subject:testing
This is the test message body.
只需将该文本文件复制或移到安装了 SMTP 的收取目录中。(默认路径应为 "root:\Inetpub\mailroot\Pickup"。)SMTP 服务会定期检查收取目录,并尝试发送在该目录中找到的所有邮件。验证是否能在目标收件箱中收到该测试邮件。
有关正确格式化邮件应遵循的 RFC 822 规范的详细信息,请参阅RFC 822 邮件格式。
通过 CDO 进行测试
验证 SMTP 服务的另一方式是使用 Windows 2000 协作数据对象 (CDO) 编写简单的 Microsoft Visual Basic® Scripting Edition (VBScript) 脚本。
CDO for Windows 2000(a.k.a. CDO 2.0 或 Cdosys.dll)是一套设计用来简化 Internet 邮件创建或处理的协作组件。有了 CDO,开发人员可以不必编写自己的 SMTP 通信代码,而是使用 CDO 收发使用 SMTP 协议的邮件,也可通过本地收取目录收发邮件。有关详细信息,请参阅 CDO for Windows 2000 的相关文章。
下面是一个 VBScript 示例,说明如何使用 CDO 通过 SMTP 服务传递邮件:
set msg = WScript.CreateObject("CDO.Message")
msg.From = "[email protected]"
msg.To = "[email protected]"
msg.Subject = "testing"
msg.TextBody = "This is a test message body."
msg.Configuration.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtpserver.mydomain.com"
msg.Configuration.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
msg.Configuration.Fields.Update
msg.Send
上述代码示例的前五行创建 CDO 对象,并指定邮件的基本信息。
接下来的两行代码使用 CDO Configuration 对象设置各配置设置的字段值。每个字段由两部分组成:名称空间前缀(如 "http://schemas.microsoft.com/cdo/configuration/")和本地名称(如 "smtpserver")。
该机制基于万维网联盟 (W3C) 的 XML 格式的名称空间推荐标准 (
字段 "smtpserver" 指定 SMTP 服务器的域名(或 IP 地址),而字段 "sendusing" 定义应使用本地 SMTP 服务投信目录发送邮件,还是通过网络直接发送至 SMTP 服务器。后一字段的值设置为 2,表示通过网络将邮件发送至指定的 SMTP 服务器。
最后两行代码更新配置设置,并启动邮件传递。
使用 CDO 组件的这一方法对于验证 SMTP 服务来说可能显得多余。不过,该脚本经证明对其他系统管理任务很有用。例如,当某些系统计数器超出指定阈值时,可在为电子邮件通知编写的“性能日志和警报”程序中使用该脚本。
识别失败的传递
无论因何种原因而无法传递电子邮件时(例如,用户名或电子邮件地址错误),都会将该传递失败的邮件重定向至死信目录。死信目录的默认位置应为 "root:\Inetpub\mailroot\Badmail"。检查被拒电子邮件的内容,并查找是否有任何特定的错误消息。如果可能,则更正错误,并再次通过上面讨论的一种传递方法重发邮件。
除死信目录外,电子邮件也可在队列目录中保存一段指定时间。(此设置的指定方法为:在默认 SMTP 虚拟服务器属性对话框的传递选项卡中调整出站重试间隔。)如果因为网络繁忙或网络连接断开而无法立即传递邮件,邮件则会存储在队列目录中,并按指定间隔再次发送。如果 SMTP 在几次传递尝试不成功之后放弃传递,邮件将最终移至死信目录。
结论
Windows 2000 中的 Internet 信息服务提供的 SMTP 服务是一个简单且强大的组件,用它传递待发电子邮件非常划算。它使系统管理员不必再为实现可靠的 Internet 电子邮件传送而建立复杂的邮件传递系统。如果与 CDO for Windows 2000 一起使用,开发人员不用编写太多代码,即能实现 SMTP 通信。