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

编程访问Office 365邮箱遇401未授权错误,求排查方案

解决Office 365 EWS 401未授权问题

你的代码存在几个关键问题,直接导致了401未授权错误,以下是具体分析和修正方案:

核心问题点

  • 基本认证已被禁用:Office 365早就停止支持NetworkCredential这种账号密码明文认证方式,必须改用OAuth 2.0认证。
  • Exchange版本不匹配:你指定的ExchangeVersion.Exchange2010_SP2版本过于陈旧,Office 365的EWS需要使用ExchangeVersion.ExchangeOnline才能适配当前服务。

修正步骤

1. 注册Azure AD应用

  • 登录Azure门户,创建新的应用注册。
  • 为应用添加EWS.AccessAsUser.All的委派权限,并完成管理员同意操作。
  • 记录应用的Client ID、Tenant ID,生成并保存客户端密码(Client Secret)。

2. 替换为OAuth认证的代码

using Microsoft.Exchange.WebServices.Data;
using Microsoft.Identity.Client;
using System.Net;

static async Task GetInboxMail(string emailAddress, string clientId, string tenantId, string clientSecret)
{
    var service = new ExchangeService(ExchangeVersion.ExchangeOnline);
    
    // 获取OAuth访问令牌
    var scopes = new[] { "https://outlook.office365.com/EWS.AccessAsUser.All" };
    var app = ConfidentialClientApplicationBuilder
        .Create(clientId)
        .WithClientSecret(clientSecret)
        .WithTenantId(tenantId)
        .Build();
    
    var tokenResult = await app.AcquireTokenForClient(scopes).ExecuteAsync();
    service.Credentials = new OAuthCredentials(tokenResult.AccessToken);
    service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
    // 设置要 impersonate 的邮箱账号
    service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, emailAddress);

    if (service != null)
    {
        var findResult = service.FindItems(WellKnownFolderName.Inbox, new ItemView(100));
        // 批量加载邮件属性,提升性能
        service.LoadPropertiesForItems(findResult, PropertySet.FirstClassProperties);

        foreach (Item item in findResult)
        {
            if (item is EmailMessage message)
            {
                string body = message.Body.Text;
                string from = message.From.Name;
                string subject = message.Subject;
                Console.WriteLine($"发件人: {from}");
                Console.WriteLine($"主题: {subject}");
                Console.WriteLine($"正文: {body}\n");
            }
        }
    }
}

3. 额外注意事项

  • 如果是桌面端应用,也可以使用交互式认证(AcquireTokenInteractive),无需客户端密码。
  • 必须确保应用的权限已获得管理员同意,否则会出现权限不足的错误。
  • 检查目标邮箱账号是否被管理员禁用了EWS访问(默认启用,但若被限制也会触发401)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:30:30