使用C# Mailkit创建邮件,Outlook ActiveSync下无发送按钮问题求助
问题解决:Outlook ActiveSync下Mailkit创建的草稿无发送按钮
核心原因
Outlook ActiveSync对可发送草稿的识别逻辑和IMAP/Exchange连接器不同:
- 它更依赖默认草稿文件夹而非自定义文件夹
- 需要邮件携带特定标记头(如
X-Unsent)或Exchange专属属性,仅设置MessageFlags.Draft不足以让ActiveSync识别为待发送草稿
解决方案
1. 将草稿存入默认Drafts文件夹
ActiveSync通常仅把默认草稿文件夹内的邮件标记为可发送状态,修改代码使用系统默认草稿文件夹:
using (var client = new ImapClient()) { String email = ""; String password = ""; String server = ""; client.Connect(server, 993, true); client.Authenticate(email, password); // 获取默认草稿文件夹,而非自定义文件夹 var draftsFolder = client.GetFolder(SpecialFolder.Drafts); var reply = new MimeMessage(); reply.From.Add(new MailboxAddress("Test", email)); reply.To.Add(new MailboxAddress("Test", "")); reply.Subject = "Testemail"; // 添加X-Unsent头,让ActiveSync识别为待发送草稿 reply.Headers.Add("X-Unsent", "1"); var bodyBuilder = new BodyBuilder(); bodyBuilder.HtmlBody = ""; reply.Body = bodyBuilder.ToMessageBody(); draftsFolder.Append(reply, MessageFlags.Draft); client.Disconnect(true); }
2. 针对Exchange服务器使用ExchangeClient
如果目标是Exchange服务器,直接使用Mailkit的ExchangeClient能更好适配ActiveSync的属性要求:
using (var client = new ExchangeClient(server, email, password)) { var reply = new MimeMessage(); reply.From.Add(new MailboxAddress("Test", email)); reply.To.Add(new MailboxAddress("Test", "")); reply.Subject = "Testemail"; reply.Headers.Add("X-Unsent", "1"); var bodyBuilder = new BodyBuilder(); bodyBuilder.HtmlBody = ""; reply.Body = bodyBuilder.ToMessageBody(); // 保存到Exchange默认草稿文件夹 client.AppendMessage(SpecialFolder.Drafts, reply, MessageFlags.Draft); }
3. 若必须使用自定义文件夹(可选)
如果一定要用自定义文件夹,需确保该文件夹被ActiveSync标记为"草稿类"文件夹,但此操作通常需要通过Exchange管理端配置,或使用Exchange Web Services(EAS)协议设置文件夹属性,IMAP协议无法直接完成这一配置。
内容的提问来源于stack exchange,提问作者pinky10
相关产品推荐
相关产品推荐

