26

Can anyone tell me how to get an email body, receipt, sender, CC info using Exchange Web Service API? I only know how to get subject.

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 />";
    }

My development environment is asp.net c# Exchange-server 2010 Thank you.

Daniel Hilgarth
  • 171,043
  • 40
  • 335
  • 443
Steven Zack
  • 4,984
  • 19
  • 57
  • 88

4 Answers4

42

Since the original question specifically asked for "email body, receipt, sender and CC info," I thought I would address those. I assume "receipt" is recipient info, and not the "notify sender" feature of email that no one uses. CC looks like it is handled the same way as recipients.

I liked Henning's answer to reduce the function to two calls, but had a little bit of difficulty figuring out how to handle a PropertySet. Google search was not immediately clear on this, and I ended up using someone else's 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();
}
VeeTheSecond
  • 3,086
  • 3
  • 20
  • 16
11

Using FindItems will only get you so far, because it does only return the first 255 bytes of a body. What you should do is a combination of FindItem to request the ids of the mails and issue one or more GetItem calls to get the properties you are interested in.

SliverNinja - MSFT
  • 31,051
  • 11
  • 110
  • 173
Henning Krause
  • 5,302
  • 3
  • 24
  • 37
  • 1
    More correctly, you need to `.Bind` to each item. e.g. `Appointment = a = Appointment.Bind(_service, appt.Id)` where `appt` was an item you got from `FindAppointments`. Sucks that `FindItem` can't return everything; means more round trips. – tig Nov 24 '11 at 06:44
  • 7
    But you can reduce it to ~2 calls. Use the service.BindToItems() to load multiple items at once... – Henning Krause Nov 24 '11 at 20:57
  • Excellent Henning! Thanks for the tip. – tig Nov 25 '11 at 22:19
3

Instead of using the ExtendedProperties, you could also cast to EmailMessage and read the property you want directly. For example the sender address:

((Microsoft.Exchange.WebServices.Data.EmailMessage)(item)).From.Address;
Johan
  • 931
  • 9
  • 23
2

here you will find the solution.

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

    }
JAiro
  • 5,914
  • 2
  • 22
  • 21