16

How can I connect to an exchange server and read mail from a shared mailbox (one that is not my own "myname@mycompany.com").

Here is my code thus far:

//Create a service
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
        //Autodiscover end point
        service.AutodiscoverUrl("someaddress@mycompany.com");


        FindFoldersResults folderSearchResults = service.FindFolders(WellKnownFolderName.Inbox, new FolderView(int.MaxValue));

        Microsoft.Exchange.WebServices.Data.Folder exchangeMailbox = folderSearchResults.Folders.ToList().Find(
            f => f.DisplayName.Equals("NameOfSharedMailboxIwant", StringComparison.CurrentCultureIgnoreCase));

        //Set the number of items we can deal with at anyone time.
        ItemView itemView = new ItemView(int.MaxValue);

        foreach (Microsoft.Exchange.WebServices.Data.Folder folderFromSearchResults in folderSearchResults.Folders)
        {
            if (folderFromSearchResults.DisplayName.Equals("NameOfSharedMailboxIWant", StringComparison.OrdinalIgnoreCase))
            {
                Microsoft.Exchange.WebServices.Data.Folder boundFolder = 
                        Microsoft.Exchange.WebServices.Data.Folder.Bind(service, folderFromSearchResults.Id);

                SearchFilter unreadSearchFilter =
                    new SearchFilter.SearchFilterCollection(
                        LogicalOperator.And, new SearchFilter.IsEqualTo(
                            EmailMessageSchema.IsRead, false));

                //Find the unread messages in the email folder.
                FindItemsResults<Item> unreadMessages = boundFolder.FindItems(unreadSearchFilter, itemView);

                foreach (EmailMessage message in unreadMessages)
                {
                    message.Load();

                   Console.WriteLine(message.Subject);


               }    
                }

When I run this, I get an exception thrown that says that that "The SMTP address has no mailbox associated with it " during:

 Microsoft.Exchange.WebServices.Data.Folder exchangeMailbox = folderSearchResults.Folders.ToList().Find(
            f => f.DisplayName.Equals("BA", StringComparison.CurrentCultureIgnoreCase));

What am I missing? I feel like I am almost there and that this should work according to the EWS Managed API 2.0 documentation, but I

Dillon Willis
  • 169
  • 2
  • 3
  • 6

1 Answers1

28

You should just be using the FolderId overload to specify the Mailbox you want to access. eg if your shared Mailbox was called Shared@domain.com then use

FolderId SharedMailbox = new FolderId(WellKnownFolderName.Inbox,"Shared@domain.com");
ItemView itemView = new ItemView(1000);
service.FindItems(SharedMailbox,itemView);

Also don't use

ItemView itemView = new ItemView(int.MaxValue);

This won't work as Exchange will restrict the Maximum amount of items returned due to throttling. Always paget the result for findItems and findfolders see http://blogs.msdn.com/b/exchangedev/archive/2010/03/12/throttling-policies-and-the-ewsfindcountlimit.aspx

Cheers Glen

Nico Bleiler
  • 475
  • 4
  • 14
Glen Scales
  • 20,495
  • 1
  • 20
  • 23