2011-05-13 32 views
9

Estoy tratando de utilizar el siguiente código para conectar y descargar un archivo adjunto del correo electrónico en una bandeja de entrada usando C# y Servicios web de Exchange pero obtengo un error 'System.ArgumentOutOfRangeException' y no puedo ver por qué. He buscado una respuesta en Google, pero no puedo encontrar una o las respuestas que encuentro son para versiones muy antiguas de EWS.Descargar archivo adjunto de Exchange utilizando servicios web de Exchange

Sé que el resto del código generalmente funciona ya que puedo acceder a otra información relacionada con el correo electrónico, simplemente no tengo acceso al archivo adjunto.

Cany alguien me muestra el error de mis formas?

Gracias de antemano,

James

static void Main(string[] args) 
    { 
     ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1); 
     service.Credentials = new NetworkCredential("MYLOGIN", "MYPASSWORD", "MYDOMAIN"); 

     service.Url = new Uri("https://MYMAILSERVER/EWS/Exchange.asmx"); 

     ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

     FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, new ItemView(1000)); 

     foreach (Item item in findResults.Items) 
     { 
      if (item.HasAttachments && item.Attachments[0] is FileAttachment) 
      { 
       FileAttachment fileAttachment = item.Attachments[0] as FileAttachment; 
       fileAttachment.Load("C:\\temp\\" + fileAttachment.Name); 
      } 

     } 
    } 
} 

Resuelto pero nuevo problema

He ordenado la cuestión ahora cambiando el 'foreach (artículo en findResults.Items)' para 'foreach (elemento de EmailMessage en findResults.Items)' pero ahora necesito saber cómo enumerar a través de los archivos adjuntos - ¿Alguna idea de alguien?

+0

¿Dónde se obtiene la excepción? ¿Qué argumento está fuera de rango? Esa información es normalmente parte de la excepción. –

+0

fue un error de falta de índice. He resuelto el problema ahora cambiando el 'foreach (Elemento item en findResults.Items)' a 'foreach (Elemento EmailMessage en findResults.Items)' –

+0

La parte "InnerException" de la Excepción puede valer la pena para obtener ese tipo de información de información también –

Respuesta

1

A menos que me falta algo obvio, todo lo que necesita hacer es enumerable a través de item.Attachments.

Haz clic en here y desplázate hacia abajo hasta donde veas el encabezado Example.

5

Revisa tu perfil. Si está ejecutando en modo de luz, los archivos adjuntos no se están descargando con un mensaje.

complemento siguiente línea

item.Load() // loads the entire message with attachment 
+1

Gracias. Este fue mi problema. –

2

La respuesta a su nuevo problema es

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1); 

    //service.Credentials = new NetworkCredential("{Active Directory ID}", "{Password}", "{Domain Name}"); 

    service.AutodiscoverUrl("[email protected]"); 

     FindItemsResults<Item> findResults = service.FindItems(
      WellKnownFolderName.Inbox, 
      new ItemView(10)); 

     foreach (Item item in findResults.Items) 
     { 
      Console.WriteLine(item.Subject); 
      item.Load(); 
      if(item.HasAttachments) 
      { 
       foreach (var i in item.Attachments) 
       { 
        FileAttachment fileAttachment = i as FileAttachment; 
        fileAttachment.Load(); 
        Console.WriteLine("FileName: " + fileAttachment.Name); 

       } 
      } 

     } 
1

Solución para la descarga de todos los archivos adjuntos de los correos electrónicos cantidad especificada de:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013); 
    service.Credentials = new NetworkCredential("login", "password"); 

    service.Url = new Uri("https://mail.Yourservername.com/EWS/Exchange.asmx"); 

    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

    FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, new ItemView(10)); 

    if (findResults != null && findResults.Items != null && findResults.Items.Count > 0) 
     foreach (EmailMessage item in findResults) 
     { 
     EmailMessage message = EmailMessage.Bind(service, item.Id, new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments, ItemSchema.HasAttachments)); 
      foreach (Attachment attachment in message.Attachment 
      { 
       if (attachment is FileAttachment) 
        { 
        FileAttachment fileAttachment = attachment as FileAttachment;  
        fileAttachment.Load(@"Folder\file.name"); 
        } 
      } 
     } 

No se olvide pasar la versión correcta de Exchange Server al constructor de ExchangeService.

0

Este es un método GetAttachmentsFromEmail que puede usar para descargar archivos adjuntos.

public static void GetAttachmentsFromEmail(ExchangeService service, ItemId itemId) 
    { 
     // Bind to an existing message item and retrieve the attachments collection. 
     // This method results in an GetItem call to EWS. 
     EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(ItemSchema.Attachments)); 

     // Iterate through the attachments collection and load each attachment. 
     foreach (Attachment attachment in message.Attachments) 
     { 
      if (attachment is FileAttachment) 
      { 
       FileAttachment fileAttachment = attachment as FileAttachment; 

       // Load the attachment into a file. 
       // This call results in a GetAttachment call to EWS. 
       fileAttachment.Load("C:\\temp\\" + fileAttachment.Name); 

       Console.WriteLine("File attachment name: " + fileAttachment.Name); 
      } 
      else // Attachment is an item attachment. 
      { 
       ItemAttachment itemAttachment = attachment as ItemAttachment; 

       // Load attachment into memory and write out the subject. 
       // This does not save the file like it does with a file attachment. 
       // This call results in a GetAttachment call to EWS. 
       itemAttachment.Load(); 

       Console.WriteLine("Item attachment name: " + itemAttachment.Name); 
      } 
     } 
    } 
Cuestiones relacionadas