已好几个月没写博客了,由于之前忙于开发基于Sharepoint上的移动OA(AgilePoint)和采用混合移动开发技术开发一个安卓版的企业通讯录APP(数据与lync一致),并于1月初正式上线。马年初二的时候,有个天津的网友加我QQ,说我之前发表博客SharePoint 2013中修改windows 活动目录(AD)域用户密码的WebPart(免费下载),的确对他有帮助,要捐助78元给我,希望我多发表相关的经验总结分享,本人深受鼓舞,并把修改AD域用户密码发他参考学习研究,并在初五合作了另外的Sharepoint 2013开发需求,并通过淘宝支付了定金,能够帮助他人解决问题,得到他人的认可还是蛮开心的。

今天分享一下在1月初完成的KMS与OA的门户整合中其中用到的一种读取Exchange的用户未读邮件数方法,由于KMS是基于Java开发的,并且通过Cas已实现了SSO,需要通过接口把当前登录用户的未读取邮件数显示在KMS中,点击直接进入到OWA页面,如下图:

本文主要通过采用EWS API方式自定义开发一个Web服务,并授权一个账户有模拟其他用户的权限,具体如下:

1.安装Microsoft Exchange Web Services Managed API 2.0,下载地址如下:

http://www.microsoft.com/en-us/download/details.aspx?id=35371

2.0版本支持Exchange Server 2007 Service Pack 1以上,即包括Exchange Server 2010 Service和 Exchange Server 2013 Service。

2.在Exchange服务器中授权一个账户有模拟其他用户的权限,具体如下:

以Exchange 2010 Server为例,比如授权spadmin账号模拟其他用户的权限,打开Exchange 2010服务器在命令行中输入:

New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:spadmin

