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

PHPMailer SMTP连接被拒绝(111)问题求助(Debian环境)

解决Debian环境下PHPMailer无法连接SMTP服务器(Connection refused 111)的问题

错误信息

2024-12-14 17:48:11 SMTP ERROR: Failed to connect to server: Connection refused (111) 
2024-12-14 17:48:11 SMTP Error: Could not connect to SMTP host. 
Erreur lors de l'envoi du message : SMTP Error: Could not connect to SMTP host.

用户提供的PHP代码(含语法错误)

<?php error_reporting(E_ALL); ini_set("display_errors", 1);

 require 'PHPMailer-6.6.0/src/PHPMailer.php'; 
require 'PHPMailer-6.6.0/src/SMTP.php'; 
require 'PHPMailer-6.6.0/src/Exception.php';

use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer(true);

try { 
$mail->isSMTP();
 $mail->Host = 'domainname.org'; 
$mail->SMTPDebug = 2; 
$mail->Debugoutput = 'echo'; 
 $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) );       

$mail->Username = 'contact@domainname.org'; 
$mail->Password = 'MonMotDePasse123';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; activé
$mail->Port = 587;


$mail->setFrom('contact@domainname.org', 'Mon Site Web');
$mail->addAddress('desinatair@outlook.fr', 'Nom Destinataire');
$mail->addReplyTo('contact@domainname.org', 'Support VEX');


$mail->isHTML(true);
$mail->Subject = 'Sujet de l\'email';
$mail->Body = '<h1>Ceci est un test</h1><p>Message envoyé depuis domainname.org.</p>';
$mail->AltBody = 'Ceci est un test. Message envoyé depuis domainname.org.';


$mail->send();
echo 'Message envoyé avec succès !';} catch (Exception $e) {echo "Erreur lors de l'envoi du message : {$mail->ErrorInfo}";}?>

排查与修复步骤

1. 核心问题定位

telnet domainname.org 587提示连接拒绝,说明服务器上没有服务监听587端口,这是根本原因。

2. 安装并运行本地SMTP服务(以Postfix为例)

Debian默认推荐使用Postfix作为本地SMTP服务:

  • 安装Postfix:
    sudo apt update && sudo apt install postfix
    
    安装时选择Internet Site,设置邮件域名为domainname.org。
  • 启动并设置开机自启:
    sudo systemctl start postfix
    sudo systemctl enable postfix
    
  • 检查服务状态:
    sudo systemctl status postfix
    

3. 配置SMTP服务监听587端口

修改Postfix配置文件/etc/postfix/master.cf:

  • 找到submission段,确保以下内容未被注释:
    submission inet n       -       y       -       -       smtpd
      -o syslog_name=postfix/submission
      -o smtpd_tls_security_level=encrypt
      -o smtpd_sasl_auth_enable=yes
      -o smtpd_tls_auth_only=yes
      -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
    
  • 重启Postfix生效:
    sudo systemctl restart postfix
    
  • 验证端口监听:
    sudo ss -tulpn | grep ":587"
    
    有输出则说明端口已被监听。

4. 修正PHP代码中的语法错误

代码中$mail->SMTPSecure行末尾的activé是多余内容,会导致语法错误,修改为:

$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;

同时可尝试将Host改为localhost测试,避免DNS解析问题。

5. 配置SMTP认证(确保账号有权限发送)

  • 安装SASL认证组件:
    sudo apt install libsasl2-modules sasl2-bin
    
  • 创建系统用户(若contact@domainname.org对应的系统用户不存在):
    sudo useradd -m contact
    sudo passwd contact
    
  • 修改/etc/postfix/main.cf添加认证配置:
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_type = dovecot
    smtpd_sasl_path = private/auth
    smtpd_sasl_security_options = noanonymous
    smtpd_sasl_local_domain = $myhostname
    
  • 重启Postfix后,用swaks测试认证:
    swaks --to test@example.com --from contact@domainname.org --server localhost --port 587 --auth-user contact --auth-password MonMotDePasse123 --tls
    

6. 二次验证防火墙与网络规则

  • 检查本地UFW防火墙规则:
    sudo ufw status
    
    确保存在587/tcp ALLOW Anywhere规则。
  • 若为云服务器,检查服务商安全组是否开放587端口的入站规则。
  • 验证DNS解析:
    nslookup domainname.org
    
    确认返回的是服务器公网IP。

内容的提问来源于stack exchange,提问作者thesolar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:48:27