技術メモ

CPI + Laravelのメール送信でめちゃくちゃハマった件について

環境

サーバー CPIシェアードプラン ACE01
PHP 7.2.20
Laravel 7.30.4

出力された例外

Swift_TransportException

Connection could not be established with host <メールサーバー名> :stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

解決策

php.iniのopenssl.cafileに証明書を設定する。
具体的には以下の通り。

  1. まずはCPIに問い合わせてopenssl.cafileに設定するファイルパスをもらう(めんどくさい)
  2. /usr/home/<ユーザー名> 配下の任意の場所にphp.iniを配置し、以下を編集
    [openssl]
    openssl.cafile = <もらったファイルパス>

php.iniを配置すれば設定は即時反映されるのでメール送信できるはず。
設定を確認したい場合は、phpinfo出力を記述したテスト用phpファイルを配置して確認する必要がある。(めんどくさい)

なお、php.iniはユーザーポータルから「ホーム > お客様情報 > プログラムのパスとサーバの情報 > PHP iniの設定情報」と辿っていき、デフォルトのphp.iniの設定をコピーしてきて、それを編集しないと誤作動するとのこと。(めんどくさい)

AM
面倒くさいこと多すぎません?

解決までの道のり

切り分け

同様の問題がどこかで報告されていて、簡単に解決が見つかるかと思ったら1件も当てはまらず、沼にハマっていくことに。
結構ベタなパターンだからすぐに見つかると思ったのに…。

で、SSL証明書の検証をOFFれば送信できるというセキュリティ度外視の対策があったので、ひとまずこれで動くかどうかの検証。

  1. config/mail.phpを開く
  2. 以下の設定を追記
    'mailers' => [
        'smtp' => [
            'stream' => [
                'ssl' => [
                    'allow_self_signed' => true,
                    'verify_peer' => false,
                    'verify_peer_name' => false,
                ],
            ],
        ],
  3. Laravelの設定を再読み込み
    php-7.2 artisan config:cache

で、メール送信してみると…

送信できた!
やっぱりサーバー側のSSLの設定が悪いのかい!

なお、このままではセキュリティ的によろしくないので上記設定は戻しておきましょう。

解決策発見

どういう検索をしたのか忘れましたが、こんな書き込みを発見。

【CPIの場合】
php.iniでopenssl.cafileを指定することで回避可能。ファイルパス情報はCPIより提供があったとのことです。

いや、これでは???
てか証明書のファイルパスって問い合わせないともらえないのかーい!
必死にCPI公式のドキュメント読みあさってました。
全然関係ないフォーラムの書き込みでしたが、これが一番のヒントに。感謝。

早速「cafileに設定するファイルパスください」とメールしたところ、わずか30分で返信が来て、ファイルパスを無事獲得。
で、上記解決策を実施したところ無事メール送信できました。

AM
この速さで返信が来るってことはCPI内ではあるあるなのでは…?
どこかに書いておいてくれればいいのに。

さいごに

CPIは分かりづらい独自設定が必要なので、本当に使いづらいです。
でも顧客はココが良いと言っているので、どうしようもない…orz

AM
初めて真面目な技術メモを記事として書いてみましたとさ