[c#]exchange回复,全部回复,转发所遇到的问题
摘要
场景:
用户B向A用户发送了一封邮件。
用户A答复邮件时,会默认将B作为接收人。
问题:
在用exchange的回复,全部回复,转发(Reply和Foward方法)邮件的时候,需求是用户可以删除用户B(转发除外),可以自定义接收人。但提供的Reply方法,发现用户B仍会收到答复的邮件。
解决办法
通过反编译查看了Reply和Forward的方法:
通过上面的图可以看到,这两个方法是通过ResponseMessage对象实现发送和添加额外的接收人的。
所以我们可以通过ResponseMessage对象来实现回复和转发,修改接收人信息。代码片段如下:
/// <summary> /// exchange服务对象 /// </summary> private static ExchangeService _exchangeService = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
/// <summary> /// 回复转发操作 /// </summary> /// <param name="email"></param> /// <param name="user"></param> /// <param name="type"></param> public static void Reply_Forword(Email email, UserInfoBase user, string type) { try { if (userInfo == null) { throw new ArgumentNullException("当前用户信息为空,无法访问exchange服务器"); } _exchangeService.Credentials = new NetworkCredential(userInfo.Name, userInfo.Pwd, userInfo.Doamin); _exchangeService.Url = new Uri(WebConfig.ExchangeServerUrl);//邮件内容 EmailMessage message = EmailMessage.Bind(_exchangeService, new ItemId(email.Uniqueid)); string[] strTos = email.Mail_to.Split(';'); message.ToRecipients.Clear(); message.CcRecipients.Clear(); message.ReplyTo.Clear(); message.BccRecipients.Clear(); ResponseMessage responseMessage = null; //发送并且保存 if (type == "reply") { responseMessage = message.CreateReply(false); } else if (type == "all") { responseMessage = message.CreateReply(true); } else if (type == "forword") { responseMessage = message.CreateForward(); } if (responseMessage != null) { //接收人 foreach (var item in email.Mail_to.Split(';')) { responseMessage.ToRecipients.Add(item); } //抄送人 foreach (string item in email.Mail_cc.Split(';')) { responseMessage.CcRecipients.Add(item); } responseMessage.BodyPrefix = new MessageBody(email.body); responseMessage.Subject = email.Subject; responseMessage.SendAndSaveCopy(); } } catch (Exception ex) { throw new Exception("发送邮件出错," + ex.Message + ":" + ex.StackTrace); } }
总结
在查找解决办法的时候,反编译了回复和转发方法的实现方式,发现内部是通过ResponseMessage对象来实现的,就没再去尝试。但通过同事帮忙,找到了MSDN一篇文章
https://msdn.microsoft.com/en-us/library/dd633704(v=exchg.80).aspx
在这篇文章中又提到了ResponseMessage对象。
添加额外的接收人。
最后通过这种方式,修改掉了B用户。
现在回头看看反编译的图,就明白了,在转发邮件的时候,是会修改掉用户B的,转发邮件并不需要默认的接收人,因为你转发的对象还未知。
这也印证了上面为什么ResponseMessage对象可以修改掉用户B的原因。猜测,通过这种方式截获了接收人列表。
最近发现,自己有点眼高手低了。这里记录问题的解决过程,警告自己一下。
-
博客地址:http://www.cnblogs.com/wolf-sun/
博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2013-07-22 操作sqlserver数据库常用的三个方法
2013-07-22 jquery基础总结