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

使用Flutter Mailer包通过Outlook SMTP发送邮件遇认证失败问题

解决Flutter Mailer + Outlook SMTP OAuth2认证失败问题

问题分析

你遇到的535 Authentication unsuccessful错误,核心原因是同时传入密码和XOAuth2令牌导致认证逻辑冲突,再加上可能的令牌有效性、SMTP参数配置或Azure权限设置问题。

具体解决方案

1. 移除密码参数,仅保留XOAuth2令牌

Outlook SMTP的XOAuth2认证模式不需要密码,同时存在password和xoauth2Token会让服务器无法识别正确的认证方式,直接删掉代码中的password参数。

2. 校验OAuth2令牌的有效性

  • 确保获取的是访问令牌(而非ID令牌),令牌的scope必须包含https://outlook.office365.com/SMTP.Send
  • 可以用Dart的jwt_decoder库解码令牌,检查aud(受众)是否为https://outlook.office365.com,scp字段是否包含SMTP.Send

3. 修正SMTP服务器配置

Outlook 587端口强制要求启用STARTTLS,调整配置参数:

final smtpServer = SmtpServer('smtp-mail.outlook.com',
  port: 587,
  ssl: false,
  startTls: true, // 必须开启,这是Outlook SMTP 587端口的硬性要求
  username: username,
  xoauth2Token: xoauth2Token,
);

注意:ignoreBadCertificate和allowInsecure仅用于本地测试,生产环境建议关闭,避免安全风险。

4. 确认Azure应用权限配置

  • 权限类型必须选委派权限(应用权限不支持SMTP.Send,需代表用户发送邮件)
  • 确保SMTP.Send、User.Read、offline_access这三个权限已获得管理员同意(企业租户账号需要此步骤,个人账号可跳过)
  • 应用注册的重定向URI要和获取令牌时使用的完全一致

修正后的完整代码示例

final smtpServer = SmtpServer('smtp-mail.outlook.com',
  port: 587,
  ssl: false,
  startTls: true,
  username: username,
  xoauth2Token: xoauth2Token,
);

final message = Message()
  ..from = Address(username, '发送者名称')
  ..recipients.add(user?.email ?? 'unknown@example.com')
  ..subject = 'Hi, 这是测试邮件'
  ..text = 'Hello World!';

try {
  final sendReport = await send(message, smtpServer);
  print('邮件发送成功: ${sendReport.toString()}');
} catch (e) {
  print('发送失败: $e');
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:28:16