2010-06-14 7 views
7

Jestem w trakcie pisania prostej aplikacji konsolowej, która monitoruje konkretną skrzynkę pocztową wymiany, a po otrzymaniu wiadomości e-mail spełniających określone kryteria aplikacja pobiera plik XML i zarchiwizuj email.Exchange Web Services - Przetwarzanie wiadomości i uzyskiwanie dostępu do załączników

Połączyłem się z EWS OK, i byłem w stanie przechodzić przez wszystkie wiadomości e-mail, ale walczę, jeśli chodzi o stworzenie obiektu EmailMessage, którego mogę użyć, aby uzyskać dostęp do załączników.

W poniższym przykładowym kodzie linia EmailMessage message = EmailMessage.Bind(...) jest wykonywana bez błędu, ale nie zwraca poprawnego komunikatu, więc gdy uzyskuję dostęp i właściwości lub metody, pojawia się błąd: "Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu ".

Jestem nowym C# mówiąc EWS więc jestem stara się wiedzieć, gdzie zacząć ...

Code Snippet:

public static void FindItems() 
    { 
     try 
     { 
      ItemView view = new ItemView(10); 
      view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Ascending); 
      view.PropertySet = new PropertySet(
       BasePropertySet.IdOnly, 
       ItemSchema.Subject, 
       ItemSchema.DateTimeReceived); 

      findResults = service.FindItems(
       WellKnownFolderName.Inbox, 
       new SearchFilter.SearchFilterCollection(
        LogicalOperator.Or, 
        new SearchFilter.ContainsSubstring(ItemSchema.Subject, "Sales Enquiry")), 
       view); 

      log2.LogInfo("Total number of items found: " + findResults.TotalCount.ToString()); 

      foreach (Item item in findResults) 
      { 
       log2.LogInfo(item.Id); 

       EmailMessage message = EmailMessage.Bind(service, item.Id, new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments)); 

       Console.WriteLine(message.Subject.ToString()); 

       if (message.HasAttachments && message.Attachments[0] is FileAttachment) 
       { 
        FileAttachment fileAttachment = message.Attachments[0] as FileAttachment; 
        fileAttachment.Load("C:\\temp\\" + fileAttachment.Name); 
        fileAttachment.Load(); 
        Console.WriteLine("FileName: " + fileAttachment.FileName); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      log2.LogError(ex.InnerException); 
     } 
    } 

Mój kod dostępu do załączników jest prosto z MSDN więc mam nadzieję, że są w pobliżu ... Jakieś pomysły?

+1

Nie sądzę, że będziesz w stanie wydrukować wiersz tematu, ponieważ zestaw nieruchomości nie zawiera tematu. Czego zwracasz z Exchange tym kodem? Czy obiekt wiadomości e-mail jest prawidłowy? Następujące może pomóc: http: //social.technet.microsoft.com/Forums/en/exchangesvrdevelopment/thread/1d7d0be3-1e48-43c4-b2df-f6fa5c7bf254 Nie trzeba pętli elementu do wiązania - wypróbuj LoadPropertiesForItems i sprawdź, czy to działa – Chris

Odpowiedz

12

Obawiam się, że ponownie przeanalizowałem ten problem i udało mi się go wyleczyć. Niestety, byłem wtedy zbyt naciskany, aby tu wrócić i udokumentować rozwiązanie. Czas po przejściu, a moja pamięć tego, co zmieniło się wyblakłe, ale o ile pamiętam była to zmiana o jedną linię:

EmailMessage message = EmailMessage.Bind(service, item.Id, new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.Attachments)); 

Kluczową różnicą jest to, że mamy określony BasePropertySet.FirstClassProperties jako pierwszy parametr PropertySet, a nie BasePropertySet.IdOnly, który pierwotnie mieliśmy.

Mój oryginalny kod został usunięty z przykładu online, który zrobił dokładnie to, co próbowałem osiągnąć, więc albo przykład nie był całkiem odpowiedni, albo przepisałem go niepoprawnie lub źle zrozumiałem jakąś część problemu.

0
foreach(EmailMessage message in findResults) 
{ 
    message.Load(); 

    Console.WriteLine(message.Subject.ToString()); 

    if (message.HasAttachments && message.Attachments[0] is FileAttachment) 
    { 
     FileAttachment fileAttachment = message.Attachments[0] as FileAttachment; 
     fileAttachment.Load("C:\\temp\\" + fileAttachment.Name); 
     fileAttachment.Load(); 
     Console.WriteLine("FileName: " + fileAttachment.FileName); 
    } 
} 
Powiązane problemy