使用C# MS Graph API添加邮件附件时遇编译错误求助
解决方案与错误分析
错误原因解析
CS0122:Attachment构造函数无法访问
MS Graph SDK中的Attachment是抽象基类,其构造函数为保护级别,不允许直接通过new Attachment()实例化,必须使用它的派生类:MessageAttachment(用于将邮件作为附件添加)或FileAttachment(用于添加文件附件)。CS0117:Attachment无Item定义
Item属性是MessageAttachment类的特有成员,Attachment基类并未包含该属性,因此必须使用MessageAttachment类型才能访问Item。
正确实现代码
方式1:手动创建带原邮件附件的转发邮件
using Microsoft.Graph; using Azure.Identity; // 初始化GraphServiceClient(根据你的认证方式调整,此处以客户端凭据为例) var scopes = new[] { "https://graph.microsoft.com/.default" }; var clientId = "你的客户端ID"; var tenantId = "你的租户ID"; var clientSecret = "你的客户端密钥"; var credential = new ClientSecretCredential(tenantId, clientId, clientSecret); var graphClient = new GraphServiceClient(credential, scopes); // 原邮件ID var originalMsgId = "要转发的邮件ID"; // 获取原邮件基本信息 var originalMessage = await graphClient.Me.Messages[originalMsgId] .Request() .Select(m => new { m.Subject, m.Body, m.Id }) .GetAsync(); // 构建转发邮件 var forwardMsg = new Message { Subject = $"Fwd: {originalMessage.Subject}", Body = new ItemBody { ContentType = BodyType.Html, Content = "<p>请查看附件中的原邮件内容</p>" }, ToRecipients = new List<Recipient> { new Recipient { EmailAddress = new EmailAddress { Address = "收件人邮箱@example.com" } } }, Attachments = new MessageAttachmentsCollectionPage() }; // 创建MessageAttachment并添加原邮件作为附件 var msgAttachment = new MessageAttachment { Name = $"{originalMessage.Subject}.eml", ContentType = "message/rfc822", Item = originalMessage }; forwardMsg.Attachments.Add(msgAttachment); // 发送邮件 await graphClient.Me.SendMail(forwardMsg, saveToSentItems: true) .Request() .PostAsync();
方式2:使用Graph API自带的Forward方法(更简洁)
如果只是单纯转发邮件,推荐直接使用SDK提供的Forward方法,它会自动处理原邮件的包含逻辑,无需手动添加附件:
await graphClient.Me.Messages[originalMsgId] .Forward( new Message { ToRecipients = new List<Recipient> { new Recipient { EmailAddress = new EmailAddress { Address = "收件人邮箱@example.com" } } }, Comment = "这是转发的备注信息" } ) .Request() .PostAsync();
关键注意事项
- 确保已安装正确的NuGet包:
Microsoft.Graph和Azure.Identity(根据认证方式选择对应包)。 - 避免直接操作
Attachment基类,根据附件类型选择对应的派生类。 - 优先使用Graph API原生的转发方法,减少手动构建的出错概率。
内容的提问来源于stack exchange,提问作者dlwest
相关产品推荐
相关产品推荐

