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

使用PHPMailer连接SMTP服务器遇101错误,本地正常服务器异常求排查

问题分析与解决方案

你遇到的Network is unreachable (101)错误本质是服务器无法建立到smtp.office365.com的网络连接,结合本地正常、主机称端口开放的情况,可能的原因及排查方向如下:

1. 主机出站端口未实际开放

主机所说的"端口开放"大概率指入站端口,而出站的TCP 587端口可能仍被防火墙/安全组限制。

  • 直接在服务器上执行命令测试连通性:
    telnet smtp.office365.com 587
    # 或者用curl测试
    curl -v telnet://smtp.office365.com:587
    
    如果连接超时或被拒绝,说明出站端口确实未开放,需要让主机调整出站规则。

2. 服务器DNS解析故障

服务器无法正确解析smtp.office365.com的IP地址,导致无法定位目标服务器:

  • 在服务器上执行解析测试:
    nslookup smtp.office365.com
    ping smtp.office365.com
    
    如果返回"无法找到主机"或IP异常,说明DNS配置有问题,可尝试更换服务器DNS为公共DNS(如8.8.8.8)后重试。

3. Office 365对服务器IP的拦截

部分主机的IP可能因历史滥用被Office 365列入黑名单,或Office 365对该地域IP有访问限制:

  • 临时更换SMTP服务商(如Gmail smtp.gmail.com,端口587)测试代码是否能正常发送,排除代码本身问题。
  • 用服务器IP查询是否在微软的邮件黑名单中。

4. 服务器安全模块限制

如果服务器开启了SELinux(CentOS/RHEL系)或AppArmor(Ubuntu系),可能会阻止PHP脚本发起出站网络请求:

  • 临时关闭SELinux测试:
    setenforce 0
    
    若关闭后能正常发送邮件,需配置SELinux规则允许PHP的网络请求;AppArmor则需调整对应配置文件。

5. PHP环境与PHPMailer配置细节

服务器PHP环境与本地存在差异,导致连接失败:

  • 检查PHP是否开启openssl扩展(STARTTLS依赖该扩展):
    php -m | grep openssl
    
    若未开启,需在php.ini中启用extension=openssl。
  • 尝试切换加密方式与端口:将SMTPSecure改为PHPMailer::ENCRYPTION_SMTPS,端口改为465,看是否能建立连接。
  • 提升debug级别:将$mail->SMTPDebug = SMTP::DEBUG_SERVER;改为SMTP::DEBUG_CONNECTION,查看更详细的连接日志,定位具体失败环节。

整理后的代码(优化异常捕获)

<?php

$name = $_POST["name"];
$email = $_POST["email"];
$subject = $_POST["subject"];
$message = $_POST["message"];

require "vendor/autoload.php";

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

$mail = new PHPMailer(true);
 
$mail->SMTPDebug = SMTP::DEBUG_CONNECTION; // 提升debug级别便于排查

$mail->isSMTP();
$mail->SMTPAuth = true;

$mail->Host = "smtp.office365.com";
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Username = "example@hotmail.com";
$mail->Password = "pass";
$mail->Port = 587;

$mail->setFrom("example@hotmail.com", "User");
$mail->addAddress("example@hotmail.com", "User");

$mail->Subject = $name; 
$mail->Body = "Email: $email \nPhone: $subject \n\n$message";

try {
    $mail->send();
    header("Location: sent.php");
    exit;
} catch (Exception $e) {
    echo "邮件发送失败: {$mail->ErrorInfo}";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:35:06