Не удалось подключиться к хосту SMTP.

Ошибка SMTP: не удалось подключиться к узлу SMTP. Сообщение не может быть отправлено.

Ошибка Mailer: ошибка SMTP: не удалось подключиться к узлу SMTP.

Я не могу найти способ заставить PHPMailer работать в CentOS. Почта работает очень хорошо под Windows с XAMPP, но я всегда получаю эту ошибку в Linux.

SMTP-сервер - это прослушивание Lotus Domino на порту 25, у компьютера CentOS нет никакого брандмауэра, и странно, что даже почта() не работает. Он ничего не возвращает (в то время как в Windows возвращается 1). Если я отправлю электронное письмо через telnet через CentOS-сервер, он работает нормально, поэтому я не думаю, что это сетевая проблема. Он должен быть связан с PHP, но я не знаю, как это сделать.

<?php
require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = "192.168.x.x";
$mail->SMTPAuth = false;
$mail->From = "[email protected]";
$mail->FromName = "XXX";
$mail->AddAddress("[email protected]");
$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)

Ответ 1

Вы можете включить режим отладки с помощью свойства SMTPDebug, например:

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

Сообщения об ошибках будут отображаться на экране.

Update:

Разрешение отклонено сообщение об ошибке с помощью fsockopen() предполагает, что пользователь PHP работает так, как не разрешено открывать сокет. Если вы дважды проверили, что нет брандмауэра, возможно, что проблема SELinux: -?

Ответ 2

ОС CentOS 6.3

Не удалось отправить электронные письма

после того, как какой-то reserch выяснил, что SELinux блокирует связь

SELinux активируется и настраивается по умолчанию. Поскольку SELinux не позволяет Apache (httpd, phpmailer) использовать функцию sendmail и делать какие-либо сетевые подключения.

Используя команду getsebool, мы можем проверить, разрешено ли HTTP-демонам устанавливать соединение по сети и отправлять электронное письмо.

getsebool httpd_can_sendmail
getsebool httpd_can_network_connect

Эта команда вернет логическое включение или выключение. Если его выключить, мы можем установить его, используя следующее:

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

Теперь вы можете протестировать свой php, код, чтобы убедиться, что SendMail работает правильно или нет.