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

ASP.Net Core 5.0中能否发送带@提及的邮件?若可行如何实现?

核心结论

当然可以实现Outlook里的@提及通知功能!不过你用的System.Net.Mail.MailMessage确实没法直接做到——这个类是基于SMTP的底层实现,而@提及是Outlook/Exchange专属的功能,得借助Exchange的专用API来实现,比如Microsoft Graph API或者Exchange Web Services (EWS)。

另外你的推测完全正确:@提及的专属通知(Outlook弹窗、收件箱里的“被提及”标记)确实仅对同一组织内的Exchange/Outlook用户生效,外部收件人只会看到邮件里的@文本,不会收到专属提醒,这刚好匹配你的使用场景~

具体实现方案(推荐用Microsoft Graph API)

因为EWS已经被微软标记为逐步弃用,所以更推荐用Graph API来实现,ASP.NET Core 5.0里集成起来很顺畅:

1. 前期准备

  • 在Azure AD中注册一个应用,获取客户端ID、客户端密钥和租户ID
  • 给这个应用授予Mail.Send的应用权限(因为是后台发送邮件,不需要用户交互)
  • 安装两个NuGet包:Microsoft.Graph和Azure.Identity

2. 代码实现示例

可以写一个邮件服务类或者直接在控制器里实现:

using Microsoft.Graph;
using Azure.Identity;

public async Task SendMentionedEmailAsync()
{
    // 初始化Graph客户端
    var tenantId = "你的组织租户ID";
    var clientId = "Azure AD应用的客户端ID";
    var clientSecret = "Azure AD应用的客户端密钥";
    var senderEmail = "你的发件人邮箱@yourcompany.com";

    var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
    var graphClient = new GraphServiceClient(credential);

    // 构建带提及的邮件
    var emailMessage = new Message
    {
        Subject = "测试@提及通知",
        Body = new ItemBody
        {
            ContentType = BodyType.Html,
            // 正文中的@标记要和Mentions里的MentionText对应
            Content = "<p>你好,<strong>@李四</strong>,请查看这条重要通知!</p>"
        },
        ToRecipients = new List<Recipient>
        {
            new Recipient
            {
                EmailAddress = new EmailAddress
                {
                    Address = "lisi@yourcompany.com",
                    Name = "李四"
                }
            }
        },
        // 关键:添加提及的用户元数据,这是触发Outlook通知的核心
        Mentions = new List<Mention>
        {
            new Mention
            {
                Mentioned = new EmailAddress
                {
                    Address = "lisi@yourcompany.com",
                    Name = "李四"
                },
                MentionText = "@李四",
                ClientReference = "mention_001" // 自定义唯一标识,用于区分不同提及
            }
        }
    };

    // 发送邮件,同时保存到发件箱
    await graphClient.Users[senderEmail]
        .SendMail(emailMessage, saveToSentItems: true)
        .Request()
        .PostAsync();
}

关键点说明

  • Mentions属性是核心:必须明确添加每个被提及用户的信息,且MentionText要和邮件正文中的@标记完全对应,这样Outlook才能识别并触发通知。
  • 发件人必须是组织内的Exchange账号:因为Graph API需要通过组织的租户权限来发送带提及的邮件。
  • 权限配置要正确:确保Azure AD应用的Mail.Send权限已经被管理员授予,否则会出现权限不足的错误。
关于SMTP方式的补充

如果你实在想继续用System.Net.Mail.MailMessage(SMTP协议),理论上可以手动添加Exchange专属的MIME扩展或X-Header,但这个方式非常不稳定——不同版本的Exchange服务器对这些扩展的支持不一致,而且微软没有公开完整的规范,所以不推荐这种方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:12:50