使用PHPMailer通过SMTP连接Amazon SES遭拒绝故障排查求助
我尝试用PHPMailer通过SMTP协议向Amazon SES发送邮件,但一直收到连接拒绝错误,错误日志如下:
2022-09-03 13:45:38 Connection: opening to email-smtp.us-east-1.amazonaws.com:587, timeout=300, options=array() 2022-09-03 13:45:46 Connection failed. Error #2: stream_socket_client(): Unable to connect to email-smtp.us-east-1.amazonaws.com:587 (Connection refused) [/home/xxx/public_html/Classes/PHPMailer/src/SMTP.php line 389] 2022-09-03 13:45:46 SMTP ERROR: Failed to connect to server: Connection refused (111) SMTP Error: Could not connect to SMTP host.
我的PHP代码如下:
$mail = new PHPMailer(true); $mail->isSMTP(); $mail->Host='email-smtp.us-east-1.amazonaws.com'; $mail->SMTPAuth = true; $mail->SMTPSecure = 'tls'; $mail->SMTPDebug = 4; $mail->Username='*********'; // 已确认信息正确 $mail->Password='*********'; $mail->Port = 587; $mail->setFrom('me@example.com', 'My Test'); // me@example.com已在Amazon SES验证 $mail->isHTML(true); $mail->CharSet="UTF-8"; $mail->Subject = $subject; // $subject、$message已设置 $mail->Body = $message; $mail->addAddress('to@example.com'); // to@example.com已在Amazon SES验证 $mail->send();
主机提供商确认未封禁587端口的SMTP出站请求,请问哪里操作有误?
排查与解决步骤
确认SES区域与端点匹配
你使用的是us-east-1区域的SMTP端点,但要确保你的SES账户确实创建在该区域。如果账户属于其他区域(比如us-west-2、eu-west-1),必须替换为对应区域的SMTP端点,错误的端点会直接导致连接被拒绝。测试服务器端连通性
登录你的服务器,用命令直接测试到SES端点的连通性:telnet email-smtp.us-east-1.amazonaws.com 587 # 或者用nc命令 nc -zv email-smtp.us-east-1.amazonaws.com 587如果命令返回无法连接,说明服务器本地防火墙(如iptables、firewalld)或云服务商的安全组限制了出站流量,需要开放对应端口到SES的IP段。
强制使用IPv4连接
部分服务器DNS解析优先返回IPv6地址,但网络环境不支持IPv6,会导致连接失败。在代码中添加以下配置强制使用IPv4:$mail->SMTPOptions = array( 'socket' => array( 'ipv6' => false, ), );重新验证SMTP凭证
SES的SMTP凭证不是AWS控制台的账号密码,需要在SES控制台的「SMTP设置」页面单独生成专用的SMTP用户名和密码。如果误使用了IAM用户的密钥,会直接导致认证失败和连接拒绝。检查PHP openssl扩展状态
TLS加密连接依赖PHP的openssl扩展,通过phpinfo()查看是否启用了该扩展。如果未启用,需要在php.ini中开启extension=openssl并重启PHP服务。尝试更换端口与加密方式
可以切换到465端口+SSL加密模式测试:$mail->SMTPSecure = 'ssl'; $mail->Port = 465;部分网络环境对587端口的TLS握手支持存在问题,换用465端口的SSL加密可能解决连接问题。
内容的提问来源于stack exchange,提问作者Keiron W

