13

SMTP エラー: SMTP ホストに接続できませんでした。メッセージを送信できませんでした。

メーラー エラー: SMTP エラー: SMTP ホストに接続できませんでした。

PHPMailer を CentOS で動作させる方法が見つからないようです。メールは Windows では XAMPP で問題なく動作しますが、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;
}

ソケットを開けないようです...

更新: $mail->SMTPDebug = 2; の使用。アルバロが提案したように、次の出力が生成されました。

SMTP -> エラー: サーバーへの接続に失敗しました: 権限が拒否されました (13)

4

2 に答える 2

42

OS CentOS 6.3

メールを送信できませんでした

SELinuxが通信をブロックしていることがいくつかの調査で判明した後

SELinux はデフォルトで有効化され、設定されています。そのため、SELinux では、Apache (httpd、phpmailer) が sendmail 機能を使用して、あらゆる種類のネットワーク接続を確立することを許可していません。

getsebool コマンドを使用して、httpd デーモンがネットワーク経由で接続を確立し、電子メールを送信できるかどうかを確認できます。

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 が正しく動作するかどうかを確認できます。

于 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 に答える