読者です 読者をやめる 読者になる 読者になる

PHP5.6でSMTP送れない件

お久しぶりの投稿です。

EC CUBEを扱ってる際、php5.6にしてからメールが届かなくなっている現象に遭遇しました。

一見エラーは何も発生してないが、data/logs/error.log には、

[/forgot/index.php] Warning(E_USER_WARNING): メール送信に失敗しました。[ authentication failure [SMTP: STARTTLS failed (code: 220, response: Ready to start TLS)]] on [/Applications/    MAMP/htdocs/honeybaked/data/class/SC_SendMail.php(310)] from ::1↲


今回ひっかかったのが、「PHP 5.6.x における OpenSSL 関連の変更」


php5.6からピア証明書が必須に。。orz


証明書作って設定すれば良いと思うが、今回は設定を変えて対応しました。


場所は、data/module/Net/Socket.php(646)


Before:

<?php

...

    function enableCrypto($enabled, $type)
    {
        if (version_compare(phpversion(), "5.1.0", ">=")) {
            if (!is_resource($this->fp)) {
                return $this->raiseError('not connected');
            }
            stream_context_set_option($this->fp, 'ssl', 'verify_peer_name', false);
            return @stream_socket_enable_crypto($this->fp, $enabled, $type);// 問題の場所
        } else {
            $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0';
            return $this->raiseError($msg);
        }
    }


After:

<?php

...

    function enableCrypto($enabled, $type)
    {
        if (version_compare(phpversion(), "5.1.0", ">=")) {
            if (!is_resource($this->fp)) {
                return $this->raiseError('not connected');
            }

            stream_context_set_option($this->fp, 'ssl', 'verify_peer_name', false);// ←ここで書き換え!!
            
            return @stream_socket_enable_crypto($this->fp, $enabled, $type);// 問題の場所
        } else {
            $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0';
            return $this->raiseError($msg);
        }
    }


別に、上記の場所でなくてもどっかしらでやってあげれば問題ないと思います。


以上でーす。



参考:
PHP: PHP 5.5.x から PHP 5.6.x への移行 - Manual