Help us understand the problem. What is going on with this article?

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

satthi
fusic
個性をかき集めて、驚きの角度から世の中をアップデートしつづける。
https://fusic.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away