PHP5.6でSMTPのhostがsslの場合に注意!
問題
CakePHP2でシステムを普通に構築して、普通にSMTPでメール送信機能を実装して、リリースしたらメールが飛ばない!と連絡が。。。
ログを見ると
Error: [SocketException] stream_socket_client(): SSL operati
on failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify faile
d
stream_socket_client(): Failed to enable crypto
stream_socket_client(): unable to connect to ssl://○○.jp:465 (Unknown error)
なんかSSL周りのエラーが・・・。
実は、その直前に同一サーバに乗っている別案件で同じことが起きてて、その案件ではPHPMailerを使用していたので下記記事で対応してました。
今回はCakeEmailだったんですが、CakeEmailでは情報があまりなかったので、色々掘り返したところ。。。
原因
PHP5.6からSSL コンテキストオプションのverify_peerのデフォルト値がtrueになっています。。。
開発環境も5.6に合わせていると思ってたら5.5だったよママン・・・
このオプション、証明書の認証を必須とするオプションなんですが、ローカルに証明書を持っていないといけないっぽい。。。
SMTP情報を貰う際に証明書とか貰わないよ・・・。
CakeEmailの場合の対応策
public $smtp = array(
'transport' => 'Smtp',
'from' => array('site@○○.jp' => 'My Site'),
'host' => 'ssl://○○.jp',
'port' => 465,
'timeout' => 30,
'username' => 'user',
'password' => 'secret',
'client' => null,
'log' => false,
//'charset' => 'utf-8',
//'headerCharset' => 'utf-8',
//ここから
'context' => array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
)
//ここまで
);
Cookbookにも情報が見当たらなくて結局ソースから書き方を発掘しました・・・。