3.利用EWS API开发一个自定义的读取Exchange的用户未读邮件数Web服务,已供其他系统(如KMS)调用,完整的C#代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Services.Description;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using ExchangeWebService.ews; namespace ExchangeWebService
{
/// <summary>
/// Exchange Web Service by 软件人生 2013.12.31
/// </summary>
[WebService(Namespace = "http://www.cnblogs.com/nbpowerboy/exchange/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
[System.Web.Script.Services.ScriptService]
public class ExchangeWebService : System.Web.Services.WebService
{ /// <summary>
/// 返回默认登录域用户的未读邮件数
/// </summary>
/// <returns>返回默认登录域用户的未读邮件数</returns>
[SoapRpcMethod(Action = "http://www.cnblogs.com/nbpowerboy/exchange/GetUserUnReadMailCount", RequestNamespace = "http://www.cnblogs.com/nbpowerboy/exchange/", ResponseNamespace = "http://www.cnblogs.com/nbpowerboy/exchange/", Use = SoapBindingUse.Literal)]
[WebMethod]
public int GetUserUnReadMailCount(string username, string password, string domain)
{ int merCurrentCount = ; try
{
ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; }; ExchangeServiceBinding service = new ExchangeServiceBinding(); service.RequestServerVersionValue = new RequestServerVersion();
service.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2010_SP2;
service.EnableDecompression = true;
System.Net.NetworkCredential nc = new NetworkCredential(username,password,domain);
//ICredentials creds = System.Net.CredentialCache.DefaultNetworkCredentials;
service.Credentials = nc; service.Url = @"https://mailserver/EWS/exchange.asmx"; merCurrentCount = GetUnreadFolderItemsCount(service, "收件箱"); }
catch
{ } return merCurrentCount;
} /// <summary>
/// 根据用户邮件地址返回用户的未读邮件数
/// </summary>
/// <returns>根据用户邮件地址返回用户的未读邮件数</returns>
[SoapRpcMethod(Action = "http://www.cnblogs.com/nbpowerboy/exchange/GetUnReadMailCountByUserMailAddress", RequestNamespace = "http://www.cnblogs.com/nbpowerboy/exchange/", ResponseNamespace = "http://www.cnblogs.com/nbpowerboy/exchange/", Use = SoapBindingUse.Literal)]
[WebMethod]
public int GetUnReadMailCountByUserMailAddress(string UserMailAddress)
{ int unRead = ; try
{ Microsoft.Exchange.WebServices.Data.ExchangeService service = new Microsoft.Exchange.WebServices.Data.ExchangeService(Microsoft.Exchange.WebServices.Data.ExchangeVersion.Exchange2010_SP2);
service.Credentials = new NetworkCredential("spadmin", "Password", "contoso");
service.Url = new Uri(@"https://mailserver/EWS/exchange.asmx"); service.ImpersonatedUserId = new Microsoft.Exchange.WebServices.Data.ImpersonatedUserId(Microsoft.Exchange.WebServices.Data.ConnectingIdType.SmtpAddress, UserMailAddress); unRead = Microsoft.Exchange.WebServices.Data.Folder.Bind(service, Microsoft.Exchange.WebServices.Data.WellKnownFolderName.Inbox).UnreadCount;
}
catch
{ } return unRead;
} /// <summary>
/// 根据用户名返回用户的未读邮件数
/// </summary>
/// <returns>根据用户邮件地址返回用户的未读邮件数</returns>
[SoapRpcMethod(Action = "http://www.cnblogs.com/nbpowerboy/exchange/GetUnReadMailCountByUserPrincipalName", RequestNamespace = "http://www.cnblogs.com/nbpowerboy/exchange/", ResponseNamespace = "http://www.cnblogs.com/nbpowerboy/exchange/", Use = SoapBindingUse.Literal)]
[WebMethod]
public int GetUnReadMailCountByUserPrincipalName(string UserPrincipalName)
{ int unRead = ; try
{ Microsoft.Exchange.WebServices.Data.ExchangeService service = new Microsoft.Exchange.WebServices.Data.ExchangeService(Microsoft.Exchange.WebServices.Data.ExchangeVersion.Exchange2010_SP2);
service.Credentials = new NetworkCredential("spadmin", "Password", "contoso");
service.Url = new Uri(@"https://mailserver/EWS/exchange.asmx"); service.ImpersonatedUserId = new Microsoft.Exchange.WebServices.Data.ImpersonatedUserId(Microsoft.Exchange.WebServices.Data.ConnectingIdType.PrincipalName, UserPrincipalName); unRead = Microsoft.Exchange.WebServices.Data.Folder.Bind(service, Microsoft.Exchange.WebServices.Data.WellKnownFolderName.Inbox).UnreadCount;
}
catch
{ } return unRead;
} private static int GetUnreadFolderItemsCount(ExchangeServiceBinding service, string folderName)
{
try
{
int unReadCount = -;
// Identify the folder properties to return.
FolderResponseShapeType properties = new FolderResponseShapeType();
PathToUnindexedFieldType ptuft = new PathToUnindexedFieldType();
ptuft.FieldURI = UnindexedFieldURIType.folderManagedFolderInformation;
PathToUnindexedFieldType[] ptufts = new PathToUnindexedFieldType[] { ptuft };
properties.AdditionalProperties = ptufts;
properties.BaseShape = DefaultShapeNamesType.AllProperties; // Form the get folder request.
BaseFolderIdType p_folder = FindFolderID(service, folderName); GetFolderType request = new GetFolderType();
request.FolderIds = new BaseFolderIdType[] { p_folder };
request.FolderShape = properties; // Send the request and get the response.
GetFolderResponseType response = service.GetFolder(request); ArrayOfResponseMessagesType aormt = response.ResponseMessages;
ResponseMessageType[] rmta = aormt.Items;
foreach (ResponseMessageType rmt in rmta)
{
if (rmt.ResponseClass == ResponseClassType.Error)
{
throw new Exception(rmt.MessageText);
}
else
{
FolderInfoResponseMessageType firmt;
firmt = (rmt as FolderInfoResponseMessageType);
BaseFolderType[] folders = firmt.Folders; foreach (BaseFolderType rfolder in folders)
{
if (rfolder is FolderType)
{
FolderType myFolder;
myFolder = (rfolder as FolderType);
if (myFolder.UnreadCountSpecified)
{
unReadCount = myFolder.UnreadCount;
}
}
}
}
}
return unReadCount;
}
catch
{
return ;
}
} private static FolderIdType FindFolderID(ExchangeServiceBinding service, String folderName)
{
DistinguishedFolderIdType objSearchRootFolder = new DistinguishedFolderIdType();
objSearchRootFolder.Id = DistinguishedFolderIdNameType.msgfolderroot; FindFolderType requestFindFolder = new FindFolderType();
requestFindFolder.Traversal = FolderQueryTraversalType.Deep;
requestFindFolder.ParentFolderIds = new DistinguishedFolderIdType[] { objSearchRootFolder };
requestFindFolder.FolderShape = new FolderResponseShapeType();
requestFindFolder.FolderShape.BaseShape = DefaultShapeNamesType.IdOnly; //Search filter definition
requestFindFolder.Restriction = new RestrictionType(); #region Contains expression ContainsExpressionType objContainsExpression = new ContainsExpressionType();
objContainsExpression.ContainmentMode = ContainmentModeType.FullString;
objContainsExpression.ContainmentModeSpecified = true;
objContainsExpression.ContainmentComparison = ContainmentComparisonType.Exact;
objContainsExpression.ContainmentComparisonSpecified = true; PathToUnindexedFieldType objFieldFolderName = new PathToUnindexedFieldType();
objFieldFolderName.FieldURI = UnindexedFieldURIType.folderDisplayName;
objContainsExpression.Item = objFieldFolderName; objContainsExpression.Constant = new ConstantValueType();
objContainsExpression.Constant.Value = folderName; #endregion Contains expression requestFindFolder.Restriction.Item = objContainsExpression; FindFolderResponseType objFindFolderResponse =
service.FindFolder(requestFindFolder); if (objFindFolderResponse.ResponseMessages.Items.Length == )
return null; foreach (ResponseMessageType responseMsg in
objFindFolderResponse.ResponseMessages.Items)
{
if (responseMsg.ResponseClass == ResponseClassType.Success)
{
FindFolderResponseMessageType objFindResponse =
responseMsg as FindFolderResponseMessageType;
foreach (
BaseFolderType objFolderType in objFindResponse.RootFolder.Folders)
{
return objFolderType.FolderId;
}
}
}
return null;
} }
}

本博客为软件人生原创,欢迎转载,转载请标明出处:http://www.cnblogs.com/nbpowerboy/p/3539422.html 。演绎或用于商业目的,但是必须保留本文的署名软件人生(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。

一种读取Exchange的用户未读邮件数方法!的更多相关文章

  1. 读取Exchange的用户未读邮件数的几种方法

    [http://www.cnblogs.com/nbpowerboy/p/3539422.html] 可以使用ExchangeServiceBinding获取邮件,他相当于outlook, 来获取服务 ...

  2. 利用腾讯企业邮箱开放API获取账户未读邮件数初探

    公司一直使用腾讯提供的免费企业邮箱服务,今天用管理员帐户登录后发现,原来现在腾讯的企业邮箱也开放了部分API 你可以通过开放接口实现以下功能: 数据同步 数据同步可以帮助你同步部门成员信息,你还可以创 ...

  3. 采用模拟账号读取Exchange server未读邮件的注意事项(链接邮箱问题)【转】

    最近做项目碰到Exchange中,用EWS API方法读取的未读邮箱(ConnectingIdType.PrincipalName设置该属性的方法)附带代码部分: 核心代码 using Microso ...

  4. dovecot--查询未读邮件个数

    最近负责的邮箱系统项目中有一个这样的需求:提供一个接口给业务层,可以通过邮箱查询到该用户的未读邮件个数. 之前的方案是通过查看用户目录下.INBOX/new目录中的文件个数,但是这个方法不准确,当有用 ...

  5. outlook——还原“未读邮件”文件夹

    参考链接:http://office.microsoft.com/zh-cn/outlook-help/HA010283248.aspx 摘抄: 还原“未读邮件”文件夹 全部显示 全部隐藏 “未读邮件 ...

  6. Outlook查找未读邮件

    1.查找新邮件的未读邮件,可以在下图中查找 2.恢复已删除邮件,如果邮件是未读邮件,在上图中是查找不到,只能通过视图去查找 步骤2内容摘自百度

  7. Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒

    http://www.51itong.net/android-badgenumber-9789.html Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒 ...

  8. MailKit---如何知道文件夹下有多少封未读邮件

    如果在mailkit中,文件夹已经选中并打开了的话,那直接使用ImapFolder.Unread属性就可以获取到有多少封未读邮件了. 如果文件夹没有打开,那么你还可以使用查询状态的方法来获取未读状态的 ...

  9. ExchangeServeice获取在线outlook邮箱中的未读邮件

    using Microsoft.Exchange.WebServices.Data; using System; using System.Collections.Generic; using Sys ...

随机推荐

  1. MongoDB与.NET结合使用一(mongodb在windows 2003上的安装)

    mongodb发展至今已经到2.6版本了,自从获得了1亿美元的风投之后,发展速度更是比以前快了很多,前段时间因为要用缓存,也比较了mongodb,大家也都觉得比较适合做无关系化的大数据存储,所以系统统 ...

  2. MySQL笔记汇总

    [目录] MySQL笔记汇总 一.mysql简介 数据简介 结构化查询语言 二.mysql命令行操作 三.数据库(表)更改 表相关 字段相关 索引相关 表引擎操作 四.数据库类型 数字型 字符串型 日 ...

  3. Nodejs学习笔记(十四)— Mongoose介绍和入门

    目录 简介 mongoose安装 连接字符串 Schema Model 常用数据库操作 插入 更新 删除 条件查询 数量查询 根据_id查询 模糊查询 分页查询 其它操作 写在之后... 简介 Mon ...

  4. python mysql desc

    #!/usr/bin/python import MySQLdb try: conn=MySQLdb.connect(host='localhost',user='root',passwd='your ...

  5. paip.提升性能---string split

    paip.提升性能---string split 大概一万次就能看到慢的兰.. /////split 慢的原因.因为使用了正则表达式的,这样,就慢的了.. 作者Attilax  艾龙,  EMAIL: ...

  6. atitit.gui界面纵向居中总结

    atitit.gui界面纵向居中总结 1.table法...这个简单.. 表格设置100%高度,<td align="center" valign="middle& ...

  7. thinkphp框架下404页面设置

    404页面即系统在找不到请求的操作方法和找不到请求的控制器名称时的一种报错行为的优化. 第一步:在thinkphp框架中的Home/Comtroller中建一个EmptyController.clas ...

  8. nginx是一个反向代理的软件

    nginx只是一个反向代理的软件,和语言无关,理论上支持任何Web平台,当然http://Asp.net也不例外,http://51aspx.com就是http://Asp.net开发的,前端暴漏的是 ...

  9. HTML5手机APP开发入(3)

    HTML5手机APP开发入(3) 课程内容: 按照AngularJs MVC框架进行代码重构,新建一个DataService服务类使用SQLite插件实现储存对通讯录的本地存储. 涉及的知识点: An ...

  10. android 图片占用内存与什么有关

    android 图片占用内存与什么有关 原文链接:http://blog.csdn.net/zjl5211314/article/details/7041813 在开发手机应用的时候,内存是有限的,那 ...