API Office365 EWS Не удалось найти службу автообнаружения - PullRequest
0 голосов
/ 02 апреля 2020

Я написал консольное приложение. Net c# для извлечения писем из почтового ящика Office365 с указанными c учетными данными. Это приложение отлично работает на моей разработке P C. Теперь мне нужно развернуть это на сервере Windows (2019) и запустить через планировщик заданий. Однако на сервере это не работает, и я получаю «Служба автообнаружения не может быть найдена». ошибка. Пожалуйста, посмотрите мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Exchange.WebServices.Data;
using System.Configuration;
using System.Globalization;
using System.IO;

namespace DWMailProcessor
{
    class Program
    {
        static void Main(string[] args)
        {
            string emailName = ConfigurationManager.AppSettings["emailName"];
            string emailPassWord = ConfigurationManager.AppSettings["emailPassWord"];
            string filterSubject = ConfigurationManager.AppSettings["filterSubject"];
            string extractFilePath = ConfigurationManager.AppSettings["extractFilePath"];
            string emailFolder = ConfigurationManager.AppSettings["emailFolder"];
            string logFilePath = ConfigurationManager.AppSettings["logFilePath"] + $@"\DWMailProcessor.ErrorLog"; ;

            try
            {
                ExchangeService exchange = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
                exchange.Credentials = new WebCredentials(emailName, emailPassWord);
                exchange.AutodiscoverUrl(emailName, RedirectionUrlValidationCallback);

                if (exchange != null)
                {
                    Folder rootFolder = Folder.Bind(exchange, WellKnownFolderName.MsgFolderRoot);
                    SearchFilter ff = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, emailFolder);
                    FindFoldersResults fresult = rootFolder.FindFolders(ff, new FolderView(1));

                    FindItemsResults<Item> result;
                    do
                    {
                        SearchFilter sf = new SearchFilter.IsEqualTo(EmailMessageSchema.Subject, filterSubject);
                        result = exchange.FindItems(WellKnownFolderName.Inbox, sf, new ItemView(100));

                        foreach (Item item in result)
                        {
                            EmailMessage message = EmailMessage.Bind(exchange, item.Id);
                            FileAttachment attachment = (FileAttachment)message.Attachments[0];
                            attachment.Load(extractFilePath + @"\" + attachment.Name);
                            item.Move(fresult.Folders[0].Id);
                        }
                    } while (result.TotalCount > 0);
                }
            }
            catch (Exception e)
            {
                using (StreamWriter sw = new StreamWriter(logFilePath, append: true))
                {
                    sw.WriteLine($"Fatal[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InstalledUICulture)}]: {e.Message}");
                }
                //throw;
                return;
            }
        }

        private static bool RedirectionUrlValidationCallback(string redirectionUrl)
        {
            // The default for the validation callback is to reject the URL.
            bool result = false;
            Uri redirectionUri = new Uri(redirectionUrl);
            // Validate the contents of the redirection URL. In this simple validation
            // callback, the redirection URL is considered valid if it is using HTTPS
            // to encrypt the authentication credentials. 
            if (redirectionUri.Scheme == "https")
            {
                result = true;
            }
            return result;
        }
    }
}

Примечание: все учетные данные извлекаются из файла App.Config. У меня есть только ограниченные права на сервере, и наши ИТ-специалисты не имеют ни малейшего понятия о том, как устранить эту проблему. вопрос. Может ли это быть проблемой брандмауэра? поскольку сервер довольно ограничен inte rnet. ie (только указанные c URL-адреса и порты открыты. И ИТ-специалисты сказали, что они открыты https://outlook.office365.com/EWS/Exchange.asmx) Какие правила брандмауэра (если таковые имеются) должны быть установлены для использования EWS API? Есть ли другой способ устранения неполадок с сервера?

Большое спасибо заранее.

1 Ответ

0 голосов
/ 02 апреля 2020

Для автообнаружения будет использоваться URL-адрес autodiscover-s.outlook.com. Outlook.office365.com - это конечная точка EWS, которая в основном и всегда возвращается кодом автообнаружения для Office365, поскольку это конечная точка stati c. Если вы используете Office365, то вы можете считать Autodiscover избыточным, поскольку он будет возвращать только https://outlook.office365.com/EWS/Exchange.asmx, поэтому я бы посоветовал вам попробовать следующее для жесткого кодирования URL.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Exchange.WebServices.Data;
using System.Configuration;
using System.Globalization;
using System.IO;

namespace DWMailProcessor
{
    class Program
    {
        static void Main(string[] args)
        {
            string emailName = ConfigurationManager.AppSettings["emailName"];
            string emailPassWord = ConfigurationManager.AppSettings["emailPassWord"];
            string filterSubject = ConfigurationManager.AppSettings["filterSubject"];
            string extractFilePath = ConfigurationManager.AppSettings["extractFilePath"];
            string emailFolder = ConfigurationManager.AppSettings["emailFolder"];
            string logFilePath = ConfigurationManager.AppSettings["logFilePath"] + $@"\DWMailProcessor.ErrorLog"; ;

            try
            {
                ExchangeService exchange = new ExchangeService(ExchangeVersion.Exchange2016);
                exchange.Credentials = new WebCredentials(emailName, emailPassWord);
                exchange.Url = new Uri("https://outlook.office365.com/ews/exchange.asmx");
                exchange.HttpHeaders.Add("X-AnchorMailbox", emailName);

                if (exchange != null)
                {
                    Folder rootFolder = Folder.Bind(exchange, WellKnownFolderName.MsgFolderRoot);
                    SearchFilter ff = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, emailFolder);
                    FindFoldersResults fresult = rootFolder.FindFolders(ff, new FolderView(1));

                    FindItemsResults<Item> result;
                    do
                    {
                        SearchFilter sf = new SearchFilter.IsEqualTo(EmailMessageSchema.Subject, filterSubject);
                        result = exchange.FindItems(WellKnownFolderName.Inbox, sf, new ItemView(100));

                        foreach (Item item in result)
                        {
                            EmailMessage message = EmailMessage.Bind(exchange, item.Id);
                            FileAttachment attachment = (FileAttachment)message.Attachments[0];
                            attachment.Load(extractFilePath + @"\" + attachment.Name);
                            item.Move(fresult.Folders[0].Id);
                        }
                    } while (result.TotalCount > 0);
                }
            }
            catch (Exception e)
            {
                using (StreamWriter sw = new StreamWriter(logFilePath, append: true))
                {
                    sw.WriteLine($"Fatal[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InstalledUICulture)}]: {e.Message}");
                }
                //throw;
                return;
            }
        }

    }
}

One Другая проблема с вашим кодом - это использование аутентификации Basi c, которая будет проходить в октябре https://support.microsoft.com/en-au/help/4521831/exchange-online-deprecating-basic-auth, поэтому рассмотрите возможность использования oAuth.

Вероятно, последнее, что нужно посмотреть на код, который вы используете, это то, что все это можно сделать в Microsoft Graph API (возможно, и в PowerAutomate), что позволит вам уменьшить количество разрешений, необходимых вашему приложению, и дать вам больше гибкости в том, как / где вы ее выполняете и продлеваете жизнь любому процессу (в случае, если EWS отключается в любой момент в будущем).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...