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

Office365 SMTP认证失败(本地正常服务器异常)技术求助

Office365 SMTP认证失败(错误535 5.7.139):服务器部署异常但本地正常的解决方案

问题概述

使用Office365 Business Basic版本,通过授权账号用Go语言编写SMTP客户端向外部用户发送邮件。服务此前运行正常,近期出现认证问题导致无法发信。相同代码和凭据在本地电脑及其他设备上均可正常运行,但部署到服务器时就抛出认证错误,怀疑服务器被列入黑名单或存在其他问题。

Go语言代码实现

package mailer

import (
    "errors"
    "fmt"
    "net/smtp"
)

var ErrUnknown = errors.New("unknown from server")

type smtpAuth struct {
    username string
    password string
}

func (s smtpAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
    return "LOGIN", []byte(s.username), nil
}
func (s smtpAuth) Next(fromServer []byte, more bool) ([]byte, error) {
    if !more {
        return nil, nil
    }
    switch string(fromServer) {
    case "Username:":
        return []byte(s.username), nil
    case "Password:":
        return []byte(s.password), nil
    default:
        return nil, fmt.Errorf("%w: %q", ErrUnknown, string(fromServer))
    }
}

type Mailer struct {
    host     string
    port     string
    username string
    password string
}

func NewMailer(host, port, username, password string) *Mailer {
    return &Mailer{
        host:     host,
        port:     port,
        username: username,
        password: password,
    }
}

func (m *Mailer) Send(sender string, receiver []string, msg []byte) error {
    auth := smtpAuth{username: m.username, password: m.password}
    server := m.host + ":" + m.port
    return smtp.SendMail(server, auth, sender, receiver, msg)
}

服务器端报错日志

Mail Error on Auth: 535 5.7.139 Authentication unsuccessful, the request did not meet the criteria to be authenticated successfully. Contact your administrator. [SG2PR04CA0193.apcprd04.prod.outlook.com 2024-02-20T08:46:13.879Z 08DC309C8EDA8C92]
exit status 1

排查方向及解决步骤

1. 检查服务器IP的Office365信誉

Office365的反垃圾邮件系统会对陌生或有不良记录的IP进行限制:

  • 登录Office365管理员后台,进入邮件流->连接筛选器,查看服务器IP是否在阻止列表中
  • 若IP未被阻止,可将其添加到IP允许列表,降低被拦截的概率

2. 确认Office365认证策略

Office365可能调整了认证要求,需检查:

  • 账号是否启用现代认证:当前代码使用的是传统LOGIN认证,若Office365强制要求现代认证,需切换到OAuth2认证方式
  • 若要保留LOGIN认证,需确保账号未被禁用传统认证:在Exchange管理中心的收件人->邮箱->邮箱功能->POP和IMAP中确认传统认证权限

3. 排查服务器网络环境

  • 确认服务器未使用异常代理/VPN:Office365会识别非常规网络环境并拒绝认证
  • 测试SMTP连通性:通过telnet smtp.office365.com 587验证服务器能否正常连接Office365的SMTP端口
  • 检查防火墙/安全组:确保服务器出站流量未被拦截SMTP端口(587或25)

4. 代码优化:使用标准库认证实现

自定义LOGIN认证可能存在兼容性问题,建议替换为Go标准库的smtp.PlainAuth:

func (m *Mailer) Send(sender string, receiver []string, msg []byte) error {
    // PlainAuth会自动处理STARTTLS加密,符合Office365要求
    auth := smtp.PlainAuth("", m.username, m.password, m.host)
    server := m.host + ":" + m.port
    return smtp.SendMail(server, auth, sender, receiver, msg)
}

5. 验证账号状态

  • 确认授权账号未被锁定、密码未过期
  • 检查账号是否被限制发送外部邮件:在管理员后台查看邮箱的发送权限设置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:22:09