using System;
using System.Net;
using System.Collections.Generic;
using EWS;
using MailClient;
namespace ExchangeWs {
public class ExchangeWs {
private ExchangeServiceBinding esb = null;
private GetExchangeSetting ExchangeSetting = new GetExchangeSetting();
public ExchangeWs(string userAccount, string password, string domain, string url) {
esb = new ExchangeServiceBinding();
esb.Credentials = new NetworkCredential(userAccount, password, domain);
if (esb.RequestServerVersionValue == null) {
esb.RequestServerVersionValue = new RequestServerVersion();
esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007_SP1;
}
esb.Url = url;
}
#region GetOWAId
public string GetOWAId(string EWSId, string mailAddress) {
// Create the request.
ConvertIdType request = new ConvertIdType();
request.SourceIds = new AlternateIdType[1];
request.SourceIds[0] = new AlternateIdType();
// Convert from the Exchange Web Services identifier to an Outlook Web Access identifier.
request.SourceIds[0].Format = IdFormatType.EwsId;
(request.SourceIds[0] as AlternateIdType).Id = EWSId;
(request.SourceIds[0] as AlternateIdType).Mailbox = mailAddress;// "TestUser1@cqyz.cn";
request.DestinationFormat = IdFormatType.OwaId;
string result = null;
try {
// Send the ConvertIdType request and get the response.
ConvertIdResponseType response = esb.ConvertId(request);
ArrayOfResponseMessagesType aormt = response.ResponseMessages;
ResponseMessageType[] rmta = aormt.Items;
// Check each response message.
if (rmta != null && rmta.Length > 0) {
ConvertIdResponseMessageType resp = (ConvertIdResponseMessageType)rmta[0];
if (resp != null) {
if (resp.ResponseClass == ResponseClassType.Success) {
ConvertIdResponseMessageType cirmt = (resp as ConvertIdResponseMessageType);
AlternateIdType myId = (cirmt.AlternateId as AlternateIdType);
string format = myId.Format.ToString();
string identifier = myId.Id;
string mailbox = myId.Mailbox;
result = identifier;
}
}
}
} catch {
}
return result;
}
#endregion
#region Restriction
private RestrictionType GetCalendarRestrictionByTime(DateTime? start, DateTime? end) {
if (start == null || end == null)
return null;
RestrictionType restriction = new RestrictionType();
AndType and = new AndType();
SearchExpressionType[] searchExpressions = new SearchExpressionType[2];
///////////////////////////////////////////////////////////////////////////
//设定IsGreaterThanOrEqualTo
///////////////////////////////////////////////////////////////////////////
IsGreaterThanOrEqualToType isGTOET = new IsGreaterThanOrEqualToType();
//define FieldURIOrConstant
FieldURIOrConstantType fieldURIOrConstantType = new FieldURIOrConstantType();
ConstantValueType constant = new ConstantValueType();
constant.Value = start.ToString();
fieldURIOrConstantType.Item = constant;
//define FieldURI
PathToUnindexedFieldType pathToUnindexedFieldType = new PathToUnindexedFieldType();
pathToUnindexedFieldType.FieldURI = UnindexedFieldURIType.calendarStart;
isGTOET.Item = pathToUnindexedFieldType;
isGTOET.FieldURIOrConstant = fieldURIOrConstantType;
searchExpressions[0] = isGTOET;
///////////////////////////////////////////////////////////////////////////
//设定IsLessThanOrEqualTo
///////////////////////////////////////////////////////////////////////////
IsLessThanOrEqualToType isLTOET = new IsLessThanOrEqualToType();
//define FieldURIOrConstant
FieldURIOrConstantType _fieldURIOrConstantType = new FieldURIOrConstantType();
ConstantValueType _constant = new ConstantValueType();
_constant.Value = end.ToString();
_fieldURIOrConstantType.Item = _constant;
//define FieldURI
PathToUnindexedFieldType _pathToUnindexedFieldType = new PathToUnindexedFieldType();
_pathToUnindexedFieldType.FieldURI = UnindexedFieldURIType.calendarEnd;
isLTOET.Item = _pathToUnindexedFieldType;
isLTOET.FieldURIOrConstant = _fieldURIOrConstantType;
searchExpressions[1] = isLTOET;
and.Items = searchExpressions;
restriction.Item = and;
return restriction;
}
private RestrictionType GetMailRestrictionByUnRead() {
RestrictionType restriction = new RestrictionType();
IsEqualToType isEqual = new IsEqualToType();
FieldURIOrConstantType _fieldURIOrConstantType = new FieldURIOrConstantType();
ConstantValueType _constant = new ConstantValueType();
_constant.Value = "0";
_fieldURIOrConstantType.Item = _constant;
PathToUnindexedFieldType _pathToUnindexedFieldType = new PathToUnindexedFieldType();
_pathToUnindexedFieldType.FieldURI = UnindexedFieldURIType.messageIsRead;
isEqual.FieldURIOrConstant = _fieldURIOrConstantType;
isEqual.Item = _pathToUnindexedFieldType;
restriction.Item = isEqual;
return restriction;
}
#endregion
#region GetCalendar
public List<CalendarItemType> GetCalendar(DateTime? start, DateTime? end) {
FindItemType findItemRequest = new FindItemType();
findItemRequest.Traversal = ItemQueryTraversalType.Shallow;
ItemResponseShapeType itemProperties = new ItemResponseShapeType();
itemProperties.BaseShape = DefaultShapeNamesType.AllProperties;
findItemRequest.ItemShape = itemProperties;
//查询条件
RestrictionType restriction = GetCalendarRestrictionByTime(start, end);
if (restriction != null)
findItemRequest.Restriction = restriction;
DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1];
folderIDArray[0] = new DistinguishedFolderIdType();
folderIDArray[0].Id = DistinguishedFolderIdNameType.calendar;
findItemRequest.ParentFolderIds = folderIDArray;
try {
FindItemResponseType findItemResponse = esb.FindItem(findItemRequest);
ResponseMessageType[] rmta = findItemResponse.ResponseMessages.Items;
return getCalendar(ref rmta);
} catch (Exception e) {
throw (e);
}
}
private List<CalendarItemType> getCalendar(ref ResponseMessageType[] rmta) {
List<CalendarItemType> calendars = new List<CalendarItemType>(30);
if (rmta != null) {
foreach (ResponseMessageType rmt in rmta) {
if (rmt is FindItemResponseMessageType) {
FindItemResponseMessageType findItemResponse = (FindItemResponseMessageType)rmt;
if (findItemResponse.ResponseClass == ResponseClassType.Success) {
if (findItemResponse.RootFolder.Item is ArrayOfRealItemsType) {
ArrayOfRealItemsType obj = (ArrayOfRealItemsType)findItemResponse.RootFolder.Item;
if (obj != null && obj.Items != null) {
foreach (ItemType item in obj.Items) {
if (item is CalendarItemType) {
CalendarItemType calendarItem = (CalendarItemType)item;
if (calendarItem != null) {
calendars.Add(calendarItem);
}
}
}
}
}
}
}
}
}
return calendars;
}
#endregion
#region GetNewMail
public List<MessageType> GetNewMail() {
FindItemType findItemRequest = new FindItemType();
findItemRequest.Traversal = ItemQueryTraversalType.Shallow;
ItemResponseShapeType itemProperties = new ItemResponseShapeType();
itemProperties.BaseShape = DefaultShapeNamesType.AllProperties;
findItemRequest.ItemShape = itemProperties;
DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1];
folderIDArray[0] = new DistinguishedFolderIdType();
folderIDArray[0].Id = DistinguishedFolderIdNameType.inbox;
findItemRequest.ParentFolderIds = folderIDArray;
//查询条件
RestrictionType restriction = GetMailRestrictionByUnRead();
if (restriction != null)
findItemRequest.Restriction = restriction;
try {
FindItemResponseType findItemResponse = esb.FindItem(findItemRequest);
ResponseMessageType[] rmta = findItemResponse.ResponseMessages.Items;
return getMail(ref rmta);
} catch (Exception e) {
throw (e);
}
}
private List<MessageType> getMail(ref ResponseMessageType[] rmta) {
List<MessageType> newMails = new List<MessageType>(30);
if (rmta != null) {
foreach (ResponseMessageType rmt in rmta) {
if (rmt is FindItemResponseMessageType) {
FindItemResponseMessageType findItemResponse = (FindItemResponseMessageType)rmt;
if (findItemResponse.ResponseClass == ResponseClassType.Success) {
if (findItemResponse.RootFolder.Item is ArrayOfRealItemsType) {
ArrayOfRealItemsType obj = (ArrayOfRealItemsType)findItemResponse.RootFolder.Item;
if (obj != null && obj.Items != null) {
foreach (ItemType item in obj.Items) {
if (item is MessageType) {
MessageType message = (MessageType)item;
if (message != null) {
newMails.Add(message);
}
}
}
}
}
}
}
}
}
return newMails;
}
#endregion
#region MailQuota
public MailQuota GetUsedMailboxSize() {
GetFolderType request = new GetFolderType();
PathToExtendedFieldType folderSizePath = new PathToExtendedFieldType();
folderSizePath.PropertyTag = "0x0e08";
folderSizePath.PropertyType = MapiPropertyTypeType.Integer;
FolderResponseShapeType folderResponseShapeType = new FolderResponseShapeType();
folderResponseShapeType.BaseShape = DefaultShapeNamesType.AllProperties;
folderResponseShapeType.AdditionalProperties = new BasePathToElementType[] { folderSizePath };
DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[13];
folderIDArray[0] = new DistinguishedFolderIdType();
folderIDArray[0].Id = DistinguishedFolderIdNameType.sentitems;
folderIDArray[1] = new DistinguishedFolderIdType();
folderIDArray[1].Id = DistinguishedFolderIdNameType.drafts;
folderIDArray[2] = new DistinguishedFolderIdType();
folderIDArray[2].Id = DistinguishedFolderIdNameType.voicemail;
folderIDArray[3] = new DistinguishedFolderIdType();
folderIDArray[3].Id = DistinguishedFolderIdNameType.calendar;
folderIDArray[4] = new DistinguishedFolderIdType();
folderIDArray[4].Id = DistinguishedFolderIdNameType.contacts;
folderIDArray[5] = new DistinguishedFolderIdType();
folderIDArray[5].Id = DistinguishedFolderIdNameType.tasks;
folderIDArray[6] = new DistinguishedFolderIdType();
folderIDArray[6].Id = DistinguishedFolderIdNameType.deleteditems;
folderIDArray[7] = new DistinguishedFolderIdType();
folderIDArray[7].Id = DistinguishedFolderIdNameType.inbox;
folderIDArray[8] = new DistinguishedFolderIdType();
folderIDArray[8].Id = DistinguishedFolderIdNameType.journal;
folderIDArray[9] = new DistinguishedFolderIdType();
folderIDArray[9].Id = DistinguishedFolderIdNameType.junkemail;
folderIDArray[10] = new DistinguishedFolderIdType();
folderIDArray[10].Id = DistinguishedFolderIdNameType.searchfolders;
folderIDArray[11] = new DistinguishedFolderIdType();
folderIDArray[11].Id = DistinguishedFolderIdNameType.notes;
folderIDArray[12] = new DistinguishedFolderIdType();
folderIDArray[12].Id = DistinguishedFolderIdNameType.outbox;
request.FolderIds = folderIDArray;
request.FolderShape = folderResponseShapeType;
GetFolderResponseType response = esb.GetFolder(request);
return parseQuota(response);
}
private MailQuota parseQuota(GetFolderResponseType response) {
MailQuota quota = null;
if (response == null)
return quota;
ArrayOfResponseMessagesType arrayOfResponseMessagesType = response.ResponseMessages;
if (arrayOfResponseMessagesType == null)
return quota;
ResponseMessageType[] responseMessageType = arrayOfResponseMessagesType.Items;
if (responseMessageType == null || responseMessageType.Length == 0)
return quota;
quota = new MailQuota();
for (int i = 0; i < responseMessageType.Length; i++) {
FolderInfoResponseMessageType folderInfoResponseMessage = responseMessageType[i] as FolderInfoResponseMessageType;
if (folderInfoResponseMessage == null)
continue;
BaseFolderType[] folders = folderInfoResponseMessage.Folders;
if (folders == null || folders.Length == 0)
continue;
BaseFolderType folder = null;
if (folders[0] is CalendarFolderType)
folder = folders[0] as CalendarFolderType;
else if (folders[0] is ContactsFolderType)
folder = folders[0] as ContactsFolderType;
else
folder = folders[0] as FolderType;
if (folder == null)
continue;
ExtendedPropertyType[] extendedPropertys = folder.ExtendedProperty;
if (extendedPropertys == null)
continue;
if (extendedPropertys.Length == 0)
continue;
ExtendedPropertyType extendedProperty = extendedPropertys[0];
if (extendedProperty == null)
continue;
int temp = 0;
int.TryParse(extendedProperty.Item.ToString(), out temp);
quota.UsedQuota += temp;
quota.MailCount += folder.TotalCount;
if (folder is FolderType)
quota.UnReadMailCount += ((EWS.FolderType)(folder)).UnreadCount;
}
return quota;
}
#endregion
#region SendMail
public bool SendMail(Mail m) {
EWS.CreateItemType createItem = new EWS.CreateItemType();
createItem.MessageDispositionSpecified = true;
createItem.MessageDisposition = EWS.MessageDispositionType.SendOnly;
EWS.MessageType message = new EWS.MessageType();
message.ItemClass = "IPM.Note";
message.Subject = m.Subject;
BodyType body = new BodyType();
body.BodyType1 = BodyTypeType.Text;
body.Value = m.Content;
message.Body = body;
message.IsRead = false;
message.ToRecipients = splitAddress(m.Address.To);
message.CcRecipients = splitAddress(m.Address.Cc);
message.BccRecipients = splitAddress(m.Address.Bcc);
createItem.Items = new NonEmptyArrayOfAllItemsType();
createItem.Items.Items = new EWS.ItemType[] { message };
CreateItemResponseType response = esb.CreateItem(createItem);
return response.ResponseMessages.Items[0].ResponseCode == ResponseCodeType.NoError;
}
private EWS.EmailAddressType[] splitAddress(string addr) {
if (String.IsNullOrEmpty(addr))
return null;
string[] arr = addr.Split(",;".ToCharArray());
List<EWS.EmailAddressType> list = new List<EmailAddressType>(arr.Length);
foreach (string str in arr) {
if (!String.IsNullOrEmpty(str)) {
EmailAddressType address = new EmailAddressType();
address.EmailAddress = str;
list.Add(address);
}
}
return list.ToArray();
}
#endregion
}
}