[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的原因。猜测,通过这种方式截获了接收人列表。
最近发现,自己有点眼高手低了。这里记录问题的解决过程,警告自己一下。
[c#]exchange回复,全部回复,转发所遇到的问题的更多相关文章
- 记微信开发(自定义回复&关注回复)
记微信开发(自定义回复&关注回复) 记微信开发(自定义回复&关注回复) code: <?php/** * wechat php test *///define your toke ...
- Exchange如何将邮件转发给外部邮件地址
Exchange如何将邮件转发给外部邮件地址 最近遇到一个需求.一位已经离职的员工需要将后续的邮件转发给他自己的私人邮箱.安全,行政的审核通过后,这个问题就到了技术部门了. Exchange可以很方便 ...
- myql 查询树形表结果:说说、说说的述评、评论的回复
myql 查询树形表结果:说说.说说的评论.评论的回复 有三张表关联表: 用户的说说表(ixt_customer_note) 说说的评论表(ixt_customer_note_comment) 评论的 ...
- DDD实践问题之 - 关于论坛的帖子回复统计信息的更新的思考
之前,在用ENode开发forum案例时,遇到了关于如何实现论坛帖子的回复的统计信息如何更新的问题.后来找到了自己认为比较合理的解决方案,分享给大家.也希望能和大家交流,擦出更多的火花. 论坛核心领域 ...
- C#微信开发之旅--基本信息的回复
上一篇说到配置和验证<C#微信开发之旅--准备阶段> 下面来实现一下简单的信息回复. 也就是接收XML,返回XML 可以去看下微信开发文档的说明:http://mp.weixin.qq.c ...
- 自己动手写Redis客户端(C#实现)4 - 整数回复
整数回复 整数回复就是一个以 ":" 开头, CRLF 结尾的字符串表示的整数. 比如说, ":0\r\n" 和 ":1000\r\n" 都 ...
- java微信开发之接受消息回复图片或者文本
上回说到 接口连接成功,接下来是真正的开发了. 消息的接收,整个过程就是关注订阅号的用户在微信订阅号中发送消息,微信服务器接收到消息,将消息发给开发者的服务器,服务器接收消息然后可以根据内容进行回复. ...
- Java微信公众平台开发(八)--多媒体消息回复
转自:http://www.cuiyongzhi.com/post/46.html 之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消 ...
- Java微信公众平台开发(四)--回复消息的分类及实体的创建
转自:http://www.cuiyongzhi.com/post/42.html 前面有说道对接收到微信服务器消息后对消息的分类,当时主要分为普通消息和事件消息,这里我们要讲述的是我们在给用户回复的 ...
- Java微信公众平台开发(七)--多媒体消息回复之图片回复
之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消息的回复方法,[多媒体消息]包含回复图片消息/回复语音消息/回复视频消息/回复音乐消 ...
随机推荐
- js-JavaScript高级程序设计学习笔记18
第21章 AJAX 4.跨域源资源共享 CORS跨域源资源共享,其背后思想,是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是否应该成功. 1.IE对CORS的实现 在IE8中引 ...
- JNI笔记之 初体验
Java Native Interface提供了java与c语言写的代码之间互相调用的方式.在c语言方面jni.h中声明了许多的类型和方法,有很多java的数据类型和c语言类型的转换方法函数. jav ...
- 洛谷P1808 单词分类
题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等. 例如“AABA ...
- dedeCMS /data/mysql_error_trace.php DB error raised PHP Code Injection Via /include/dedesql.class.php Log FIle Without Access Validation
目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 dedecms采用面向对象封装的方式实现了功能操作的模块集中化,例如对于数据库管理 ...
- java.io.IOException: No FileSystem for scheme: hdfs
在这篇文章中,介绍了如何将Maven依赖的包一起打包进jar包.使用maven-assembly打成jar后,将这个jar提供给其他工程引用的时候,报出如下错误: log4j:WARN No appe ...
- Request 对象
Request 对象用于检索从浏览器向服务器发送的请求中的信息. 1.使用Request对象的Browser属性,可以访问HttpBrowserCapabilities属性获得当前正在使用哪种类型的浏 ...
- “K米” 软件产品评测
第一部分 调研,评测 评测: 第一次上手体验:KTV相信很多人都有去过,大部分包厢只有哦一个点歌台,相信很多人都会烦恼于一堆人挤在小小的点歌台前点歌的样子,还有些人不太好意思跑到点歌台点歌,常常是碰到 ...
- ionic的scroll的使用出现的问题
今天再写ionic的时候发现了一个问题,在使用ui-view的时候引用ion-scroll指令的时候初次加载的时候能能实现拖拽滚动,只能实现滚动鼠标滚轴滚动,然后各种调试,各种比较,终于发现原来是路由 ...
- angularjs中ng-change使用方法
ng-change需与ng-model结合使用,官网说明如下:Note, this directive requires ngModel to be present. <label for=&q ...
- DataReader和DataSet的异同
DataReader:使用时始终占用SqlConnection,在线操作数据库:每次只在内存中加载一条数据,所以占用的内存是很小的:是只进的. 只读的. DataSet:则是将数据一次性加载在内存中. ...