已好幾個月沒寫博客了,因爲以前忙於開發基於Sharepoint上的移動OA(AgilePoint)和採用混合移動開發技術開發一個安卓版的企業通信錄APP(數據與lync一致),並於1月初正式上線。馬年初二的時候,有個天津的網友加我QQ,說我以前發表博客SharePoint 2013中修改windows 活動目錄(AD)域用戶密碼的WebPart(免費下載),的確對他有幫助,要捐助78元給我,但願我多發表相關的經驗總結分享,本人深受鼓舞,並把修改AD域用戶密碼發他參考學習研究,並在初五合做了另外的Sharepoint 2013開發需求,並經過淘寶支付了定金,可以幫助他人解決問題,獲得他人的承認仍是蠻開心的。html
今天分享一下在1月初完成的KMS與OA的門戶整合中其中用到的一種讀取Exchange的用戶未讀郵件數方法,因爲KMS是基於Java開發的,而且經過Cas已實現了SSO,須要經過接口把當前登陸用戶的未讀取郵件數顯示在KMS中,點擊直接進入到OWA頁面,以下圖:express
本文主要經過採用EWS API方式自定義開發一個Web服務,並受權一個帳戶有模擬其餘用戶的權限,具體以下:
windows
1.安裝Microsoft Exchange Web Services Managed API 2.0,下載地址以下:服務器
http://www.microsoft.com/en-us/download/details.aspx?id=35371dom
2.0版本支持Exchange Server 2007 Service Pack 1以上,即包括Exchange Server 2010 Service和 Exchange Server 2013 Service。post
2.在Exchange服務器中受權一個帳戶有模擬其餘用戶的權限,具體以下:學習
以Exchange 2010 Server爲例,好比受權spadmin帳號模擬其餘用戶的權限,打開Exchange 2010服務器在命令行中輸入:ui
New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:spadminurl
3.利用EWS API開發一個自定義的讀取Exchange的用戶未讀郵件數Web服務,已供其餘系統(如KMS)調用,完整的C#代碼以下:spa
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 = 0; 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 = 0; 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 = 0; 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 = -1; // Identify the folder properties to return. FolderResponseShapeType properties = new FolderResponseShapeType(); PathToUnindexedFieldType ptuft = new PathToUnindexedFieldType(); ptuft.FieldURI = UnindexedFieldURIType.folderManagedFolderInformation; PathToUnindexedFieldType[] ptufts = new PathToUnindexedFieldType[1] { 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[1] { 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 0; } } 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 == 0) 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 。演繹或用於商業目的,可是必須保留本文的署名軟件人生(包含連接)。如您有任何疑問或者受權方面的協商,請給我留言。 |