read email using exchange web services

本秂侑毒 提交于 2020-01-11 02:07:25

问题


This is my scenario: I have to read email from exchange 2010 sp2 accounts. I have to use Exchange Web Services, POP3 and IMAP are blocked. I have to test my app in an environment where people can access their accounts through a web browser only in the intranet. I can't debug my app directly to this intranet. I have this snippet to access an account:

private void Dowork()
{
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);

    string dominio = "domain";
    string usuario = "user";
    string password = "password";

    service.Credentials = new NetworkCredential(usuario, password, dominio);

    string url = usuario + "@" + dominio + ".com";

    service.AutodiscoverUrl(url, RedirectionUrlValidationCallback);
    //service.AutodiscoverUrl(url);

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

    string content = string.Empty;

    foreach (Item item in findResults.Items)
    {
        EmailMessage email = EmailMessage.Bind(service, item.Id);
        email.Load();

        content += item.Subject + "\n";
        content += email.From.Address + "\n";
        content += email.Body + "\n\n";

        //Console.WriteLine(item.Subject);
        //Console.WriteLine(email.From.Address);
        //Console.WriteLine(email.Body);
    }

    string result = content;
}

// Create the callback to validate the redirection URL.
static bool RedirectionUrlValidationCallback(String redirectionUrl)
{
    // Perform validation.
    return (redirectionUrl == "https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml");
}

If I use this line:

service.AutodiscoverUrl(url);

I get this error:

"Autodiscover blocked a potentially insecure redirection to https://autodiscover.colpatria.com/autodiscover/autodiscover.xml. To allow Autodiscover to follow the redirection, use the AutodiscoverUrl(string, AutodiscoverRedirectionUrlValidationCallback) overload."

So the method RedirectionUrlValidationCallback was implemented, I'm not sure if the url is right. The fact is I'm getting this error:

"The Autodiscover service couldn't be located".

Is possible that Autodiscover is not configured properly?? I'm not the exchange administrator, how can I know if autodiscover works?? I need arguments to tell exchange administrators this feature must be configured. Thanks for any help.


回答1:


Having run into similar issues recently and working to resolve them I discovered a utility that was/is very helpful in troubleshooting: EWS Editor It may not solve your problems but can be used to iterate over different configuration combinations very quickly which will hopefully shed some light on your issues.

I used this app when Working with a client to establish Autodiscover and Service URL connections to test and prod Exchange servers. It was handy not only for me but the client's IT staff as well. They downloaded and used the utility to test and verify their settings.

From http://ewseditor.codeplex.com :

Project description

EWSEditor has three goals:

  1. Demonstrate the Exchange Web Services Managed API functionality and simplicity to developers through its source code.

  2. Demonstrate the Exchange Web Services SOAP traffic used to perform actions initiated through an explorer user interface.

  3. Assist non-developers in debugging and understanding Exchange stores by exploring items, folders, and their properties in depth




回答2:


Somehow you need to log the result of what redirectionUrl is. You will get this error when your redirectionUrl doesn't match the URI you've specified (i.e. your autodiscover validation callback returns FALSE). Certainly the redirectionUrl URI is not what you think it is. If you are using SSL - you need to handle the redirect validation callback.

Since you cannot debug the application, perhaps you could send an email to yourself, log to a shared DB or file, or perhaps use the app event log (throwing an application exception).

Note: The first error does tell you the autodiscover URI is https://autodiscover.colpatria.com/autodiscover/autodiscover.xml. Should this replace the existing string https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml?

Also see related SO post regarding Exchange Autodiscovery and Validating a Potentially Unsafe Redirection URL on MSDN.




回答3:


This is a old post I thought I'd put in a full example solution for the error reported. Simply replace service.AutodiscoverUrl("someuser@somedomain.org"); with System.Uri("https://mail.somedomain.org/ews/Exchange.asmx");

Here's the full block of code

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
                service.Credentials = new WebCredentials("someuser", "somepassword");
                //service.AutodiscoverUrl("someuser@somedomain.org");
                service.Url = new System.Uri("https://mail.somedomain.org/ews/Exchange.asmx");



回答4:


Try service.TraceEnabled = true;

WFM. In my case I needed to set up SSL/TLS by installing a certificate from the Exchange Server onto the client machine. I was led to this solution from the output of the trace.




回答5:


This works like a charm to me:

   var exchange = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
   var username = Settings.EmailUserName;
   var password = Settings.EmailPassword;
   var domain = Settings.EmailDomain;
   var email = Settings.Email;
   exchange.Credentials = new WebCredentials(email, password);
   exchange.AutodiscoverUrl(email, RedirectionCallback);

and the RedirectionCallback is:

 static bool RedirectionCallback(string url)
        {
            // Return true if the URL is an HTTPS URL.
            return url.ToLower().StartsWith("https://");
        }

heres is the link: https://msdn.microsoft.com/en-us/library/office/dd635285(v=exchg.80).aspx

Regards!




回答6:


When you used AutodiscoverUrl() with RedirectionUrlValidationCallback, here is a sample code:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.PreAuthenticate = true;
service.Credentials = new WebCredentials("my_username","my_password"); //use WebCredentials instead of NetworkCredential
service.AutodiscoverUrl(userEmailAddress, RedirectionCallback);

And RedirectionCallback method be like:

        static bool RedirectionCallback(string url)
        {
            bool redirectionValidated = false;
            Uri redirectionUri = new Uri(url);

//There are two ways of implementing a RedirectionCallback scheme

// Way 1: Return true if the URL is an HTTPS URL.
            //return url.ToLower().StartsWith("https://");
            if (redirectionUri.Scheme == "https")
                redirectionValidated = true;

//Way 2: check if url is autodiscovery url
            if (url.Equals(
                "https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml"))
                redirectionValidated = true;

            return redirectionValidated;
        }

PS: Take care of proxies disallowing Autodiscovery service. In my case, this code everytime returned "The Autodiscovery service cannot be located" error, but the root cause was 403 Forbidden on Autodiscovery call. It did work after proxy settings.



来源:https://stackoverflow.com/questions/11477255/read-email-using-exchange-web-services

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!