一種讀取Exchange的用戶未讀郵件數方法!

   已好幾個月沒寫博客了,因爲以前忙於開發基於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 。演繹或用於商業目的,可是必須保留本文的署名軟件人生(包含連接)。如您有任何疑問或者受權方面的協商,請給我留言。

相關文章
相關標籤/搜索