2010-06-14 18 views
7

Estoy escribiendo una aplicación de consola simple que supervisa un buzón de intercambio en particular y cuando se reciben correos electrónicos que cumplen determinados criterios, la aplicación descarga un archivo adjunto XML y archivar el correo electrónico.Servicios web de Exchange - Procesamiento de mensajes y acceso a archivos adjuntos

Me he conectado a EWS OK, y he podido leer todos los correos electrónicos, pero estoy luchando cuando se trata de crear un objeto EmailMessage que pueda usar para acceder a los archivos adjuntos.

En el código de ejemplo siguiente, la línea EmailMessage message = EmailMessage.Bind(...) se ejecuta sin error, pero no devuelve un mensaje válido por lo que cuando accedo y propiedades o métodos, aparece un error: 'Referencia de objeto no establecida en una instancia de un objeto '.

Soy nuevo en C# y mucho menos EWS por lo que estoy luchando para saber por dónde empezar ...

Fragmento de código:

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); 
     } 
    } 

Mi código para acceder a los archivos adjuntos es directamente desde MSDN así que espero que esté allí ... ¿Alguna idea?

+1

No creo que pueda imprimir la línea Asunto ya que su conjunto de propiedades no incluye el tema. ¿Qué devuelve de Exchange con ese código? ¿El objeto emailmessage es válido? El siguiente podría ayudar a: http: //social.technet.microsoft.com/Forums/en/exchangesvrdevelopment/thread/1d7d0be3-1e48-43c4-b2df-f6fa5c7bf254 que no es necesario colocar a través de la opción de unirse - prueba LoadPropertiesForItems y mira si funciona – Chris

Respuesta

12

Me temo que volví a visitar este problema y logré curarlo. Desafortunadamente, estaba demasiado presionada en ese momento para volver aquí y documentar la solución. Tiempo que ha pasado, y mi memoria de lo que he cambiado ha desvanecido, pero por lo que puedo recordar que era un cambio de una sola línea:

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

La diferencia clave aquí es que hemos especificado BasePropertySet.FirstClassProperties como el primer parámetro de PropertySet, en lugar de BasePropertySet.IdOnly que originalmente teníamos.

Mi código original fue levantado de un ejemplo en línea que hizo exactamente lo que estaba tratando de lograr, entonces o el ejemplo no fue del todo correcto, o lo transcribí incorrectamente o malentendí algunas facetas del problema.

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); 
    } 
} 
Cuestiones relacionadas