能否使用MailKit结合Azure上的Microsoft Graph发送邮件
关于MailKit结合Microsoft Graph发送邮件的解决方案
核心结论
不能直接用MailKit的SMTP发送方法对接Microsoft Graph,必须将MailKit构建的邮件转换为Microsoft Graph API要求的格式后,通过PostAsync调用Graph接口发送。
原因说明
MailKit是基于SMTP协议的邮件客户端工具,而Microsoft Graph是RESTful API服务,二者的通信机制完全不同,MailKit本身并没有内置直接调用Microsoft Graph的方法,所以无法直接用MailKit的发送逻辑对接Graph。
具体实现步骤
用MailKit构建邮件
正常使用MailKit的MimeMessage类构建包含主题、收件人、正文、附件的邮件内容,示例代码:var message = new MimeMessage(); message.From.Add(new MailboxAddress("发件人", "sender@example.com")); message.To.Add(new MailboxAddress("收件人", "recipient@example.com")); message.Subject = "测试邮件"; message.Body = new TextPart("html") { Text = "<p>这是用MailKit构建的邮件内容</p>" };将MimeMessage转换为Graph兼容格式
MailKit的MimeMessage可以导出为RFC 822标准的字节流,再Base64编码后,作为Microsoft Graph发送邮件API的contentBytes参数:using var stream = new MemoryStream(); message.WriteTo(stream); var base64Content = Convert.ToBase64String(stream.ToArray());调用Microsoft Graph API发送
构造符合Graph要求的请求体,包含message对象(其中contentBytes为上面的Base64字符串),然后通过PostAsync发送到Graph的sendMail接口:var graphRequest = new { message = new { subject = message.Subject, contentBytes = base64Content }, saveToSentItems = true }; var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "你的Graph令牌"); var response = await httpClient.PostAsync( "https://graph.microsoft.com/v1.0/me/sendMail", new StringContent(JsonSerializer.Serialize(graphRequest), Encoding.UTF8, "application/json") ); response.EnsureSuccessStatusCode();
补充说明
如果希望简化流程,也可以结合Microsoft Graph SDK来发送,但核心逻辑还是需要将MailKit构建的MimeMessage转换为Base64编码的内容字节流,再传入SDK的邮件发送方法中。
内容的提问来源于stack exchange,提问作者dgxhubbard
相关产品推荐
相关产品推荐

