Получать электронные письма, полученные в определенный день, из неизвестной папки в общей папке входящих сообщений Exchange 2016 EWS в C # - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь получить все сообщения с указанной пользователем даты на сервере Exchange 2016, используя управляемый API EWS в C #.

Я аутентифицируюсь с:

public static void Login(string username, string password)
    {
        service.UseDefaultCredentials = false;
        service.Credentials = new WebCredentials(username, password);
        service.AutodiscoverUrl(username, RedirectionUrlValidationCallback);
    }

Затемвыберите соответствующую папку входящих сообщений с помощью

sharedMailbox = new Mailbox(Properties.Settings.Default.Inbox);

SMTP-адрес сохраняется в Settings.settings.

Затем я нахожу нужную папку, используя следующую команду (из эта тема ):

        targetFolderId = new FolderId(WellKnownFolderName.Inbox, sharedMailbox);
        // set folder view

        view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
        view.PropertySet.Add(FolderSchema.DisplayName);
        view.Traversal = FolderTraversal.Deep;
        folderResults = service.FindFolders(WellKnownFolderName.Inbox, view);
        foreach(Folder f in folderResults)
        {
            if(f.DisplayName == "Invoices")
            {
                targetFolderId = f.Id;
                //tried showing a message box here
            }
        }

И используйте следующее (код фильтра из здесь и извлечение подробностей из кода сервера Exchange из здесь ), чтобы получить нужные мне сообщения:

public static void FetchUnreadMessages(DateTime searchDate)
    {

        SearchFilter greaterthanfilter = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, searchDate);
        SearchFilter lessthanfilter = new SearchFilter.IsLessThan(ItemSchema.DateTimeReceived, searchDate.AddDays(1));
        SearchFilter dayFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, greaterthanfilter, lessthanfilter);




        results = service.FindItems(targetFolderId, dayFilter, view);
        foreach(var item in results.Items)
        {
            emails.Add((EmailMessage)item);
        }



        PropertySet properties = (BasePropertySet.FirstClassProperties);
        service.LoadPropertiesForItems(emails, properties);



    }

Я не уверен, где это ломается.Я попытался показать окно сообщения в цикле foreach, которое находит папку с указанным именем, и кажется, что папка не найдена.Я знаю, что в общей папке входящих сообщений есть папка с таким отображаемым именем.

Я не очень хорош в отладке, и, к сожалению, мое понимание EWS API довольно шатко.Любые предложения относительно того, что мне не хватает, приветствуются.

Я храню все, что связано с входящей почтой, в статическом классе, поэтому мне нужно беспокоиться только об одном экземпляре.

1 Ответ

0 голосов
/ 07 июня 2018

Сначала возникают проблемы с вашим кодом

Затем выберите соответствующую папку входящих сообщений с помощью sharedMailbox = new Mailbox (Properties.Settings.Default.Inbox);targetFolderId = new FolderId (WellKnownFolderName.Inbox, sharedMailbox);

В этом коде нет ничего плохого, но вам, вероятно, нужно понять, что здесь происходит.Этот код не делает никаких обращений к серверу, он просто устанавливает класс FolderId, который вы можете использовать при вызове, чтобы получить одну из хорошо известных папок.

   view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
    view.PropertySet.Add(FolderSchema.DisplayName);
    view.Traversal = FolderTraversal.Deep;
    folderResults = service.FindFolders(WellKnownFolderName.Inbox, view);

Этот код будет просто искать в подпапке «Входящие» почтового ящика, чьи учетные данные вы используете.например,

service.Credentials = new WebCredentials (имя пользователя, пароль);

Если вы хотите найти подпапки папки «Входящие» SharedMailbox, вы будете использовать

view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
view.PropertySet.Add(FolderSchema.DisplayName);
view.Traversal = FolderTraversal.Deep;
folderResults = service.FindFolders(targetFolderId , view);

, поскольку вы используете targetFolderId в операциях FindFolder, который сообщает Exchange для поиска общего почтового ящика, а не почтового ящика, связанного с используемыми учетными данными.

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