与 Office365 的 EWS 连接失败 - 401 未经授权
EWS Connection to Office365 fails - 401 Unauthorized
我需要制作一个 VB .net 工具来阅读电子邮件和保存附件。我公司最近从内部部署的 Exchange 迁移到 Office 365。我已经阅读了 2 天的 EWS 教程,并搜索了 Whosebug,但无法通过授权访问 O365 邮箱的最基本步骤。
我从这篇文章中提取了原始代码:htp://www.c-sharpcorner.com/UploadFile/jj12345678910/reading-email-and-attachment-from-microsoft-exchange-server/。我在使用 Telerik 转换器将它转换为 VB 时遇到了一些问题,但我认为我做对了。每次我尝试使用 FindItemsResults 方法时,它都会以“(401) Unauthorized”停止。
提问的说明指出我应该包括指向我已经找到的内容的链接以及它为什么不起作用,但我的 SO 声誉只允许我 2 个链接。这是我尝试过的:
阅读此页面后,我尝试了所有可能的用户代码和域组合:htps://Whosebug。com/questions/10107872/ews-connections-issues-401-unauthorized
我正在尝试读取自己的邮箱,所以这个没有帮助:htps://Whosebug。com/questions/43346498/401-unauthorized-access-when-using-ews-to-connect-to-mailbox
我的连接看起来与此页面上的连接相同,但在我的项目中使用它并没有通过与 before:htps://whosebug.com/questions/29009295/ews-managed-api-retrieving-e-mails-from-office365-exchange-server[=13= 相同的未授权错误]
这是我的代码:
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 中的测试电子邮件自动配置相比,我已确认自动发现能够正确找到服务器。
AutoConfig
一个有趣的旁注 -- 在我的公司迁移到 Office 365 之后,我注意到我有两个新的 SMTP 邮件地址。如果我自己打开 Outlook 属性,我会看到:
Props
这意味着现在有人可以通过旧地址 john.doe@mycorp.com 和现在的 doejohn@mycorp.mail.onmicrosoft.com 向我发送邮件。新地址基于我的域用户代码。我从一个 gmail 帐户测试了微软的,它可以工作。
总而言之,这是我的问题:
1. 为什么我在尝试阅读收件箱时收到 (401) Unauthorized 错误?
2. Office 365 是否希望我使用我的域帐户或我的邮箱名称作为用户凭据?
3. 在 WebCredentials 声明的域部分,我是使用我公司的 mycorp.com 还是使用 Office 365 的域 outlook.office365.com?
如果您已经读到这里,非常感谢!
我找到了上面问题的答案,所以我会在这里分享以防有人需要它。问题归结于我的 IT 组织添加的安全协议,由于最近对我们公司的网络钓鱼攻击,这些协议没有记录在案。
第一个线索是 IT 声明如果我想在我的个人 4G 设备(如智能手机或 ipad 上查看公司电子邮件,我还必须安装 Microsoft InTune 以便 MFA 连接到 O365 邮件服务器。由于我不知道如何将 InTune 集成到我的 .Net 应用程序中,因此我不得不寻找另一个答案。
我请求并获得批准将我的功能邮箱从 O365 移动到此应用程序的内部部署 Exchange 服务器。这解决了身份验证问题。
我需要制作一个 VB .net 工具来阅读电子邮件和保存附件。我公司最近从内部部署的 Exchange 迁移到 Office 365。我已经阅读了 2 天的 EWS 教程,并搜索了 Whosebug,但无法通过授权访问 O365 邮箱的最基本步骤。
我从这篇文章中提取了原始代码:htp://www.c-sharpcorner.com/UploadFile/jj12345678910/reading-email-and-attachment-from-microsoft-exchange-server/。我在使用 Telerik 转换器将它转换为 VB 时遇到了一些问题,但我认为我做对了。每次我尝试使用 FindItemsResults 方法时,它都会以“(401) Unauthorized”停止。
提问的说明指出我应该包括指向我已经找到的内容的链接以及它为什么不起作用,但我的 SO 声誉只允许我 2 个链接。这是我尝试过的:
阅读此页面后,我尝试了所有可能的用户代码和域组合:htps://Whosebug。com/questions/10107872/ews-connections-issues-401-unauthorized
我正在尝试读取自己的邮箱,所以这个没有帮助:htps://Whosebug。com/questions/43346498/401-unauthorized-access-when-using-ews-to-connect-to-mailbox
我的连接看起来与此页面上的连接相同,但在我的项目中使用它并没有通过与 before:htps://whosebug.com/questions/29009295/ews-managed-api-retrieving-e-mails-from-office365-exchange-server[=13= 相同的未授权错误]
这是我的代码:
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 中的测试电子邮件自动配置相比,我已确认自动发现能够正确找到服务器。
AutoConfig
一个有趣的旁注 -- 在我的公司迁移到 Office 365 之后,我注意到我有两个新的 SMTP 邮件地址。如果我自己打开 Outlook 属性,我会看到:
Props
这意味着现在有人可以通过旧地址 john.doe@mycorp.com 和现在的 doejohn@mycorp.mail.onmicrosoft.com 向我发送邮件。新地址基于我的域用户代码。我从一个 gmail 帐户测试了微软的,它可以工作。
总而言之,这是我的问题: 1. 为什么我在尝试阅读收件箱时收到 (401) Unauthorized 错误? 2. Office 365 是否希望我使用我的域帐户或我的邮箱名称作为用户凭据? 3. 在 WebCredentials 声明的域部分,我是使用我公司的 mycorp.com 还是使用 Office 365 的域 outlook.office365.com?
如果您已经读到这里,非常感谢!
我找到了上面问题的答案,所以我会在这里分享以防有人需要它。问题归结于我的 IT 组织添加的安全协议,由于最近对我们公司的网络钓鱼攻击,这些协议没有记录在案。
第一个线索是 IT 声明如果我想在我的个人 4G 设备(如智能手机或 ipad 上查看公司电子邮件,我还必须安装 Microsoft InTune 以便 MFA 连接到 O365 邮件服务器。由于我不知道如何将 InTune 集成到我的 .Net 应用程序中,因此我不得不寻找另一个答案。
我请求并获得批准将我的功能邮箱从 O365 移动到此应用程序的内部部署 Exchange 服务器。这解决了身份验证问题。