You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9 发送邮件遇STARTTLS错误1,同配置空项目正常

问题描述

我开发了一款基于LDAP实现登录认证与用户数据获取的请假管理应用,在添加邮件发送相关的类、控制器、视图、路由代码后,出现了「Unable to connect with STARTTLS: code 1」错误。

我尝试过以下方案,但均未解决问题:

  • 尝试Stack Overflow上关于Laravel 9 STARTTLS错误的相关方案无效
  • 尝试Laracasts上Laravel 7版本的SSL错误解决方案无效
  • 尝试Medium上的同类SSL错误处理方案无效

我还更换了其他邮件服务商,问题依然存在。奇怪的是,我创建了一个配置完全相同的空白Laravel 9项目,却能正常发送邮件——仅缺少请假管理的相关功能。

我的配置和代码如下:

.env 配置

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=xxxxxxxxx
MAIL_PASSWORD=xxxxxxxxx
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

控制器代码(EmailController.php)

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Mail\SendMail;
use Illuminate\Support\Facades\Log;

class EmailController extends Controller
{
    public function index()
    {
        Log::info('mail ');
        $testMailData = [
            'title' => 'Test Email From AllPHPTricks.com',
            'body' => 'This is the body of test email.'
        ];

        Mail::to('your_email@gmail.com')->send(new SendMail($testMailData));

        dd('Success! Email has been sent successfully.');
    }
}

路由配置

Route::get('email', [EmailController::class, 'index']);

邮件类代码(SendMail.php)

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class SendMail extends Mailable
{
    use Queueable, SerializesModels;

    public $testMailData;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($testMailData)
    {
        $this->testMailData = $testMailData;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('Email From AllPHPTricks.com')
                    ->view('emails.testMail');
    }
}

邮件视图代码(emails/testMail.blade.php)

<!DOCTYPE html>
<html>
<head>
    <title>AllPHPTricks.com</title>
</head>
<body>
    <h1>{{ $testMailData['title'] }}</h1>
    <p>{{ $testMailData['body'] }}</p>
</body>
</html>
排查与解决思路

由于空白项目能正常运行,问题大概率出在请假管理应用的LDAP配置或自定义代码对邮件服务的干扰上,建议按以下步骤排查:

  1. 检查LDAP配置对SSL上下文的影响
    LDAP相关扩展或全局配置可能修改了PHP的SSL默认设置,导致邮件STARTTLS握手失败。可在邮件发送前临时重置SSL上下文做测试:

    // 在EmailController的index方法开头添加
    stream_context_set_default([
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false,
        ],
    ]);
    

    注:这是临时排查方案,生产环境不要禁用证书验证,后续需定位LDAP配置的具体冲突点

  2. 清理应用缓存并重新加载配置
    执行以下命令确保邮件配置为最新状态:

    php artisan config:clear
    php artisan cache:clear
    php artisan view:clear
    
  3. 排查自定义中间件/服务提供者的干扰
    临时禁用LDAP相关的服务提供者或全局中间件,测试邮件是否能正常发送,逐步定位冲突的代码模块。

  4. 对比依赖版本差异
    执行composer show对比空白项目与当前项目的依赖包版本,重点检查邮件、SSL、LDAP相关的包,尝试升级或降级存在版本差异的依赖。

  5. 启用详细日志定位问题
    在.env中开启邮件详细日志:

    MAIL_LOG_CHANNEL=stack
    LOG_LEVEL=debug
    

    发送邮件后查看storage/logs/laravel.log,获取更具体的错误细节,定位SSL握手失败的核心原因。


内容的提问来源于stack exchange,提问作者Smiley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:55:28