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配置或自定义代码对邮件服务的干扰上,建议按以下步骤排查:
检查LDAP配置对SSL上下文的影响
LDAP相关扩展或全局配置可能修改了PHP的SSL默认设置,导致邮件STARTTLS握手失败。可在邮件发送前临时重置SSL上下文做测试:// 在EmailController的index方法开头添加 stream_context_set_default([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ], ]);注:这是临时排查方案,生产环境不要禁用证书验证,后续需定位LDAP配置的具体冲突点
清理应用缓存并重新加载配置
执行以下命令确保邮件配置为最新状态:php artisan config:clear php artisan cache:clear php artisan view:clear排查自定义中间件/服务提供者的干扰
临时禁用LDAP相关的服务提供者或全局中间件,测试邮件是否能正常发送,逐步定位冲突的代码模块。对比依赖版本差异
执行composer show对比空白项目与当前项目的依赖包版本,重点检查邮件、SSL、LDAP相关的包,尝试升级或降级存在版本差异的依赖。启用详细日志定位问题
在.env中开启邮件详细日志:MAIL_LOG_CHANNEL=stack LOG_LEVEL=debug发送邮件后查看
storage/logs/laravel.log,获取更具体的错误细节,定位SSL握手失败的核心原因。
内容的提问来源于stack exchange,提问作者Smiley
相关产品推荐
相关产品推荐

