Laravel项目通过自有域名SMTP发信时465端口连接超时无法发送
自有域名SMTP连接超时问题成因与排查方案
问题表现
之前用Mailtrap、Gmail的第三方SMTP都能正常发信,一切换自己域名的SMTP配置就直接报465端口TCP连接超时,请求根本没走到SMTP账号验证那一步。
核心成因
- 出站链路阻断:不管是本地网络、部署服务器的安全组/主机防火墙,还是目标SMTP服务器本身的入站规则,只要把你的连接请求丢包,就会出现超时——很多网络默认会封禁465、25这类容易被滥发垃圾邮件的端口,之前测试的Mailtrap、Gmail用的587、2525端口大多是默认放通的,所以没碰到同类问题。
- 端口和加密方式不匹配:465端口的标准用法是隐式SSL加密,当前配置用的是
tls(也就是STARTTLS显式加密),哪怕网络通了,后续握手也会失败,属于极易踩的配置坑。 - DNS解析错误:当前开发/部署环境对
mail.codestudio.pk解析到了错误IP,连接请求发到了没有服务的地址,自然出现超时。 - 基础配置漏填:
MAIL_FROM_ADDRESS是空的,就算连接打通了,后面发信也会因为没有合法发件人地址报错。
排查解决步骤
- 先校验DNS解析正确性
在本地终端跑nslookup mail.codestudio.pk,看返回的IP是不是你自己邮件服务器的公网IP,顺便检查本地hosts文件有没有错误的域名绑定,把解析修正了再往下测试。 - 分段测试端口连通性,定位阻断位置
分别在本地开发机、项目实际运行的服务器环境下测试465端口连通性:- Windows PowerShell执行
Test-NetConnection mail.codestudio.pk -Port 465 - Linux/macOS执行
telnet mail.codestudio.pk 465
根据测试结果定位问题: - 本地测试就不通:先切换手机热点测试,如果热点环境能连上,说明原来的办公/家庭网络把465端口的出站规则封了;如果切了网络还是不通,就联系邮箱管理员确认,是不是465端口的SMTP服务根本没对公网开放,或者开了IP白名单没把你当前的IP加入允许列表。
- 本地能连、服务器上连不上:就去检查部署服务器的安全组、主机防火墙配置,把到目标465端口的出站规则放通即可。
- Windows PowerShell执行
- 匹配端口与加密方式
网络连通后,根据邮件服务器实际开放的端口调整env配置:- 如果使用465端口,就把
MAIL_ENCRYPTION改成ssl,不要配置tls - 如果服务器只开了587端口支持TLS,就把
MAIL_PORT改成587,保留tls的加密配置
- 如果使用465端口,就把
- 补全漏填的基础配置
把空着的MAIL_FROM_ADDRESS填上,和MAIL_USERNAME保持一致即可,也就是填成hamza.niazi@codestudio.pk,避免后续发信因为缺失合法发件人地址触发报错。
内容的提问来源于stack exchange,提问作者Hamza Khan
相关产品推荐
相关产品推荐

