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 postfixInternet 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 status587/tcp ALLOW Anywhere规则。 - 若为云服务器,检查服务商安全组是否开放587端口的入站规则。
- 验证DNS解析:
确认返回的是服务器公网IP。nslookup domainname.org
内容的提问来源于stack exchange,提问作者thesolar
相关产品推荐
相关产品推荐

