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

使用C#通过ExchangeService连接Outlook Online读取邮件失败求助

解决Outlook Online EWS连接失败问题

问题描述

在浏览器中访问https://outlook.office.com/mail/可正常登录并查看邮件,但编写的C#控制台应用使用Exchange Web Services(EWS)连接时失败,原代码及错误现象如下:

原代码

public void EmailReceiver()
{
    try
    {
        ExchangeService exchangeService = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
        exchangeService.Credentials = new NetworkCredential("username", "pass");
        exchangeService.Url = new Uri("https://outlook.office.com/mail/");

        var inbox = Folder.Bind(exchangeService, WellKnownFolderName.Inbox);

        var sf1 = new SearchFilter.ContainsSubstring(EmailMessageSchema.From, "searchMail");

        SearchFilter.SearchFilterCollection searchFilterCollection = new SearchFilter.SearchFilterCollection(LogicalOperator.Or);

        searchFilterCollection.Add(sf1);

        var view = new ItemView(1000);

        var findResults = service.FindItems(WellKnownFolderName.Inbox, searchFilterCollection, view);

        return;

        //foreach (Item item in findResults)
        //{
        //    GetAttachmentsFromEmail(item.Id);
        //}
    }

    catch (Exception ex)
    {
        throw;
    }
}

错误现象

连接时抛出异常,无法正常访问邮箱内容(错误截图显示认证或端点配置错误)。


解决建议

1. 修正代码低级错误

  • 变量名不一致:创建的服务实例是exchangeService,但调用FindItems时误用未定义的service,需统一为exchangeService.FindItems。
  • 错误的端点URL:https://outlook.office.com/mail/是网页端地址,EWS需使用专门的服务端点,推荐用Autodiscover自动发现,或硬编码正确地址:https://outlook.office365.com/EWS/Exchange.asmx。

2. 调整Exchange版本与认证方式

  • 更新Exchange版本:Outlook Online对应版本应使用ExchangeVersion.ExchangeOnline或Exchange2016,而非Exchange2013_SP1。
  • 优先使用OAuth认证:Office 365多数租户已禁用基本认证(直接用户名+密码登录),开启MFA的账号必须用OAuth。若需用用户名密码,需确认租户允许基本认证(不推荐)。

3. 修正后的基础代码(Autodiscover+基本认证,仅适允许基本认证的租户)

public void EmailReceiver()
{
    try
    {
        ExchangeService exchangeService = new ExchangeService(ExchangeVersion.ExchangeOnline);
        exchangeService.Credentials = new NetworkCredential("your-email@domain.com", "your-password");
        
        // 自动发现服务地址,无需硬编码Url
        exchangeService.AutodiscoverUrl("your-email@domain.com", RedirectionUrlValidationCallback);

        var inbox = Folder.Bind(exchangeService, WellKnownFolderName.Inbox);

        var sf1 = new SearchFilter.ContainsSubstring(EmailMessageSchema.From, "searchMail");
        var searchFilterCollection = new SearchFilter.SearchFilterCollection(LogicalOperator.Or);
        searchFilterCollection.Add(sf1);

        var view = new ItemView(1000);
        var findResults = exchangeService.FindItems(WellKnownFolderName.Inbox, searchFilterCollection, view);

        foreach (Item item in findResults)
        {
            GetAttachmentsFromEmail(item.Id);
        }
    }
    catch (ExchangeServiceException ex)
    {
        Console.WriteLine($"EWS错误:{ex.Message}");
        throw;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"其他错误:{ex.Message}");
        throw;
    }
}

// Autodiscover重定向验证回调
private static bool RedirectionUrlValidationCallback(string redirectionUrl)
{
    return redirectionUrl.ToLower().StartsWith("https://outlook.office365.com/");
}

4. OAuth认证实现(推荐,支持MFA)

若账号开启MFA或租户禁用基本认证,需使用Microsoft Identity Client库实现OAuth:

  1. 在Azure AD中注册应用,获取客户端ID、租户ID。
  2. 安装NuGet包:Microsoft.Identity.Client和Microsoft.Exchange.WebServices。
  3. 示例代码片段:
public async Task EmailReceiverOAuth()
{
    var clientId = "your-client-id";
    var tenantId = "your-tenant-id";
    var email = "your-email@domain.com";

    var pca = PublicClientApplicationBuilder.Create(clientId)
        .WithTenantId(tenantId)
        .WithDefaultRedirectUri()
        .Build();

    var scopes = new[] { "https://outlook.office365.com/EWS.AccessAsUser.All" };
    var result = await pca.AcquireTokenInteractive(scopes).ExecuteAsync();

    ExchangeService exchangeService = new ExchangeService(ExchangeVersion.ExchangeOnline);
    exchangeService.Credentials = new OAuthCredentials(result.AccessToken);
    exchangeService.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");

    // 后续搜索、处理邮件逻辑同前
}

5. 其他排查点

  • 确认账号权限:确保用于连接的邮箱有EWS访问权限(默认允许,管理员可能限制)。
  • 检查网络:控制台应用能否访问https://outlook.office365.com,是否有代理或防火墙拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:05:22