Lire le courrier électronique MS Exchange en C #

J’ai besoin de la possibilité de surveiller et de lire les e-mails à partir d’une boîte aux lettres particulière sur un serveur MS Exchange (interne à mon entreprise). Je dois aussi pouvoir lire l’adresse e-mail, l’object, le corps du message et télécharger une pièce jointe, le cas échéant.

Quelle est la meilleure façon de le faire en utilisant C # (ou Vb.net)?

C’est le bordel. MAPI ou CDO via une DLL d’interopérabilité .NET n’est officiellement pas pris en charge par Microsoft – il semblera fonctionner correctement, mais il existe des problèmes de memory leaks dus à leurs modèles de mémoire différents. Vous pouvez utiliser CDOEX, mais cela ne fonctionne que sur le serveur Exchange lui-même, pas à distance. inutile. Vous pouvez interagir avec Outlook, mais maintenant vous venez de faire une dépendance sur Outlook; exagéré. Enfin, vous pouvez utiliser la prise en charge WebDAV d’Exchange 2003 , mais WebDAV est compliqué, .NET ne prend que très peu en charge sa gestion et, pour ne pas vous blesser, Exchange 2007 supprime presque complètement la prise en charge de WebDAV.

Qu’est-ce qu’un gars à faire? J’ai fini par utiliser le composant IMAP d’AfterLogic pour communiquer avec mon serveur Exchange 2003 via IMAP, ce qui a très bien fonctionné. (Normalement, je recherche des bibliothèques libres ou open-source, mais j’ai trouvé toutes les bibliothèques .NET, surtout quand il s’agissait de l’implémentation de l’IMAP en 2003, et que celle-ci était assez bon marché et essayez, je sais qu’il y en a d’autres.

Si votre organisation est sur Exchange 2007, vous avez de la chance. Exchange 2007 est livré avec une interface de service Web basée sur SOAP qui fournit enfin un moyen unifié et indépendant du langage d’interagir avec le serveur Exchange. Si vous pouvez faire de 2007+ une exigence, c’est certainement la voie à suivre. (Malheureusement pour moi, mon entreprise a une politique “mais 2003 n’est pas cassée”.)

Si vous devez relier Exchange 2003 et 2007, IMAP ou POP3 est définitivement la voie à suivre.

Um,

Je suis peut-être un peu en retard ici, mais n’est-ce pas le point pour EWS?

https://msdn.microsoft.com/en-us/library/dd633710(EXCHG.80).aspx

Prend environ 6 lignes de code pour récupérer le courrier d’une boîte aux lettres:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1); //service.Credentials = new NetworkCredential( "{Active Directory ID}", "{Password}", "{Domain Name}" ); service.AutodiscoverUrl( "[email protected]" ); FindItemsResults findResults = service.FindItems( WellKnownFolderName.Inbox, new ItemView( 10 ) ); foreach ( Item item in findResults.Items ) { Console.WriteLine( item.Subject ); } 
  1. L’API actuellement préférée (Exchange 2013 et 2016) est EWS . Il est uniquement basé sur HTTP et est accessible depuis n’importe quel langage, mais il existe des bibliothèques spécifiques à .Net et Java .

    Vous pouvez utiliser EWSEditor pour jouer avec l’API.

  2. MAPI étendu Il s’agit de l’API native utilisée par Outlook. Il finit par utiliser le fournisseur MAPI Exchange MSEMS , qui peut communiquer avec Exchange à l’aide de RPC (Exchange 2013 ne le prend plus en charge) ou RPC sur HTTP (Exchange 2007 ou ultérieur) ou MAPI-sur-HTTP (Exchange 2013 et ultérieur).

    L’API elle-même est accessible uniquement à partir de C ++ ou Delphi non gérés. Vous pouvez également utiliser Redemption (n’importe quel langage) – sa famille d’objects RDO est un wrapper MAPI étendu. Pour utiliser MAPI étendu, vous devez installer Outlook ou la version autonome (Exchange) de MAPI (sur un support étendu, et il ne prend pas en charge les fichiers PST et MSG Unicode et ne peut pas accéder à Exchange 2016). MAPI étendu peut être utilisé dans un service.

    Vous pouvez jouer avec l’API en utilisant OutlookSpy ou MFCMAPI .

  3. Modèle d’object Outlook – non spécifique à Exchange, mais il permet d’accéder à toutes les données disponibles dans Outlook sur la machine où le code s’exécute. Ne peut pas être utilisé dans un service.

  4. Exchange Active Sync . Microsoft n’investit plus de ressources significatives dans ce protocole.

  5. Outlook utilisé pour installer la bibliothèque CDO 1.21 (il enveloppe MAPI étendu), mais il a été déconseillé par Microsoft et ne reçoit plus aucune mise à jour.

  6. Il existait un wrapper .Net MAPI tiers appelé MAPI33, mais il n’est plus développé ni pris en charge.

  7. WebDAV – déconseillé.

  8. Objets de données collaboratifs pour Exchange (CDOEX) – obsolète.

  9. Fournisseur OLE DB Exchange (EXOLEDB) – déconseillé.

