Windows Server上用Laravel发邮件遇fwrite() SSL连接强制关闭问题
Laravel + Windows Server 发送Office365邮件报错解决方案
针对你遇到的fwrite(): SSL: An existing connection was forcibly closed by the remote host报错,按以下步骤排查解决:
检查PHP OpenSSL配置与版本
- 打开
php.ini,确认extension=openssl未被注释,启用OpenSSL扩展 - 运行命令
php -r "echo OPENSSL_VERSION_TEXT;"查看版本,Office365要求TLS 1.2及以上,低于该版本需升级PHP或OpenSSL库
- 打开
修正Laravel邮件配置
Laravel 6+版本已弃用MAIL_DRIVER,改用MAIL_MAILER,同时补充认证模式配置,修改后的完整配置如下:MAIL_MAILER=smtp MAIL_HOST=outlook.office365.com MAIL_PORT=587 MAIL_USERNAME=hr@testemail.com MAIL_PASSWORD=xxxx MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=hr@testemail.com MAIL_FROM_NAME="${APP_NAME}" MAIL_AUTH_MODE=login启用Windows Server的TLS协议
通过注册表编辑器启用TLS 1.2和1.3:- 定位路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols - 新建
TLS 1.2\Client项,设置DisabledByDefault为0,Enabled为1 - 新建
TLS 1.3\Client项,设置DisabledByDefault为0,Enabled为1 - 重启服务器生效
- 定位路径:
直接测试SMTP连接
用PowerShell绕过Laravel测试连接,定位问题层面:$smtpClient = New-Object Net.Mail.SmtpClient('outlook.office365.com', 587) $smtpClient.EnableSsl = $true $smtpClient.Credentials = New-Object System.Net.NetworkCredential('hr@testemail.com', 'xxxx') $smtpClient.Send('hr@testemail.com', 'test@example.com', 'Test Subject', 'Test Body')若命令报错,说明是系统/网络问题;若成功,继续排查Laravel配置缓存
清除Laravel配置缓存
运行命令刷新配置:php artisan config:clear php artisan config:cache
内容的提问来源于stack exchange,提问作者noushad mohammed
相关产品推荐
相关产品推荐

