2017-08-17 4 views
3

Je dois créer un outil VB .net pour lire les courriers électroniques et enregistrer les pièces jointes. Ma société a récemment migré d'Exchange sur site vers Office 365. Je lis des didacticiels EWS depuis 2 jours et je recherche StackOverflow, mais je ne parviens pas à franchir l'étape la plus élémentaire de l'accès autorisé à la boîte aux lettres O365. J'ai pris le code original de cet article: htp: //www.c-sharpcorner.com/UploadFile/jj12345678910/reading-email-and-attachment-from-microsoft-exchange-server/. J'ai eu du mal à le convertir en VB en utilisant le convertisseur Telerik mais je pense que j'ai raison. Chaque fois que j'essaie d'utiliser la méthode FindItemsResults, elle s'arrête avec "(401) Unauthorized".EWS Connexion à Office365 échoue - 401 non autorisé

Les instructions pour poser une question indiquent que je devrais inclure des liens vers ce que j'ai déjà trouvé et pourquoi cela n'a pas fonctionné, mais ma réputation de SO me permet seulement 2 liens. Voici ce que j'ai essayé:

J'ai essayé toutes les combinaisons de domaines et de domaines possibles après avoir lu cette page: htps: //stackoverflow.com/questions/10107872/ews-connections-issues-401-unauthorized

J'essaie de lire ma propre boîte aux lettres, donc celui-ci n'aide pas: htps: //stackoverflow.com/questions/43346498/401-unauthorized-access-when-using-ews-to-connect-to-mailbox

Ma connexion semble identique à la connexion sur cette page, mais l'utiliser dans mon projet n'a pas dépassé la même erreur non autorisée que précédemment: htps: //stackoverflow.com/questions/29009295/ews-managed-api- récupérer-e-mails-de-office365-exchange-server

Voici mon code:

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("[email protected]", AddressOf MyRedirectionURLValidationCallback) 
     'Exchange.AutodiscoverUrl("[email protected]", 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 

Je confirme que AutoDiscover est de trouver correctement le serveur, à comparer à tester dans Outlook Email AutoConfiguration.

AutoConfig

Une sidenote intéressante - après mon entreprise a déménagé à Office 365, je remarque que j'ai deux nouvelles adresses de messagerie SMTP. Si j'ouvre les propriétés Outlook sur moi-même, je vois ceci:

Props

Cela signifie que quelqu'un peut envoyer du courrier à moi maintenant, soit à l'ancienne adresse [email protected], et aussi maintenant à doejohn @ mycorp .mail.onmicrosoft.com. La nouvelle adresse est basée sur mon code d'utilisateur de domaine. J'ai testé le microsoft à partir d'un compte Gmail et cela fonctionne. En résumé, voici mes questions: 1. Pourquoi est-ce que je reçois les erreurs (401) non autorisées lorsque j'essaie de lire ma boîte de réception? 2. Office 365 m'attend-il à utiliser mon compte de domaine ou le nom de ma boîte aux lettres pour les informations d'identification de l'utilisateur? 3. Dans la partie domaine de l'instruction WebCredentials, est-ce que j'utilise mycorp.com de ma société ou est-ce que j'utilise le domaine outlook.office365.com d'Office 365?

Si vous avez lu jusqu'ici, merci beaucoup!

Répondre

0

J'ai trouvé la réponse au problème ci-dessus, donc je vais partager ici au cas où quelqu'un en aurait besoin. Le problème est dû aux protocoles de sécurité ajoutés par mon organisation informatique qui n'ont pas été documentés en raison des récentes attaques de phishing sur notre société.Le premier indice était que IT a déclaré que si je veux vérifier les emails de la société sur mon appareil personnel 4G comme un smartphone ou un ipad, je dois également installer Microsoft InTune pour la connexion MFA au serveur de messagerie O365. Comme je ne suis pas au courant de la façon d'intégrer InTune dans mon application .Net, j'ai dû chercher une autre réponse.

J'ai demandé et j'ai été autorisé à déplacer ma boîte aux lettres fonctionnelle de O365 vers un serveur Exchange sur site pour cette application. Cela a résolu le problème d'authentification.