PHP - Laravel - メール送信 - トラブルシュート - SSL 検証エラー


 


1. 概要
2. 状況
3. 対策1
4. 対策2
5. 参考サイト

1. 概要

 ある日、ふと気づくと、「Laravel」からメールが送信できなくなっておる。  これを書いているのが、2026年8月6日で、確認できる最後のメールが届いているのが、2026年4月27日。  気づくのが、遅すぎますわなぁ。

2. 状況

 自分で、送信してみると、ブラウザに。

Unable to connect with STARTTLS: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed
 と出ています。  メールサーバとの接続で、証明書の検証エラーになっているらしい。  「FreeBSD 15.0 RELEASE」を「FreeBSD 15.1 RELEASE」へアップグレードしたのは、2026年7月のことだから、オペレーティングシステムの問題ではないわな。  「Laravel」は当分、モジュールの更新を行っていないので。  原因は「PHP 8.4」自体かもしれない。  こちらは、更新がありますからな。  まぁ、はっきりとした原因は、究明できていません。

3. 対策1

 対策は2つあります。  こちらは、面倒・強引・不用心なので、あまりお勧めではありません。

vi app/Providers/AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
 の下に下記の行を加えます。

use Illuminate\Mail\MailManager;
use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport;

    public function boot()
    {
        //
    }
 を下記へ変更します。

    public function boot(): void
    {
        $this->app->resolving('mail.manager', function (MailManager $mailManager) {
            $mailManager->extend('smtp', function ($config) {
                $transport = new EsmtpTransport(
                    $config['host'] ?? '192.168.1.2',
                    $config['port'] ?? 25,
                    $config['encryption'] ?? false
                );

                $stream = $transport->getStream();
                $stream->setStreamOptions([
                    'ssl' => [
                        'verify_peer' => false,
                        'verify_peer_name' => false,
                        'allow_self_signed' => true,
                    ],
                ]);

                return $transport;
            });
        });
    }
 やっていることは。  「Laravel」の「Mailer」生成処理に割り込み、「SSL」検証を内部から強制解除。  「Transport」内部の「Stream」コンテキストに「SSL」検証無効化を直接注入。  ということだそうであります。

4. 対策2

 これは、「Laravel」が動作しているサーバで、「swaks」でメールを正しく送信できることが条件になります。  「swaks」の使い方については、「メールサーバ(postfix)- 配送テスト」をご参照ください。  条件を満たせていれば、「SSL・TLS」で送信するので、安心です。

vi .env

MAIL_MAILER=smtp
 と書いている行を。

MAIL_MAILER=sendmail
 へ書き換えます。  証明書の検証を「sendmail」あるいは「sendmail」のラッパにお任せしてしまうわけです。

5. 参考サイト

 本ページは、「Gemini」伍長を参考にさせていただきました。

audiobook.jp
それがだいじWi-Fi
Amazonギフトカード
ハイスピードプラン
EaseUS
【usus ウズウズ】
損保との違い
5G CONNECT
サウンドハウス
薬屋の独り言
TikTok Shop 【リピート用プログラム】
葬送のフリーレン Prime Video
earthcar(アースカー)
健康サポート特集
U-NEXT
アフィリエイトのアクセストレード
ネットオークションの相場、統計、価格比較といえばオークファン
ベルリッツ
JETBOY