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

使用PHPMailer对接Office365 SMTP时遇500错误求助

问题:PHPMailer 连接 Office365 SMTP 出现500错误及配置疑问

首次使用PHPMailer通过网站表单发邮件时出现500错误,切换到587端口后问题依旧,怀疑是服务器配置问题,有两个疑问:

  1. 应该填写什么用户名和密码?是微软账户凭据还是发件邮箱的账号密码?
  2. 环境要求仅使用TLS 1.2版本,这个配置能不能在代码里设置?会不会导致500错误?

附上相关代码:

$mail = new PHPMailer(true);

try {
    // server configuration
    $mail->isSMTP();
    $mail->Host       = 'smtp.office365.com'; // host server smtp
    $mail->SMTPAuth   = true;
    $mail->Username   = 'username@username.it'; // what username? the email address?
    $mail->Password   = 'password'; // smtp pss
    $mail->SMTPSecure = 'tls';
    $mail->Port       = 25; // tcp port for smtp

    // recipients
    $mail->setFrom('no-reply@email.it', 'Company Name'); // should this be the same as the username?
    $mail->addAddress('additionaladdress@email.it', 'Mary'); is this and extra email address where I want receive the data
    $mail->addAddress('additionaladdress@email.it', 'Jhon');

    // email contents
    $mail->isHTML(true); // html email format
    $mail->Subject = 'New message from $name';
    $mail->Body    = $message;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

解答

1. 用户名和密码配置

  • 必须填写发件邮箱的完整账号和登录密码,也就是你用来登录该Office365邮箱的凭据,如果该邮箱绑定微软账户,那就是对应邮箱的登录信息,不是微软账户的通用凭据。
  • 额外注意:setFrom里的发件邮箱必须和Username完全一致,Office365的SMTP服务器强制要求发件人地址与认证邮箱匹配,否则会直接拒绝请求,这也是你当前代码存在的一个问题。

2. TLS 1.2版本配置

  • 可以在代码中强制指定TLS 1.2版本,这不会直接导致500错误,反而能满足环境要求。配置方式是添加一行SMTP选项代码:
    $mail->SMTPOptions = array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => false,
            'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
        )
    );
    
  • 500错误本质是PHP运行报错,建议开启PHP错误日志,或者确保catch块的错误信息能正常输出,这样可以定位具体原因,比如端口被防火墙拦截、密码错误、TLS版本不兼容等。

修正后的完整代码示例

$mail = new PHPMailer(true);

try {
    // server configuration
    $mail->isSMTP();
    $mail->Host       = 'smtp.office365.com';
    $mail->SMTPAuth   = true;
    $mail->Username   = 'your-office365-email@yourdomain.it'; // 替换为实际发件邮箱
    $mail->Password   = 'your-email-password'; // 替换为实际邮箱密码(开启两步验证需用应用专用密码)
    $mail->SMTPSecure = 'tls';
    $mail->Port       = 587; // 优先用587端口,25端口多数服务器会拦截
    // 强制使用TLS 1.2
    $mail->SMTPOptions = array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => false,
            'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
        )
    );

    // recipients
    $mail->setFrom('your-office365-email@yourdomain.it', 'Company Name'); // 必须与Username一致
    $mail->addAddress('mary@example.com', 'Mary'); // 替换为实际接收人邮箱
    $mail->addAddress('john@example.com', 'John');

    // email contents
    $mail->isHTML(true);
    $mail->Subject = "New message from $name"; // 用双引号解析变量$name
    $mail->Body    = $message;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

额外排查点

  • 检查服务器防火墙是否允许出站连接到smtp.office365.com的587端口;
  • 如果邮箱开启了两步验证,需要生成应用专用密码替代普通登录密码;
  • 代码中原Subject用单引号包裹$name,变量不会被解析,需改为双引号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:26:06