求基于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
相关产品推荐
相关产品推荐

