You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHPMailer通过SMTP连接Amazon SES遭拒绝故障排查求助

连接Amazon SES SMTP被拒绝(Connection refused)的排查与解决

我尝试用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:01:58