13

SMTP 错误:无法连接到 SMTP 主机。无法发送消息。

邮件程序错误:SMTP 错误:无法连接到 SMTP 主机。

我似乎找不到让 PHPMailer 在 CentOS 下工作的方法。邮件在带有 XAMPP 的 Windows 下工作得很好,但在 Linux 下我总是得到这个错误。

SMTP 服务器是侦听端口 25 的 Lotus Domino,CentOS 机器根本没有防火墙,奇怪的是即使 mail() 也不起作用。它什么也不返回(而在 Windows 上返回 1)。如果我通过 CentOS 服务器通过 telnet 发送电子邮件,它工作得很好,所以我认为这不是网络问题。它必须与PHP有关,但我不知道如何。

<?php
require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = "192.168.x.x";
$mail->SMTPAuth = false;
$mail->From = "xxx@xxx.it";
$mail->FromName = "XXX";
$mail->AddAddress("xxx@xxx.it");
$mail->IsHTML(true);
$mail->Subject = "Test";
$mail->Body    = "Test";
if(!$mail->Send())
{
   echo "Message could not be sent. <p>";
   echo "Mailer Error: " . $mail->ErrorInfo;
   exit;
}
echo "Message has been sent";
?>

只是为了澄清上面的代码适用于 XAMPP (Windows)。

我在 PHPMailer 上调试了错误,错误发生在这里(class.smtp.php 方法 Connect()):

$this->smtp_conn = @fsockopen($host,    // the host of the server
                             $port,    // the port to use
                             $errno,   // error number if any
                             $errstr,  // error message if any
                             $tval);   // give up after ? secs
// verify we connected properly
if(empty($this->smtp_conn)) {
  $this->error = array("error" => "Failed to connect to server",
                       "errno" => $errno,
                       "errstr" => $errstr);
  if($this->do_debug >= 1) {
    echo "SMTP -> ERROR: " . $this->error["error"] . ": $errstr ($errno)" . $this->CRLF . '<br />';
  }
  return false;
}

好像打不开Socket...

更新:使用 $mail->SMTPDebug = 2; 正如阿尔瓦罗所建议的那样产生了这个输出:

SMTP -> 错误:无法连接到服务器:权限被拒绝 (13)

4

2 回答 2

42

操作系统 CentOS 6.3

无法发送电子邮件

经过一些研究发现 SELinux 阻止了通信

SELinux 是默认激活和配置的。因此 SELinux 不允许 Apache (httpd,phpmailer) 使用 sendmail 功能并进行任何类型的网络连接。

使用 getsebool 命令,我们可以检查是否允许 httpd 恶魔通过网络建立连接并发送电子邮件。

getsebool httpd_can_sendmail
getsebool httpd_can_network_connect

此命令将返回一个布尔值 on 或 off。如果它关闭,我们可以使用以下方法将其设置为打开:

sudo setsebool -P httpd_can_sendmail 1
sudo setsebool -P httpd_can_network_connect 1

现在您可以测试您的 php、代码以查看 SendMail 是否正常工作。

于 2013-08-23T09:55:20.353 回答
12

您可以使用该属性启用调试模式SMTPDebug,例如:

$mail = new PHPMailer();
// 1 = errors and messages
// 2 = messages only
$mail->SMTPDebug  = 2;

错误消息将回显到屏幕上。

更新:

使用fsockopen()权限被拒绝错误消息表明用户 PHP 以不允许打开套接字的方式运行。如果您仔细检查是否没有防火墙,则可能是SELinux 问题:-?

于 2012-11-21T08:54:38.200 回答