在我公司决定更改网站后,我们从旧的 ASP.NET 网站切换到用 Drupal(php) 创建的新网站。该网站在 IIS7.5 上本地运行,并且我们在端口 25 上也有虚拟 SMTP 服务器。
问题是新网站无法发送电子邮件(旧网站可以发送电子邮件。我不知道具体是怎么回事)。这个问题与 Drupal 无关,因为即使使用最简单的 PHP 脚本也无法发送邮件。
SMTP 服务似乎在 TCP 端口 25 上运行(使用 netstat 命令检查)但当我尝试
telnet localhost 25
我收到此消息:
Could not open connection to the host, on port 25: Connect failed
当我运行telnet 127.0..0.1 25
和telnet MERCURY 25
我在不同的端口(28)上创建了新的 VSMTP 服务器,并且配置了批准的中继和一些其他选项。
- 命令
telnet localhost 28
返回空白页(单击任意按钮后我都会回到开头) - 命令
telnet 127.0.0.1 28
也返回空白页,但是 当我尝试“telnet MERCURY 28**”时,我终于看到了我期望的消息
220 predrag Microsoft ESMTP MAIL Service, Version: 7.5.7600.16601 ready at Fri, 3 Oct 2014 10:29:01 +0200
这里发生了什么?这些 telnet 命令之间有什么区别?我应该对 PHP.Ini 文件进行哪些设置才能使用 php 网站发送电子邮件?我尝试了许多不同的选项,但都不起作用。
另外从配置来看,我们有 McAfee 防病毒软件、具有开放端口的 Windows 防火墙、php 版本是 5.2、Windows Server 2008 R2 并且我的计算机名称是 MERCURY。
答案1
对于端口 25 上无法运行的服务,可能是因为该服务已配置但实际上并未启动,或者某些东西(防病毒软件或本地防火墙?)阻止它在端口 25 上访问(这里我们有 McAfee VirusScan,它的一个功能实际上是阻止未列出的应用程序连接到端口 25 上的任何内容...)。您是否在本地安装了防病毒软件或其他安全软件?您是否尝试过重新启动(SMTP 服务器或计算机本身)?您是否检查过 SMTP 服务的启动日志(在端口 25 上配置时)以查看是否存在任何启动错误?
对于仅在端口 28 上使用 MERCURY(计算机名称)而不使用 127.0.0.1 的服务,看起来该服务仅绑定到网络接口,而不绑定到环回接口。这应该可以在 SMTP 服务的配置中更改,但是如果您找不到任何选项,则可以将 PHP 配置为使用 MERCURY 而不是 127.0.0.1 作为服务器(尽管,如果服务器仅供本地使用,则好多了绑定它仅有的到环回接口,因此无法从网络访问 - 避免暴露未使用的服务通常是避免安全问题的良好做法。您是否将 127.0.0.1 添加到访问列表中?(检查此处的第 15 点:http://www.vsysad.com/2012/04/setup-and-configure-smtp-server-on-windows-server-2008-r2/)
答案2
可能是您的 PHP.INI 中的 SMTP 配置不正确。请检查。并确保您正在编辑 IIS 正在加载的文件。有时这可能很难弄清楚。
但是-如果您可以稍微更改一下代码...
我发现使用类似这样的网络服务从我的网站发送事务性消息要容易得多邮戳、Amazon SES 或发送网格。您不必费心处理端口 25 或防火墙。您的开发和测试设备可以使用与生产系统相同的代码和服务。而且任何服务器上的设置工作都更少 — 无需 SMTP 服务器,无需额外端口。
哦。我有没有提过你根本不需要访问端口 25(或任何 SMTP)?你可以使用其中一个 Web 服务通过普通 HTTPS 发送邮件;就像任何其他 Web 服务一样。
只需确保对开发、测试和生产系统使用不同的 API 密钥即可。不要将 API 密钥或任何密码签入源代码控制。