jane27 发表于 2015-9-10 12:37:54

读取exchange邮件的未读数(转载)

  protected void Page_Load(object sender, EventArgs e)
      {
            Response.Write("administrator的未读邮件数是:" + UnReadCount("administrator@domainname"));
      }
      int UnReadCount(string userMailAddress)
      {
            EwsConfig config = new EwsConfig();
            config.ExchangeVersion = ExchangeVersion.Exchange2010;
            //config.ExchangeVersion = ExchangeVersionType.Exchange2010_SP2;// ExchangeVersion.Exchange2010_SP3;
            config.EWSServiceUrl = "https://1.1.100.130/EWS/exchange.asmx";
            config.ExchangeAdministrator = "administrator";
            config.ExchangeAdministratorPassword = "password";
            config.DomainName = "domainname";
            config.OtherUserName = "";
            //下面这句屏蔽服务器证书验证,防止页面报“根据验证过程,远程证书无效”的错误
            ServicePointManager.ServerCertificateValidationCallback =
            delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };
            ExchangeService service = new ExchangeService(config.ExchangeVersion);
  service.Credentials = new NetworkCredential(config.ExchangeAdministrator, config.ExchangeAdministratorPassword, config.DomainName);
            service.Url = new Uri(config.EWSServiceUrl);
            //前提打开Exchange 2010服务器在命令行中输入:
            //New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:
            service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.PrincipalName, config.OtherUserName);
            ImpersonatedUserId imperson = new ImpersonatedUserId();
            imperson.IdType = ConnectingIdType.SmtpAddress;
            imperson.Id = userMailAddress;
            service.ImpersonatedUserId = imperson;
            int unRead = Folder.Bind(service, WellKnownFolderName.Inbox).UnreadCount;
            return unRead;
            //HttpContext.Current.Response.Write(config.OtherUserName + "未读邮件数:" + unRead);
      }
      public struct EwsConfig
      {
            //ExchangeServiceBinding ser = new ExchangeServiceBinding();
  public ExchangeVersion ExchangeVersion;
            //public ExchangeVersionType ExchangeVersion;
            public string EWSServiceUrl;
            public string ExchangeAdministrator;
            public string ExchangeAdministratorPassword;
            public string DomainName;
            public string OtherUserName;
  }
  
  以下是方法:
  #region 给本人插入会议日程
  using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
  using System.Net.Mail;
