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

如何用Microsoft Graph API在.NET控制台程序无人值守发送大附件邮件?

在.NET控制台应用无人值守发送超3MB附件邮件的解决方案

核心问题梳理

你当前的困境在于:

  • 直接发送邮件的方式附件单文件限制3MB,无法满足大附件需求
  • 用草稿+修改后发送的方式需要Mail.ReadWrite应用权限,但默认会授予应用访问组织所有邮箱的权限,你希望避免过度授权
  • 用户名密码流因公司MFA要求无法使用,客户端凭据流又面临权限范围过大的问题

正确解决方案:应用权限+范围限制+增量上传

1. 权限配置优化

你无需放弃Mail.ReadWrite应用权限,只需在Azure AD中限制该权限的访问范围,将应用的邮件访问权限限定到指定的发送邮箱,而非整个组织:

  • 在Azure AD应用注册中,添加Mail.ReadWrite和Mail.Send应用权限
  • 授予管理员同意后,进入应用的“API权限”设置,针对Mail.ReadWrite权限配置访问范围为特定邮箱(通过Azure AD的邮件权限范围限制功能,仅允许应用操作指定的发送账号邮箱)

2. 认证与邮件发送流程

使用客户端凭据流(证书或客户端密钥)完成无人值守认证,结合草稿邮件+增量上传大附件的方式发送邮件:

认证代码示例

using Azure.Identity;
using Microsoft.Graph;

var tenantId = "你的租户ID";
var clientId = "你的应用ID";
var clientSecret = "你的应用密钥";

// 初始化客户端凭据认证
var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(credential);

创建草稿并上传大附件

// 创建草稿邮件
var draftMessage = new Message
{
    Subject = "带大附件的测试邮件",
    Body = new ItemBody
    {
        ContentType = BodyType.Html,
        Content = "这是一封包含大附件的测试邮件"
    },
    ToRecipients = new List<Recipient>
    {
        new Recipient
        {
            EmailAddress = new EmailAddress { Address = "收件人邮箱" }
        }
    }
};

var draft = await graphClient.Users["发送人邮箱"].Messages
    .Request()
    .AddAsync(draftMessage);

// 初始化大附件上传会话
var attachmentFile = new FileInfo(@"本地大附件路径");
var uploadSession = await graphClient.Users["发送人邮箱"].Messages[draft.Id].Attachments
    .CreateUploadSession(new AttachmentItem
    {
        AttachmentType = AttachmentType.File,
        Name = attachmentFile.Name,
        Size = attachmentFile.Length
    })
    .Request()
    .PostAsync();

// 分块上传附件
var maxChunkSize = 320 * 1024; // 320KB分块,可根据需求调整
using var fileStream = attachmentFile.OpenRead();
var uploadTask = new LargeFileUploadTask<FileAttachment>(uploadSession, fileStream, maxChunkSize);
var uploadResult = await uploadTask.UploadAsync();

// 上传成功后发送草稿
if (uploadResult.UploadSucceeded)
{
    await graphClient.Users["发送人邮箱"].Messages[draft.Id]
        .Send()
        .Request()
        .PostAsync();
}

你之前的操作误区

你错误认为Mail.ReadWrite应用权限必然会让应用访问所有邮箱,但Azure AD支持对应用权限设置精细化的范围限制,通过限定访问特定邮箱,既满足了大附件发送的权限需求,又避免了过度授权的风险。

内容的提问来源于stack exchange,提问作者R. Horber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:37:00