使用PHPMailer通过AWS SES SMTP发件:终端正常浏览器无法连接SMTP
解决PHPMailer调用AWS SES SMTP在浏览器中发送失败的问题
这种终端能正常发邮件、浏览器访问就报错的情况,核心原因基本是CLI命令行环境和Web服务器(Apache/Nginx)环境的配置/权限差异,给你梳理几个关键排查方向:
检查Web服务器的网络出站权限
终端能连AWS SES的587端口不代表Web服务器进程也能连。你可以在服务器上切换到Web服务器的运行用户(比如www-data),执行这个命令测试连通性:curl -v telnet://email-smtp.us-east-1.amazonaws.com:587如果连接失败,大概率是服务器防火墙、安全组或者机房网络规则限制了587端口的出站请求,需要调整对应规则开放这个端口。
验证PHP环境的配置差异
CLI和Web环境用的可能是不同的php.ini配置:- 检查Web环境是否禁用了PHPMailer依赖的网络函数:在浏览器中运行
phpinfo(),搜索disable_functions,看看fsockopen或stream_socket_client是否在禁用列表里,如果是,修改对应php.ini移除禁用项并重启Web服务器。 - 排查TLS证书验证问题:Web环境的CA证书可能不完整,导致TLS握手失败。可以先临时添加这段代码测试(生产环境不建议长期使用):
如果测试能发送成功,说明是CA证书问题,需要给Web服务器配置正确的根证书(比如安装官方的CA证书包)。$mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) );
- 检查Web环境是否禁用了PHPMailer依赖的网络函数:在浏览器中运行
核对AWS SES的相关配置
- 确认你的AWS SES处于生产模式,或者收件地址已经在沙箱模式下完成验证(沙箱模式下只能给已验证的地址发邮件)。
- 登录AWS SES控制台,查看发送日志和错误报告,有没有Web服务器IP被拒绝的记录,或者身份验证相关的报错。
查看Web服务器的错误日志
PHPMailer的SMTP Debug信息可能不够详细,去查看Apache的error.log或者Nginx的error.log,还有PHP的错误日志,里面会记录更底层的网络连接错误,比如超时、证书不匹配等具体原因。
内容的提问来源于stack exchange,提问作者user6246701
相关产品推荐
相关产品推荐

