2011-07-12 17 views
23

¿Alguien puede decirme cómo obtener un cuerpo de correo electrónico, recibo, remitente, información CC utilizando la API del servicio web de Exchange? Solo sé cómo obtener el tema.¿Cómo obtener el cuerpo del correo electrónico, el recibo, el remitente y la información de CC con EWS?

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010); 
    service.Credentials = new NetworkCredential("user", "password", "domain"); 
    service.Url = new Uri("https://208.243.49.20/ews/exchange.asmx"); 
    ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; 
    FindItemsResults<Item> findResults = service.FindItems(
     WellKnownFolderName.Inbox, 
     new ItemView(10)); 

    foreach (Item item in findResults.Items) 
    { 
     div_email.InnerHtml += item.Subject+"<br />"; 
    } 

Mi entorno de desarrollo es asp.net C# Exchange Server 2010 Gracias.

Respuesta

10

Usando FindItems sólo va a llegar tan lejos, ya que solamente devuelve los primeros 255 bytes de un cuerpo. Lo que debe hacer es una combinación de FindItem para solicitar las identificaciones de los correos y emitir una o más llamadas GetItem para obtener las propiedades que le interesan.

+1

Más correctamente, necesita '.Bind' para cada elemento. p.ej. 'Appointment = a = Appointment.Bind (_service, appt.Id)' donde 'appt' era un elemento que recibiste de' FindAppointments'. Apesta que 'FindItem' no puede devolver todo; significa más viajes redondos. – tig

+6

Pero puede reducirlo a ~ 2 llamadas. Utilice el service.BindToItems() para cargar varios elementos a la vez ... –

+0

¡Excelente Henning! Gracias por el consejo. – tig

2

aquí encontrará la solución.

http://blogs.msdn.com/b/akashb/archive/2010/03/05/how-to-build-a-complex-search-using-searchfilter-and-searchfiltercollection-in-ews-managed-api-1-0.aspx


// Send the request to search the Inbox and get the results. 
     FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, FinalsearchFilter, view); 



     // Process each item. 
     if (findResults.Items.Count > 0) 
     { 
      foreach (Item myItem in findResults.Items) 
      { 
       if (myItem is EmailMessage) 
       { 
        Console.WriteLine((myItem as EmailMessage).Subject); 
       } 
       if (myItem.ExtendedProperties.Count > 0) 
       { 
        // Display the extended property's name and property. 
        foreach (ExtendedProperty extendedProperty in myItem.ExtendedProperties) 
        { 
         Console.WriteLine(" Extended Property Name: " + extendedProperty.PropertyDefinition.Name); 
         Console.WriteLine(" Extended Property Value: " + extendedProperty.Value); 
        } 
       } 

      } 
     } 
     else 
     { 
      Console.WriteLine("No Items Found!"); 
     } 

    } 
31

Dado que la pregunta original pedía específicamente "cuerpo del correo electrónico, recibo, remitente" y CC información: "Pensé que me gustaría abordar esos. Supongo que "recibo" es información del destinatario, y no la función "notificar remitente" del correo electrónico que nadie usa. CC parece que se maneja de la misma manera que los destinatarios.

Me gustó la respuesta de Henning para reducir la función a dos llamadas, pero tuve un poco de dificultad para averiguar cómo manejar un PropertySet. La búsqueda de Google no estaba claro en esto, y que terminó usando otra persona tutorial:

// Simplified mail item 
public class MailItem 
{ 
    public string From; 
    public string[] Recipients; 
    public string Subject; 
    public string Body; 
} 

public MailItem[] GetUnreadMailFromInbox() 
{ 
    FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, new ItemView(128)); 
    ServiceResponseCollection<GetItemResponse> items = 
     service.BindToItems(findResults.Select(item => item.Id), new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.From, EmailMessageSchema.ToRecipients)); 
    return items.Select(item => { 
     return new MailItem() { 
      From = ((Microsoft.Exchange.WebServices.Data.EmailAddress)item.Item[EmailMessageSchema.From]).Address, 
      Recipients = ((Microsoft.Exchange.WebServices.Data.EmailAddressCollection)item.Item[EmailMessageSchema.ToRecipients]).Select(recipient => recipient.Address).ToArray(), 
      Subject = item.Item.Subject, 
      Body = item.Item.Body.ToString(), 
     }; 
    }).ToArray(); 
} 
2

En lugar de utilizar los ExtendedProperties, también se puede echar a EmailMessage y leer la propiedad que desea directamente. Por ejemplo, la dirección del remitente:

((Microsoft.Exchange.WebServices.Data.EmailMessage)(item)).From.Address; 
+0

¿Hay algún beneficio al usar esto en lugar de artículo? ? En el caso de correo electrónico del remitente claramente, pero ¿qué pasa con el cuerpo, por ejemplo? –

Cuestiones relacionadas