92 votes

Lire le courrier électronique MS Exchange en C #

J'ai besoin de pouvoir surveiller et lire les courriers électroniques d'une boîte aux lettres particulière sur un serveur MS Exchange (interne à ma société). Je dois également pouvoir lire l'adresse électronique de l'expéditeur, son objet, le corps du message et télécharger une pièce jointe, le cas échéant.

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

90voto

Nicholas Piasecki Points 13681

C'est un gâchis. MAPI ou CDO via un .NET interop DLL est officiellement pas supporté par Microsoft, il apparaît bien fonctionner, mais il y a des problèmes avec des fuites de mémoire en raison de leurs différents modèles de mémoire. Vous pouvez utiliser CDOEX, mais qui ne fonctionne que sur le serveur Exchange lui-même, et pas à distance; inutile. Vous pourriez interop avec Outlook, mais maintenant, vous avez juste fait une dépendance sur Outlook; overkill. Enfin, vous pouvez utiliser Exchange 2003 du support WebDAV, mais WebDAV est compliqué .NET a une mauvaise prise en charge intégrée pour elle, et (pour ajouter l'insulte à la blessure) Exchange 2007 près complètement gouttes support WebDAV.

Qu'est ce qu'un gars peut faire? J'ai fini par utiliser AfterLogic de l'IMAP composant pour communiquer avec mon serveur Exchange 2003 via le protocole IMAP, et cela a fini de travailler très bien. (J'ai l'habitude de chercher gratuit ou des bibliothèques open-source, mais j'ai trouvé que toutes les .NET ceux qui veulent, surtout quand il s'agit de certaines des bizarreries de 2003 de l'IMAP de mise en œuvre-et c'était assez bon marché et a travaillé sur le premier essai. Je sais qu'il y a d'autres là-bas.)

Si votre organisation est sur Exchange 2007, cependant, vous avez de la chance. Exchange 2007 est livré avec un SAVON à base de l'interface de service Web qui prévoit enfin unifiée, indépendante de la langue pour interagir avec le serveur Exchange. Si vous pouvez faire 2007+ une exigence, c'est certainement le chemin à parcourir. (Malheureusement pour moi, mon entreprise a un "mais 2003 n'est pas rompu" de la politique.)

Si vous avez besoin de pont Exchange 2003 et 2007, IMAP ou POP3 est certainement le chemin à parcourir.

67voto

Wardy Points 2289

Euh,

Je suis peut-être un peu trop en retard ici, mais n’est-ce pas là le but de l’EWS?

http://www.microsoft.com/download/en/details.aspx?displaylang=fr&id=13480

Prend environ 6 lignes de code pour obtenir 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( "First.Last@MyCompany.com" );

FindItemsResults<Item> findResults = service.FindItems(
   WellKnownFolderName.Inbox,
   new ItemView( 10 ) );

foreach ( Item item in findResults.Items )
{
   Console.WriteLine( item.Subject );
}
 

10voto

CodingWithSpike Points 17720

Voici un vieux code que je disposais 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/me@domain.com/Inbox/"), "Basic", new NetworkCredential("myUserName", "myPassword", "WINDOWSDOMAIN"));
    }

    /// <summary>
    /// Gets all unread emails in a user's Inbox
    /// </summary>
    /// <returns>A list of unread mail messages</returns>
    public List<model.Mail> GetUnreadMail()
    {
        List<model.Mail> unreadMail = new List<model.Mail>();

        string reqStr =
            @"<?xml version=""1.0""?>
                <g:searchrequest xmlns:g=""DAV:"">
                    <g:sql>
                        SELECT
                            ""urn:schemas:mailheader:from"", ""urn:schemas:httpmail:textdescription""
                        FROM
                            ""http://mail.domain.com/Exchange/me@domain.com/Inbox/"" 
                        WHERE 
                            ""urn:schemas:httpmail:read"" = FALSE 
                            AND ""urn:schemas:httpmail:subject"" = 'tbintg' 
                            AND ""DAV:contentclass"" = 'urn:content-classes:message' 
                        </g:sql>
                </g:searchrequest>";

        byte[] reqBytes = Encoding.UTF8.GetBytes(reqStr);

        // set up web request
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://mail.domain.com/Exchange/me@domain.com/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 <propstat> 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)
            {
                string msg = e.Message;
            }
            finally
            {
                responseStream.Close();
            }
        }

        return unreadMail;
    }
}
 

Et model.Mail:

 class Mail
{
    private string uri;
    private string from;
    private string body;

    public string Uri
    {
        get { return this.uri; }
        set { this.uri = value; }
    }

    public string From
    {
        get { return this.from; }
        set { this.from = value; }
    }

    public string Body
    {
        get { return this.body; }
        set { this.body = value; }
    }
}
 

1voto

Eldila Points 4048

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

0voto

Denis Troller Points 5774

Si votre serveur Exchange est configuré pour prendre en charge POP ou IMAP, c'est une solution de facilité.

Une autre option est l’accès 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 objets COM pour accéder à Exchange, mais je ne sais pas à quel point c'est facile.

Tout dépend de ce que votre administrateur est disposé à vous donner exactement, je suppose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X