Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Download attachment from Exchange using Exchange Web Services

I am trying to use the following code to connect and download an attachment from email in an inbox using C# and Exchange Web Services but I am getting a 'System.ArgumentOutOfRangeException' error and I cant see why. I have googled for an answer but i cant find one or the answers I find are for very old versions of EWS.

I know that the rest of the code generally works as I can access other information relating to the email, just not access the attachment.

Cany anyone show me the error of my ways?

Thanks in advance,

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

        }
    }
}

Solved but new problem

I have sorted the issue now by changing the 'foreach (Item item in findResults.Items)' to 'foreach (EmailMessage item in findResults.Items)' but now I need to find out how to enumerate through the attachments - any ideas anyone?

like image 855
Jimbo James Avatar asked May 13 '11 11:05

Jimbo James


2 Answers

Check your profile. If you're running on light mode, attachments are not being downloaded with message.

add following line

item.Load() // loads the entire message with attachment
like image 130
vikas Avatar answered Nov 15 '22 15:11

vikas


The answer to your new problem is

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

                }
            }

        }
like image 30
Nigel Findlater Avatar answered Nov 15 '22 17:11

Nigel Findlater