EWS Соединение с Office365 терпит неудачу - 401 Несанкционированный

Мне нужно сделать VB .net инструмент для чтения электронной почты и сохранения вложений. Моя компания недавно перешла с локального Exchange на Office 365. Я уже два дня читаю учебные пособия по EWS и ищу в Stackru, но не могу пройти самый простой шаг авторизованного доступа к почтовому ящику O365.

Я взял оригинальный код из этой статьи: http://www.c-sharpcorner.com/UploadFile/jj12345678910/reading-email-and-attachment-from-microsoft-exchange-server/. У меня были некоторые проблемы с преобразованием его в VB с помощью конвертера Telerik, но я думаю, что у меня все правильно. Каждый раз, когда я пытаюсь использовать метод FindItemsResults, он останавливается с "(401) Unauthorized."

В инструкциях по заданию вопроса указано, что я должен включить ссылки на то, что я уже нашел, и почему это не сработало, но моя репутация SO позволяет мне только 2 ссылки. Вот что я попробовал:

Я попробовал каждую возможную комбинацию кода пользователя и домена, которую я могу подумать после прочтения этой страницы: htps://stackru.com/questions/10107872/ews-connections-issues-401-unauthorized

Я пытаюсь прочитать свой собственный почтовый ящик, поэтому этот не помогает: htps://stackru.com/questions/43346498/401-unauthorized-access-when-using-ews-to-connect-to-mailbox

Мое соединение выглядит идентично соединению на этой странице, но использование его в моем проекте не привело к той же несанкционированной ошибке, как раньше:htps://stackru.com/questions/29009295/ews-managed-api-retrieving-e- письма-из-Office365-обменно-сервер

Вот мой код:

Public Class Form1
Public Exchange As ExchangeService
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    lstMsg.Clear()
    lstMsg.View = View.Details
    lstMsg.Columns.Add("Date", 150)
    lstMsg.Columns.Add("From", 250)
    lstMsg.Columns.Add("Subject", 400)
    lstMsg.Columns.Add("Has Attachment", 50)
    lstMsg.Columns.Add("Id", 100)
    lstMsg.FullRowSelect = True

End Sub

Public Sub ConnectToExchangeServer()
    Me.lblMsg.Text = "Connecting to Exchange Server"
    lblMsg.Refresh()
    Try
        'Exchange = New ExchangeService(ExchangeVersion.Exchange2013)
        Exchange = New ExchangeService()
        Exchange.TraceEnabled = True
        'Exchange.UseDefaultCredentials = True
        Exchange.Credentials = New WebCredentials("DoeJohn", "mypasswd", "mycorp.com")
        'Exchange.AutodiscoverUrl("DoeJohn@mycorp.mail.onmicrosoft.com", AddressOf MyRedirectionURLValidationCallback)
        'Exchange.AutodiscoverUrl("John.Doe@mycorp.com", AddressOf MyRedirectionURLValidationCallback)

        Exchange.Url = New System.Uri("https://outlook.office365.com/ews/exchange.asmx")
        lblMsg.Text = "Connected to Exchange Server"
        lblMsg.Refresh()
    Catch ex As Exception
        MsgBox("Fatal Error in Connect: " & ex.Message)
        End
    End Try
End Sub
Public Function MyRedirectionURLValidationCallback(RedirectionURL As String) As Boolean
    Dim Result As Boolean = False
    Dim RedirectionURI As Uri = New Uri(RedirectionURL)
    If RedirectionURI.Scheme = "https" Then
        Return True
    End If
    Return False
End Function
Private Sub btnRead_Click(sender As Object, e As EventArgs) Handles btnRead.Click
    Call ConnectToExchangeServer()
    Dim ts As TimeSpan = New TimeSpan(0, -1, 0, 0)
    Dim MyDate As DateTime = DateTime.Now.Add(ts)
    Dim MyFilter As SearchFilter.IsGreaterThanOrEqualTo = New SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, MyDate)

    If Exchange IsNot Nothing Then
        Dim FindResults As FindItemsResults(Of Item) =
            Exchange.FindItems(WellKnownFolderName.Inbox, MyFilter, New ItemView(50))
        Dim NewRow As ListViewItem
        For Each MyItem As Item In FindResults
            Dim Message As EmailMessage = EmailMessage.Bind(Exchange, MyItem.Id)
            NewRow = New ListViewItem(Message.DateTimeReceived.ToString())
            NewRow.SubItems.Add(Message.From.Name.ToString())
            NewRow.SubItems.Add(Message.Subject)
            NewRow.SubItems.Add(Message.HasAttachments.ToString())
            NewRow.SubItems.Add(Message.Id.ToString())
            lstMsg.Items.Add(NewRow)
        Next
    Else

    End If
End Sub

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

автонастройки

Интересная заметка - после того, как моя компания перешла на Office 365, я заметил, что у меня есть два новых почтовых адреса SMTP. Если я открываю свойства Outlook на себе, я вижу это:

Реквизит

Это означает, что кто-то может отправить мне письмо прямо сейчас по старому адресу john.doe@mycorp.com, а также по адресу doejohn@mycorp.mail.onmicrosoft.com. Новый адрес основан на коде пользователя моего домена. Я протестировал Microsoft один из учетной записи Gmail, и он работает.

Подводя итог, вот мои вопросы: 1. Почему я получаю (401) Несанкционированные ошибки, когда я пытаюсь прочитать мой Входящие? 2. Ожидает ли Office 365 использования моей учетной записи домена или имени почтового ящика для учетных данных пользователя? 3. В доменной части заявления WebCredentials я использую mycorp.com моей компании или вместо этого я использую домен outlook.office365.com Office 365?

Если вы прочитали это далеко, большое спасибо!

1 ответ

Решение

Я нашел ответ на проблему выше, поэтому я поделюсь здесь на случай, если кому-то понадобится. Проблема связана с протоколами безопасности, добавленными моей ИТ-организацией, которые не были задокументированы из-за недавних фишинговых атак на нашу компанию.

Первая подсказка заключалась в том, что ИТ-отдел заявил, что если я хочу проверить электронную почту компании на моем персональном устройстве 4G, например на смартфоне или iPad, я также должен установить Microsoft InTune для подключения MFA к почтовому серверу O365. Поскольку я не знаю, как интегрировать InTune в мое приложение.Net, мне пришлось искать другой ответ.

Я запросил и получил разрешение на перенос моего функционального почтового ящика с O365 на локальный сервер Exchange для этого приложения. Это решило проблему аутентификации.

Другие вопросы по тегам