using System.Net.Mime;
using System.Net;
using System.Text;
using System.Data.SqlClient;
using System.IO;
using System.Xml;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
  
      public void CreateAppointment(ExchangeServiceBinding esb, string sub, string roommail, string location, DateTime datefrom, DateTime dateto,string bodyvalue)
      {
            // Create the appointment.
            CalendarItemType appointment = new CalendarItemType();
            // Add item properties to the appointment.
            appointment.Body = new BodyType();
            appointment.Body.BodyType1 = BodyTypeType.Text;
            appointment.Body.Value = bodyvalue;//"Agenda Items.";
            //appointment.Categories = new string[] { "Category1", "Category2" };
            appointment.Importance = ImportanceChoicesType.High;
            appointment.ImportanceSpecified = true;
            appointment.ItemClass = "IPM.Appointment";
            appointment.Subject = sub;
            // Add an attendee
  MailAddressCollection mc = GetrMailAddressList();
            AttendeeType[] rAtt = new AttendeeType;
            for (int ii = 0; ii < rAtt.Length; ii++)
            {
                EmailAddressType eat = new EmailAddressType();
                eat.EmailAddress = mc.Address;
                eat.Name = mc.DisplayName;
                AttendeeType att = new AttendeeType();
                att.Mailbox = eat;
                rAtt = att;
            }
            //EmailAddressType eat1 = new EmailAddressType();
            //eat1.EmailAddress = "第一个与会者邮箱地址";
            //eat1.Name = "姓名";
            //AttendeeType at1 = new AttendeeType();
            //at1.Mailbox = eat1;
  //EmailAddressType eat2 = new EmailAddressType();
            //eat2.EmailAddress = "第一二个与会者邮箱地址";
            //eat2.Name = "姓名";
            //AttendeeType at2 = new AttendeeType();
            //at2.Mailbox = eat2;
         
            //AttendeeType[] rAtt = new AttendeeType;
            //rAtt = at1;
            //rAtt = at2;
            appointment.RequiredAttendees = rAtt;
  //add meeting room attendee
            EmailAddressType meetingRoom = new EmailAddressType();
            meetingRoom.EmailAddress = roommail ;// "会议室邮箱地址";
            meetingRoom.Name =location ;
            AttendeeType meetingType = new AttendeeType();
            meetingType.Mailbox = meetingRoom;
            AttendeeType[] meetingTypeList = new AttendeeType;
            meetingTypeList = meetingType;
            appointment.Resources = meetingTypeList;
            appointment.Location = location;
            // Add calendar properties to the appointment.
            appointment.Start = datefrom;
            appointment.StartSpecified = true;
            appointment.End = dateto;
            appointment.EndSpecified = true;
  // Identify the destination folder that will contain the appointment.
            DistinguishedFolderIdType folder = new DistinguishedFolderIdType();
            folder.Id = DistinguishedFolderIdNameType.calendar;
  // Create the array of items that will contain the appointment.
            NonEmptyArrayOfAllItemsType arrayOfItems = new NonEmptyArrayOfAllItemsType();
            arrayOfItems.Items = new ItemType;
  // Add the appointment to the array of items.
            arrayOfItems.Items = appointment;
  // Create the CreateItem request.
            CreateItemType createItemRequest = new CreateItemType();
            // The SendMeetingInvitations attribute is required for calendar items.
            //createItemRequest.SendMeetingInvitations = CalendarItemCreateOrDeleteOperationType.SendToNone;
            createItemRequest.SendMeetingInvitations = CalendarItemCreateOrDeleteOperationType.SendToAllAndSaveCopy;
            createItemRequest.SendMeetingInvitationsSpecified = true;
            // Add the destination folder to the CreateItem request.
            createItemRequest.SavedItemFolderId = new TargetFolderIdType();
            createItemRequest.SavedItemFolderId.Item = folder;
            // Add the items to the CreateItem request.
            createItemRequest.Items = arrayOfItems;
            try
            {
                // Send the request and get the response.
                CreateItemResponseType createItemResponse = esb.CreateItem(createItemRequest);
                // Get the response messages.
                ResponseMessageType[] rmta = createItemResponse.ResponseMessages.Items;
                foreach (ResponseMessageType rmt in rmta)
                {
                  ArrayOfRealItemsType itemArray = ((ItemInfoResponseMessageType)rmt).Items;
                  ItemType[] items = itemArray.Items;
  // Get the item identifier and change key for each item.
                  foreach (ItemType item in items)
                  {
                        Console.WriteLine("Item identifier: " + item.ItemId.Id);
                        Console.WriteLine("Item change key: " + item.ItemId.ChangeKey);
                  }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error Message: " + e.Message);
            }
      }
      //应答会议邀请:
  //应答会议邀请
      public static void AcceptItem(ExchangeServiceBinding esb, string meetingID)
      {
            // Create the request.
            CreateItemType request = new CreateItemType();
  // Set the message disposition on the request.
            request.MessageDisposition = MessageDispositionType.SendAndSaveCopy;
            request.MessageDispositionSpecified = true;
  // Create the AcceptItem response object.
            AcceptItemType acceptItem = new AcceptItemType();
  // Identify the meeting request to accept.
            acceptItem.ReferenceItemId = new ItemIdType();
            acceptItem.ReferenceItemId.Id = meetingID;
  // Add the AcceptItem response object to the request.
            request.Items = new NonEmptyArrayOfAllItemsType();
            request.Items.Items = new ItemType;
            request.Items.Items = acceptItem;
            // Send the request and get the response.
            CreateItemResponseType response = esb.CreateItem(request);
  ArrayOfResponseMessagesType aormt = response.ResponseMessages;
            ResponseMessageType[] rmta = aormt.Items;
            foreach (ResponseMessageType rmt in rmta)
            {
                ItemInfoResponseMessageType iirmt = (rmt as ItemInfoResponseMessageType);
                if (iirmt.ResponseClass == ResponseClassType.Success)
                {
                  Console.WriteLine("Successfully accepted meeting");
                }
            }
      }
  private ExchangeServiceBinding esb;
  public static ExchangeServiceBinding GetExchangeService(ExchangeSession session)
      {
            ExchangeServiceBinding esb = new ExchangeServiceBinding();
  //esb.Credentials = session.GetNetworkCredential();
            string ocsuser = System.Configuration.ConfigurationManager.AppSettings["OcsUser"];
            string password = System.Configuration.ConfigurationManager.AppSettings["password"];
            string domain = System.Configuration.ConfigurationManager.AppSettings["Domain"];
            string ExchangeServer = System.Configuration.ConfigurationManager.AppSettings["ExchangeServer"];
            esb.Credentials = session.GetNetCS(ocsuser, password, domain );
            esb.Url = ExchangeServer; //session.Url;
  ServicePointManager.ServerCertificateValidationCallback += CheckCert;
  ExchangeImpersonationType imp = new ExchangeImpersonationType();
            imp.ConnectingSID = new ConnectingSIDType { PrimarySmtpAddress = session.Impersonation };
            esb.ExchangeImpersonation = imp;
  FindItemType fit = new FindItemType();
            fit.ItemShape = new ItemResponseShapeType { BaseShape = DefaultShapeNamesType.Default };
            fit.ParentFolderIds = new DistinguishedFolderIdType[]
            {
                new DistinguishedFolderIdType{ Id = DistinguishedFolderIdNameType.calendar }
            };
  fit.Traversal = ItemQueryTraversalType.Shallow;
  FindItemResponseType firt = esb.FindItem(fit);
  fit.Traversal = ItemQueryTraversalType.Shallow;
  
  return esb;
      }
  protected static bool CheckCert(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
      {
            return true;
      }
  public void ExchangeOperation(string userMail)
      {
            //string unUserName = ConfigurationManager.AppSettings["UserName"];
            //string pnPassWord = ConfigurationManager.AppSettings["Password"];
            //string dnDomain = ConfigurationManager.AppSettings["Domain"];
            //string url = ConfigurationManager.AppSettings["Url"];
  //ExchangeImpersonationType Impersonation = new ExchangeImpersonationType();
            //Impersonation.ConnectingSID = new ConnectingSIDType();
  //esb = new ExchangeServiceBinding();
            //esb.Credentials = new System.Net.NetworkCredential(unUserName, pnPassWord, dnDomain);
            //esb.Url = url;
            //esb.ExchangeImpersonation = Impersonation;
  ExchangeSession m_Session = new ExchangeSession(userMail);
            try
            {
                esb = GetExchangeService(m_Session);
            }
            catch (Exception ex)
            {
                string strError = ex.Message;
            }
      }
      #endregion
  这样使用
  //给本人差日程 20110419解决自己发的会议邀请,自己的日历看不到日程的问题
            ExchangeOperation(organigerEmail);//发起者的邮箱
            CreateAppointment(esb, meeting.Subject, organigerEmail , roomAddress, startTime, endTime, content.Text.Trim() );
  webconfig配置:
  <!-- exchange配置-->
    <add key="ExchangeServer" value="https://10.0.8.13/EWS/Exchange.asmx"/>
    <add key="OcsUser" value="ocsuser"/>
    <add key="Domain" value="sinooceanland.com"/>
    <add key="password" value="password"/>
页: [1]
查看完整版本: 读取exchange邮件的未读数(转载)