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

如何修改SMTPClient代码实现Outlook仅加密邮件发送?

实现Outlook“仅加密”邮件效果的替代方案

你当前使用的MailMessage和SMTPClient本身不支持Outlook的**信息权限管理(IRM)**加密(也就是你通过Interop设置olDoNotForward实现的“仅加密/禁止转发”效果),因为这种加密依赖Microsoft Exchange/Office 365的RMS服务。以下是两种可行的替代方案,无需使用Outlook Interop:


方案1:使用S/MIME证书加密邮件(标准邮件加密)

这是通用的邮件内容加密方式,对应Outlook的“S/MIME加密”选项,收件方需要持有对应的解密证书才能查看内容。推荐用MimeKit库(原生支持S/MIME)来实现,示例代码如下:

using MimeKit;
using MimeKit.Cryptography;
using System.Security.Cryptography.X509Certificates;

// 构建基础邮件
var message = new MimeMessage();
message.From.Add(new MailboxAddress("发件人名称", "sender@domain.com"));
message.To.Add(new MailboxAddress("收件人名称", destString));
message.Subject = subject;

// 设置邮件内容
message.Body = new TextPart("plain")
{
    Text = "需要加密的邮件内容"
};

// 加载收件方的公钥证书(用于加密内容)
var recipientCert = new X509Certificate2("path/to/recipient-certificate.cer");
// 加载发件人的S/MIME证书(若需同时签名邮件)
var senderCert = new X509Certificate2("path/to/sender-certificate.pfx", "证书密码");

// 创建加密上下文并加密邮件
using (var secureContext = new WindowsSecureMimeContext())
{
    secureContext.Import(recipientCert);
    secureContext.Import(senderCert);

    var encryptedMessage = ApplicationPkcs7Mime.Encrypt(secureContext, message.To, message);

    // 通过SMTP发送加密后的邮件
    using (var smtpClient = new SmtpClient())
    {
        smtpClient.Connect("smtp.your-server.com", 587, true);
        smtpClient.Authenticate("你的SMTP账号", "你的SMTP密码");
        smtpClient.Send(encryptedMessage);
        smtpClient.Disconnect(true);
    }
}

方案2:通过Microsoft Graph API实现IRM加密(和Outlook“仅加密”完全一致)

如果你需要和Outlook手动选择“仅加密”完全相同的效果(带IRM权限,禁止转发等),必须使用Microsoft Graph API,因为SMTPClient无法直接添加IRM权限标记。示例代码如下:

using Microsoft.Graph;
using Azure.Identity;
using System.Threading.Tasks;

public async Task SendEncryptedMailWithGraph()
{
    // 配置Azure AD应用信息
    var clientId = "你的Azure应用客户端ID";
    var tenantId = "你的租户ID";
    var clientSecret = "你的Azure应用客户端密钥";
    var senderEmail = "sender@domain.com";

    // 初始化Graph客户端
    var scopes = new[] { "https://graph.microsoft.com/.default" };
    var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
    var graphClient = new GraphServiceClient(credential, scopes);

    // 构建带IRM权限的邮件
    var mailMessage = new Message
    {
        Subject = subject,
        Body = new ItemBody
        {
            ContentType = BodyType.Text,
            Content = "带IRM加密的邮件内容"
        },
        ToRecipients = new List<Recipient>
        {
            new Recipient
            {
                EmailAddress = new EmailAddress { Address = destString }
            }
        },
        // 设置IRM权限:禁止转发,对应Outlook的“仅加密”效果
        Permission = new Permission
        {
            PermissionType = PermissionType.DoNotForward,
            PermissionService = PermissionService.Rms
        }
    };

    // 发送邮件
    await graphClient.Users[senderEmail]
        .SendMail(mailMessage, saveToSentItems: true)
        .Request()
        .PostAsync();
}

注意事项

  • 方案2需要你的账号所在租户支持RMS服务(如Office 365 E3/E5、Microsoft 365 Business Premium等),并在Azure AD中注册应用并授予Mail.Send等相关权限。
  • S/MIME加密和IRM加密是不同机制:S/MIME依赖证书,仅加密内容;IRM依赖RMS服务,除了加密还可限制收件人的操作(如禁止转发、复制)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:01:06