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

如何通过OAuth2无交互读取Outlook 365邮件并获取附件

实现无交互登录Outlook 365并获取邮件附件

要实现控制台应用无交互运行,你需要使用客户端凭据流(Client Credentials Flow)——这是专为服务端/无交互应用设计的OAuth2认证方式,无需用户手动登录授权。以下是具体实现步骤和示例代码:

一、Azure AD应用配置前提

  1. 在Azure AD中注册应用程序(账户类型选择「仅此组织目录中的账户」或「任何组织目录中的账户」)。
  2. 为应用添加应用权限(而非委派权限):
    • 搜索并添加Mail.Read权限(用于读取邮件及附件)。
    • 点击「授予管理员同意」(必须完成此步骤,否则应用无法获取权限)。
  3. 生成客户端密码(或证书,推荐证书更安全),保存好密码值(仅显示一次)。

二、Microsoft Graph 无交互示例代码

使用客户端凭据流获取令牌,再调用Graph API获取邮件附件:

using Microsoft.Graph;
using Microsoft.Identity.Client;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 配置参数,建议从配置文件读取
        string tenantId = "你的租户ID";
        string clientId = "你的应用客户端ID";
        string clientSecret = "你的应用客户端密码";

        // 初始化客户端凭据应用
        var confidentialClient = ConfidentialClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenantId)
            .WithClientSecret(clientSecret)
            .Build();

        // 定义所需权限
        var scopes = new string[] { "https://graph.microsoft.com/.default" };

        try
        {
            // 获取访问令牌
            var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();

            // 初始化Graph客户端
            var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) =>
            {
                requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
                return Task.CompletedTask;
            }));

            // 获取收件箱中带附件的邮件(可按需过滤,比如按日期、主题)
            var messages = await graphClient.Users["目标邮箱地址"].Messages
                .Request()
                .Expand(m => m.Attachments) // 直接展开附件信息
                .Filter("HasAttachments eq true")
                .Top(10) // 取最新10封,可调整数量
                .GetAsync();

            // 遍历邮件并下载附件
            foreach (var message in messages)
            {
                Console.WriteLine($"处理邮件: {message.Subject}");
                if (message.Attachments != null)
                {
                    foreach (var attachment in message.Attachments)
                    {
                        if (attachment is FileAttachment fileAttachment)
                        {
                            string savePath = Path.Combine(Environment.CurrentDirectory, fileAttachment.Name);
                            await File.WriteAllBytesAsync(savePath, fileAttachment.ContentBytes);
                            Console.WriteLine($"已保存附件: {fileAttachment.Name}");
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"执行出错: {ex.Message}");
        }
    }
}

三、关键说明

  • 客户端凭据流以应用身份而非用户身份访问资源,是无交互场景的最优选择,适合后台任务、控制台应用等场景。
  • 若坚持使用MailKit(IMAP/POP),同样可用客户端凭据流获取令牌:需添加IMAP.AccessAsApp或POP.AccessAsApp的应用权限并授予管理员同意,再用SaslMechanismOAuth2传入令牌连接服务器。
  • 用户名密码流(ROPC)虽能无交互,但微软已不推荐——存在密码泄露风险,且不支持启用MFA的账户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:50:21