Найти все непрочитанные письма с помощью веб-службы Exchange 2010, а затем пометить как прочитанные?
Я использую Exchang Web Services 2010, чтобы попытаться прочитать все непрочитанные письма из почтового ящика, а затем пометить их как прочитанные.
я основываюсь на этом примере:
http://msdn.microsoft.com/en-us/library/exchange/aa563373(v=exchg.140).aspx
и придумали это, чтобы найти все непрочитанные письма и прочитать содержимое тела:
//Set up the connection to exchange service
ExchangeServiceBinding exchangeService = new ExchangeServiceBinding();
exchangeService.Credentials = new NetworkCredential("userid", "password", "domain");
exchangeService.Url = "https://exchangeserver/ews/exchange.asmx";
//REturn all properties
FindItemType findType = new FindItemType();
findType.Traversal = ItemQueryTraversalType.Shallow;
findType.ItemShape = new ItemResponseShapeType();
findType.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties;
//Only search the inbox
DistinguishedFolderIdType[] foldersToSearch = new DistinguishedFolderIdType[1];
foldersToSearch[0] = new DistinguishedFolderIdType();
foldersToSearch[0].Id = DistinguishedFolderIdNameType.inbox;
findType.ParentFolderIds = foldersToSearch;
//Only unread emails
RestrictionType restriction = new RestrictionType();
IsEqualToType isEqualTo = new IsEqualToType();
PathToUnindexedFieldType pathToFieldType = new PathToUnindexedFieldType();
pathToFieldType.FieldURI = UnindexedFieldURIType.messageIsRead;
//Not IsRead
FieldURIOrConstantType constantType = new FieldURIOrConstantType();
ConstantValueType constantValueType = new ConstantValueType();
constantValueType.Value = "0";
constantType.Item = constantValueType;
isEqualTo.Item = pathToFieldType;
isEqualTo.FieldURIOrConstant = constantType;
restriction.Item = isEqualTo;
//set the not IsRead restriction
findType.Restriction = restriction;
try
{
FindItemResponseType findResponse = exchangeService.FindItem(findType);
ResponseMessageType[] responseMessType = findResponse.ResponseMessages.Items;
List<ItemIdType> unreadItemIds = new List<ItemIdType>();
//get all unread item IDs
foreach (ResponseMessageType respMessage in responseMessType)
{
if(respMessage is FindItemResponseMessageType)
{
FindItemResponseMessageType itemResponse = (FindItemResponseMessageType)respMessage;
if (itemResponse.ResponseClass == ResponseClassType.Success)
{
if (itemResponse.RootFolder.Item != null)
{
if (itemResponse.RootFolder.Item is ArrayOfRealItemsType)
{
ArrayOfRealItemsType items = (ArrayOfRealItemsType)itemResponse.RootFolder.Item;
if (items.Items != null)
{
ItemType[] itemTypes = items.Items;
foreach (ItemType item in itemTypes)
{
if (item is MessageType)
{
unreadItemIds.Add(item.ItemId);
}
}
}
}
}
}
}
}
if (unreadItemIds.Count == 0)
MessageBox.Show("No unread emails found");
else
{
//Get all unread mail messages, display body
GetItemType getItemType = new GetItemType();
getItemType.ItemShape = new ItemResponseShapeType();
getItemType.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties;
getItemType.ItemShape.BodyType = BodyTypeResponseType.Text;
getItemType.ItemShape.BodyTypeSpecified = true;
getItemType.ItemIds = unreadItemIds.ToArray();
GetItemResponseType getItemResponse = exchangeService.GetItem(getItemType);
if(getItemResponse.ResponseMessages != null)
{
ArrayOfResponseMessagesType responseMessages = getItemResponse.ResponseMessages;
foreach(ResponseMessageType responseMessage in responseMessages.Items)
{
if (responseMessage is ItemInfoResponseMessageType)
{
ItemInfoResponseMessageType responseItemInfo = (ItemInfoResponseMessageType)responseMessage;
if (responseItemInfo.Items != null)
{
ArrayOfRealItemsType responseRealItems = (ArrayOfRealItemsType)responseItemInfo.Items;
if (responseRealItems.Items != null)
{
foreach (ItemType responseItemType in responseRealItems.Items)
{
if (responseItemType is MessageType)
{
MessageType fullMessage = (MessageType)responseItemType;
BodyType body = fullMessage.Body;
if (body != null)
{
MessageBox.Show(body.Value);
}
}
}
}
}
}
}
}
}
}
catch(Exception ee)
{
MessageBox.Show(ee.Message +" " + (ee.InnerException ?? new Exception("")).Message);
}
это возвращает текстовую версию всех непрочитанных тел электронной почты, однако должно быть больше эффективный способ, нет?
кто-нибудь знает как я могу изменить адрес электронной почты MessageType
s Как читать и отправить обратно на сервер?
3 ответов
нет хорошего способа отметить MessageType
Как читать с помощью EWS v1. См.это сообщение в блоге MSDN для обходного пути, если вы застряли с EWS v1.
веб-служб Exchange V2 и представила свойство IsRead как записать (message.IsRead = true; message.Update();
), что делает его тривиальным. Вы можете использовать управляемый API EWS v2 для Exchange 2007 и выше, но это отдельная установка. Вижу страница MSDN на управляемом API 2.0 EWS дополнительные.
Я приношу еще один элемент ответа, чтобы помочь тем , кто попал в ту же ловушку, что и я, и для тех, кто использует EWS 2.0 :
я использовал тип элемента в моем цикле, чтобы получить почту в почтовом ящике. И объект Item не имеет свойства IsRead (но похож на объект EmailMessage). Таким образом, вы можете просто заменить тип элемента типом EmailMessage в своем цикле (потому что приведение разрешено от элемента к типу EmailMessage) :
foreach (EmailMessage message in findResults.Items)
{
if(message.IsRead==false) //if the current message is unread
{
//treatment
}
else
{
}
}
вот как я его получил работать.
For Each appointment As EmailMessage In service.FindItems(WellKnownFolderName.Inbox, New SearchFilter.SearchFilterCollection(LogicalOperator.And, New SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, False)), New ItemView(999))
' set as read
appointment.IsRead = True
appointment.Update(ConflictResolutionMode.AlwaysOverwrite)
Next