前提・実現したいこと
PEAR::Mailでメールを送信するPHPプログラムが、以前は送信されたものが、失敗するようになりました。
メールサーバ側(バージョンアップや調子が悪い時があった)が原因かも知れませんが、
プログラム側の変更で送信できるようにしたいです。
動作環境
RHEL 7.9
Apache:2.4.6
PHP 5.4.16
PEARのインストール状況は以下の通り。
# pear list Installed packages, channel pear.php.net: ========================================= Package Version State Archive_Tar 1.4.14 stable Console_Getopt 1.4.3 stable Mail 1.4.1 stable Mail_Mime 1.10.11 stable Mail_mimeDecode 1.5.6 stable Net_SMTP 1.10.0 stable Net_Socket 1.2.2 stable PEAR 1.10.1 stable Structures_Graph 1.1.1 stable XML_Util 1.4.5 stable
発生している問題・エラーメッセージ
デバッグ内容
DEBUG: Recv: 220 XXXXX.net ESMTP Postfix DEBUG: Send: EHLO localhost DEBUG: Recv: 250-XXXXX.net DEBUG: Recv: 250-PIPELINING DEBUG: Recv: 250-SIZE XXXXX DEBUG: Recv: 250-ETRN DEBUG: Recv: 250-STARTTLS DEBUG: Recv: 250-AUTH PLAIN LOGIN DEBUG: Recv: 250-AUTH=PLAIN LOGIN DEBUG: Recv: 250-ENHANCEDSTATUSCODES DEBUG: Recv: 250-8BITMIME DEBUG: Recv: 250 DSN DEBUG: Send: STARTTLS DEBUG: Recv: 220 2.0.0 Ready to start TLS DEBUG: Send: RSET DEBUG: Send: QUIT
送信結果のエラー(getMessage()の取得内容)
authentication failure [SMTP: STARTTLS failed (code: 220, response: 2.0.0 Ready to start TLS)]
該当のソースコード
関数化しているところを抜粋しているので、多少変数の辻褄が合わないかも知れませんが、ご了承ください。
php
1date_default_timezone_set('Asia/Tokyo'); 2 3$mail_subject = "XXXXXXXXXX; 4 5require_once ("Mail.php"); 6 7mb_language("Japanese"); 8mb_internal_encoding("UTF-8"); 9 10$params = array ( 11 "host" => 'XXXXX', 12 "port" => 587, 13 "auth" => true, 14 "debug" => true, 15 "username" => 'XXXXX', 16 "password" => 'XXXXX' 17); 18 19$mailObject = Mail::factory ( "smtp", $params ); 20 21$recipients = 'XXXXX'; 22 23$headers = array ( 24 "MIME-Version" => "1.0", 25 "Content-Type" => "text/plain; charset=ISO-2022-JP", 26 "Content-Transfer-Encoding" => "7bit", 27 "To" => $email_to, 28 "From" => $email_from, 29 "Subject" => mb_encode_mimeheader( $mail_subject ) 30); 31 32$body = 'XXXXX'; 33 34$body = mb_convert_encoding($body, "ISO-2022-JP-MS", "UTF-8"); 35 36$r = $mailObject->send ( $recipients, $headers, $body ); 37 38if (PEAR::isError($r)) { 39 echo($r->getMessage()); 40}
試したこと
$paramsの内容を以下に変更してみましたが、同じエラーでした。
php
1'auth' => "PLAIN", 2'socket_options' => array('ssl' => array('verify_peer_name' => false)),
補足情報
認証情報(メールサーバ、メールアドレス、パスワード)は日常的に使用しているものです。
設定やパスワードも変更していません。
他のメールアカウント(同じドメイン)に変えても、同じエラーでした。
追記1
mailxコマンドを使って、以下の設定で送信できることを確認しました。
# cat ~/.mailrc set smtp=smtp://XXXXX.com:587 set from=XXXXX@XXXXX.jp set smtp-auth-user=XXXXX@XXXXX.jp set smtp-auth-password="XXXXX" set smtp-use-starttls set nss-config-dir=/etc/pki/nssdb/ set ssl-verify=ignore # echo "TEST" | mailx -v -s "SUBJECT" XXXXX@XXXXX.jp
最初set ssl-verify=ignore
がない状態ではPeer's certificate issuer is not recognized.
というエラーで送信不可でした。
このことから、/usr/share/pear/Net/Socket.php
を以下の通りに修正し、自己証明を無効化して再度PHPプログラムの送信を試したのですが、同じエラーでした。
PHP
1 public function enableCrypto($enabled, $type) 2 { 3 if (version_compare(phpversion(), '5.1.0', '>=')) { 4 if (!is_resource($this->fp)) { 5 return $this->raiseError('not connected'); 6 } 7 8 stream_context_set_option($this->fp, 'ssl', 'verify_peer', false); //追加 9 stream_context_set_option($this->fp, 'ssl', 'verify_peer_name', false); //追加 10 11 return @stream_socket_enable_crypto($this->fp, $enabled, $type); 12 } else { 13 $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0'; 14 15 return $this->raiseError($msg); 16 } 17 }
回答1件
あなたの回答
tips
プレビュー