Edited at

PHP5.6でSMTPのhostがsslの場合に注意!

More than 3 years have passed since last update.


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を使用していたので下記記事で対応してました。

http://stackoverflow.com/questions/26827192/phpmailer-ssl3-get-server-certificatecertificate-verify-failed

今回はCakeEmailだったんですが、CakeEmailでは情報があまりなかったので、色々掘り返したところ。。。


原因

http://php.net/manual/ja/context.ssl.php

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にも情報が見当たらなくて結局ソースから書き方を発掘しました・・・。