Wordpress.org 服务器:PHP 无法访问 SMTP 端口,但 telnet 可以

Wordpress.org server: PHP cannot access SMTP ports but telnet can

我一直在 CentOS 6.6 机器上设置 Wordpress,我对这方面还很陌生。全新安装所有最新版本的 httpd、php、mySQL 和 Wordpress。

现在一切正常,除了使用 SMTP 发送电子邮件。我在 Wordpress 中安装了几个插件来配置 SMTP,但发送测试电子邮件总是导致错误,如 SMTP connect() failed。我已经确定我的凭据没问题。

我从命令行尝试了这些:

telnet smtp.gmail.com 25

openssl s_client -connect smtp.gmail.com:465

而且他们都毫无问题地将我连接到 gmail 的 smtp。由于不允许连接 Wordpress 的持续错误,最后我决定将 Wordpress 排除在外,并在我的服务器上创建了一个测试 php 文件,其中包含以下代码 returns a "not responding" 对于所有端口:

<?php
$host = 'smtp.gmail.com';
$ports = array(25, 465, 587);
foreach ($ports as $port)
{
$connection = @fsockopen($host, $port);

if (is_resource($connection))
{
    echo '<h2>' . $host . ':' . $port . ' ' . '(' . getservbyport($port, 'tcp') . ') is open.</h2>' . "\n";

    fclose($connection);
}

else
{
    echo '<h2>' . $host . ':' . $port . ' is not responding.</h2>' . "\n";
}
}

将上面的 php 脚本更改为 www.gmail.com 并添加端口 80 和 443 整齐地显示 80 和 443 是打开的,其余的是关闭的(这是有道理的,因为我正在看一个 www服务器),所以脚本似乎工作正常。

我猜这一定是 PHP 本身的问题,不允许我通过任何 SMTP 端口出去(因为我可以从 cmdline telnet 到这些端口)

我无法弄清楚 PHP 中的问题可能是什么。有人知道如何解决这个问题吗?

找到了我自己的答案 :) 事实上,每次我尝试从 PHP 访问任何 SMTP 端口时,audit.log 都会输入条目,这敲响了警钟:SELinux 是罪魁祸首。

暂时禁用 SELinux 使其再次运行:

echo 0 >/selinux/enforce

在证明有效之后,我使用以下方法重新启用了 SELinux:

echo 1 >/selinux/enforce

...最后我发现这个 cmd 会配置 SELinux 以允许 SMTP 通过 apache/PHP:

setsebool -P httpd_can_network_connect on

终于!我花了至少 8 个小时来解决为什么我可以使用 shell 而不是 WordPress 发送邮件。这解决了我的问题!

 $ sudo setsebool -P httpd_can_sendmail 1