Voici un vieux code que j’avais pour faire WebDAV. Je pense que cela a été écrit contre Exchange 2003, mais je ne m’en souviens plus. N’hésitez pas à l’emprunter si c’est utile …

 class MailUtil { private CredentialCache creds = new CredentialCache(); public MailUtil() { // set up webdav connection to exchange this.creds = new CredentialCache(); this.creds.Add(new Uri("http://mail.domain.com/Exchange/[email protected]/Inbox/"), "Basic", new NetworkCredential("myUserName", "myPassword", "WINDOWSDOMAIN")); } ///  /// Gets all unread emails in a user's Inbox ///  /// A list of unread mail messages public List GetUnreadMail() { List unreadMail = new List(); ssortingng reqStr = @"   SELECT ""urn:schemas:mailheader:from"", ""urn:schemas:httpmail:textdescription"" FROM ""http://mail.domain.com/Exchange/[email protected]/Inbox/"" WHERE ""urn:schemas:httpmail:read"" = FALSE AND ""urn:schemas:httpmail:subject"" = 'tbintg' AND ""DAV:contentclass"" = 'urn:content-classes:message'  "; byte[] reqBytes = Encoding.UTF8.GetBytes(reqStr); // set up web request HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://mail.domain.com/Exchange/[email protected]/Inbox/"); request.Credentials = this.creds; request.Method = "SEARCH"; request.ContentLength = reqBytes.Length; request.ContentType = "text/xml"; request.Timeout = 300000; using (Stream requestStream = request.GetRequestStream()) { try { requestStream.Write(reqBytes, 0, reqBytes.Length); } catch { } finally { requestStream.Close(); } } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (Stream responseStream = response.GetResponseStream()) { try { XmlDocument document = new XmlDocument(); document.Load(responseStream); // set up namespaces XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable); nsmgr.AddNamespace("a", "DAV:"); nsmgr.AddNamespace("b", "urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"); nsmgr.AddNamespace("c", "xml:"); nsmgr.AddNamespace("d", "urn:schemas:mailheader:"); nsmgr.AddNamespace("e", "urn:schemas:httpmail:"); // Load each response (each mail item) into an object XmlNodeList responseNodes = document.GetElementsByTagName("a:response"); foreach (XmlNode responseNode in responseNodes) { // get the  node that contains valid HTTP responses XmlNode uriNode = responseNode.SelectSingleNode("child::a:href", nsmgr); XmlNode propstatNode = responseNode.SelectSingleNode("descendant::a:propstat[a:status='HTTP/1.1 200 OK']", nsmgr); if (propstatNode != null) { // read properties of this response, and load into a data object XmlNode fromNode = propstatNode.SelectSingleNode("descendant::d:from", nsmgr); XmlNode descNode = propstatNode.SelectSingleNode("descendant::e:textdescription", nsmgr); // make new data object model.Mail mail = new model.Mail(); if (uriNode != null) mail.Uri = uriNode.InnerText; if (fromNode != null) mail.From = fromNode.InnerText; if (descNode != null) mail.Body = descNode.InnerText; unreadMail.Add(mail); } } } catch (Exception e) { ssortingng msg = e.Message; } finally { responseStream.Close(); } } return unreadMail; } } 

Et modèle.Mail:

 class Mail { private ssortingng uri; private ssortingng from; private ssortingng body; public ssortingng Uri { get { return this.uri; } set { this.uri = value; } } public ssortingng From { get { return this.from; } set { this.from = value; } } public ssortingng Body { get { return this.body; } set { this.body = value; } } } 

J’ai utilisé du code publié sur CodeProject.com . Si vous souhaitez utiliser POP3, c’est l’une des meilleures solutions que j’ai trouvée.

Si votre serveur Exchange est configuré pour prendre en charge POP ou IMAP, c’est une solution simple.

Une autre option est l’access WebDAV. il y a une bibliothèque disponible pour cela. Cela pourrait être votre meilleure option.

Je pense qu’il existe des options utilisant des objects COM pour accéder à Exchange, mais je ne suis pas certain de sa facilité.

Tout dépend de ce que votre administrateur est prêt à vous donner, je suppose.

Vous devriez pouvoir utiliser MAPI pour accéder à la boîte aux lettres et obtenir les informations dont vous avez besoin. Malheureusement, la seule bibliothèque .NET MAPI (MAPI33) que je connaisse semble ne pas être maintenue. C’était un excellent moyen d’accéder à MAPI via .NET, mais je ne peux pas parler de son efficacité maintenant. Il y a plus d’informations sur l’endroit où vous pouvez l’obtenir ici: Emplacement de téléchargement pour MAPI33.dll?

J’ai finalement trouvé une solution en utilisant Redemption, regardez ces questions …

  • Utiliser la rédemption …

  • Utiliser Redemption sur une machine 64 bits

Une option consiste à utiliser Outlook. Nous avons une application de gestionnaire de courrier qui accède à un serveur d’échange et utilise Outlook comme interface. C’est sale mais ça marche.

Exemple de code:

 public Outlook.MAPIFolder getInbox() { mailSession = new Outlook.Application(); mailNamespace = mailSession.GetNamespace("MAPI"); mailNamespace.Logon(mail_username, mail_password, false, true); return MailNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); } 

Je pense qu’il est préférable d’utiliser EWS .. suivez ce lien – MSDN-EWS