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 для этого приложения. Это решило проблему аутентификации.