- 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」伍長を参考にさせていただきました。
|