我正在使用 Windows Server 2019 设置一个新的专用服务器。它将替换基于 Windows Server 2008 R2 的旧服务器。我已经在旧服务器上运行了内置 SMTP 服务器,没有任何问题。我已经将新服务器设置为充当 SMTP 服务器,使用我自己设置旧服务器的笔记,并在线仔细检查说明。基本上按照此处的说明:
http://www.vsysad.com/2017/05/install-and-configure-smtp-server-on-windows-server-2016/
我遇到的问题是电子邮件不会离开 C:\inetpub\mailroot\Queue,并且永远不会到达收件人。Windows 事件日志包含以下警告:
事件 4006,smtpsvc
“向主机‘204.79.197.212’传送邮件时失败,同时向远程域‘hotmail.com’传送邮件,原因如下:远程服务器未响应连接尝试。”
以上只是使用 Hotmail 目标地址的示例。尝试发送到其他域上的地址时也会收到相同类型的消息。
我尝试过的:
- 我使用 Telnet 手动发送了电子邮件。电子邮件由本地 SMTP 服务器创建并接收,没有任何问题,但并未离开队列文件夹。
- 我已经针对 Hotmail 和 Gmail 地址运行了 SmtpDiag。没有问题。MX 记录按预期列出。
- 我已经使用 Nslookup 并确认 MX 记录已解析。
- 我已成功使用 Telnet 连接到 Hotmail 和 Gmail SMTP 服务器。
- 我使用过 Wireshark,发现我的服务器只尝试访问目标电子邮件地址域的 IP 地址(端口 25)。因此,对于 Hotmail,它只是解析 hotmail.com 的 IP 地址(即 204.79.197.212)并尝试在端口 25 打开到该地址的连接。这显然会失败,因为那里没有 SMTP 服务器。我的服务器甚至从未尝试访问 MX 记录中指定的地址的 SMTP 服务器。
上面最后一项还与我注意到的一件有趣的事情有关,即事件 4006 消息中列出的 IP 地址不是 MX 记录中列出的 IP 地址之一。它是实际 hotmail.com 域的 IP 地址。那么,为什么它试图联系 hotmail.com 而不是 MX 记录中列出的地址之一呢?
为了进一步调查,我使用 Telnet 向我自己的一个域中的电子邮件发送了一封电子邮件。果然,我在日志中发现了一个 4006 事件,内容如下:
“向主机‘[我的域的 IP]’传送消息时,由于以下原因向远程域‘[我的域]’传送消息失败:远程主机断开了连接。”
再次出现这种情况:SMTP 服务器正在尝试连接到我的域的 IP 和端口 25,而不是 MX 记录中指定的地址。
我只能做到这些了。也许我误解了某些内容,但看起来 Windows 的 SMTP 服务器确实试图直接在端口 25 上连接到电子邮件地址的域(忽略 MX 记录)... 大家知道我可能做错了什么吗?或者我应该如何进行故障排除?
编辑:找到了解决方法以及引发问题的原因。请参阅下面的回答。
答案1
我继续调查此问题,现在认为这是 Windows Server 2019 中的一个错误。事实上我已经找到了解决办法以及如何 100% 确定地重现此问题。
如果将 SMTP 服务启动类型设置为“自动”(即启动时立即启动),则无法正确发送邮件。但是,如果将 SMTP 服务设置为手动启动,然后从 services.msc 或 IIS6 管理器手动启动,则电子邮件将离开队列并传递给收件人。
如果服务使用“自动”启动,任何发送电子邮件的尝试都将导致电子邮件卡在队列中,并且事件 4006(有关详细信息,请参阅初始帖子)被写入事件日志。这在我的测试中 100%可重现。
解决方法是将启动类型设置为“自动(延迟启动)”。如果我没听错的话,这将导致 SMTP 服务在最后一个“自动”服务启动 2 分钟后启动。这不是最佳解决方案,但暂时可以做到。
为了完整起见,下面是重现该问题的分步说明:
- 安装 SMTP 服务器功能
- 进入IIS6管理器,右键单击SMTP虚拟服务器,然后单击“属性”
- 转到“访问”选项卡
- 点击“连接...”,选择“仅以下列表”,添加127.0.0.1,点击“确定”。
- 点击“中继...”,选择“仅以下列表”,添加 127.0.0.1。取消选中窗口底部的复选框。点击“确定”。
- 再次单击“确定”退出 SMTP 虚拟服务器属性。
- 打开 services.msc,将“简单邮件传输协议 (SMTP)”服务启动类型设置为“自动”
- 重新启动计算机并尝试发送电子邮件
注意:步骤 2 至 6 可能不需要重现该问题,但这是我一直使用的的基本设置。
答案2
如果机器是托管在Azure。在我尝试了 MrFika 的上述建议后,我还是没有成功。问题似乎是因为 Microsoft 针对 Azure VM 订阅的规则:
从 2017 年 11 月 15 日开始,从虚拟机 (VM) 直接发送到外部域(如 outlook.com 和 gmail.com)的出站电子邮件仅对 Azure 中的某些订阅类型可用。使用 TCP 端口 25 的出站 SMTP 连接已被阻止。(端口 25 主要用于未经身份验证的电子邮件传递。)
此行为变化仅适用于 2017 年 11 月 15 日之后创建的订阅和部署。
微软文章在这里: 排除出站 smtp 连接故障
答案3
就我的情况而言,结果是 AWS 阻止电子邮件离开服务器。
“重要提示:Amazon Elastic Compute Cloud (Amazon EC2) 默认限制所有 EC2 实例在端口 25 上的 Amazon Virtual Private Cloud (Amazon VPC) 出站流量。如果您的应用程序需要 SMTP 端口 25 上的流量,您可以请求删除此限制。”