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

求基于Microsoft Graph API C# SDK发送SMIME格式邮件的示例代码

使用Microsoft Graph API C# SDK发送SMIME格式邮件示例

前提说明

你已实现普通MIME邮件发送,以下示例基于此基础,实现SMIME签名/加密邮件的发送流程,核心是先生成符合SMIME标准的MIME内容,再通过Graph API提交。


示例代码

1. 引用必要命名空间

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using MimeKit;
using MimeKit.Cryptography;
using Microsoft.Graph;

2. 完整发送逻辑

// 初始化已完成授权的GraphServiceClient(复用你现有授权逻辑)
var graphClient = new GraphServiceClient(authProvider);

// 1. 构建基础MIME邮件内容
var baseMessage = new MimeMessage();
baseMessage.From.Add(new MailboxAddress("发送者名称", "sender@yourdomain.com"));
baseMessage.To.Add(new MailboxAddress("接收者名称", "recipient@targetdomain.com"));
baseMessage.Subject = "SMIME签名测试邮件";

var bodyBuilder = new BodyBuilder();
bodyBuilder.TextBody = "这是一封经过SMIME签名的测试邮件内容";
baseMessage.Body = bodyBuilder.ToMessageBody();

// 2. 获取SMIME签名证书(从本地证书存储读取,可根据实际场景调整获取方式)
X509Certificate2 signingCert = null;
using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindBySubjectName, "你的证书主体名称", false);
if (certs.Count > 0)
    signingCert = certs[0];
store.Close();

if (signingCert == null)
    throw new InvalidOperationException("未找到可用的SMIME签名证书");

// 3. 生成SMIME签名后的邮件内容
var signer = new CmsSigner(signingCert);
signer.DigestAlgorithm = DigestAlgorithm.Sha256;

using var baseMsgStream = new MemoryStream();
baseMessage.WriteTo(baseMsgStream);
baseMsgStream.Position = 0;

var signedSmimeMsg = ApplicationPkcs7Mime.Sign(signer, baseMsgStream, true);

// 4. 转换为Base64格式,用于Graph API提交
string smimeBase64;
using var signedStream = new MemoryStream();
signedSmimeMsg.WriteTo(signedStream);
smimeBase64 = Convert.ToBase64String(signedStream.ToArray());

// 5. 通过Graph API发送SMIME邮件
var sendRequest = new SendMailRequest
{
    SaveToSentItems = true
};

await graphClient.Me.SendMail
    .PostAsync(sendRequest, config =>
    {
        // 设置SMIME内容类型头
        config.Headers.Add("Content-Type", "application/x-pkcs7-mime; smime-type=signed-data; name=smime.p7m");
        // 提交SMIME原始内容
        config.Body = new StreamContent(new MemoryStream(Convert.FromBase64String(smimeBase64)));
    });

补充说明

  • 加密邮件实现:若需发送加密SMIME邮件,替换签名步骤为ApplicationPkcs7Mime.Encrypt方法,需提前获取接收者的SMIME公证书
  • 权限要求:确保Graph API已申请Mail.Send权限
  • 证书要求:使用的SMIME证书需与发件人邮箱地址匹配,且包含有效的签名/加密用途扩展

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:27:41