2012-03-06 3 views
0

Работа с приложением, которое читает электронные письма. Есть ли способ помимо webdav, чтобы получить все письма с сервера Exchange 2003 на мой локальный компьютер. Проблема с webdav заключается в том, что она не получает тело сообщений Undelivered.Чтение электронной почты учетной записи Exchange Server 2003

CredentialCache creds = new CredentialCache(); 
      creds.Add(new Uri(a), "NTLM", 
       new NetworkCredential("xxxxx", "xxxxxx", "xxxxx.com")); 

      List<Mail> unreadMail = new List<Mail>(); 
      string reqStr = 

      @"<?xml version=""1.0""?> 
       <g:searchrequest xmlns:g=""DAV:""> 
        <g:sql> 
         SELECT 
          ""urn:schemas:mailheader:from"", 
          ""urn:schemas:mailheader:to"", 
          ""urn:schemas:httpmail:textdescription"" 

         FROM 
          ""http://xxxx.com/exchange/xxxx/Inbox/"" 
         WHERE 

          ""urn:schemas:httpmail:subject"" = 'Undeliverable: xxxx'        

         </g:sql> 
       </g:searchrequest>"; 



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


      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(a); 
      request.Credentials = 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); 


        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:"); 


        XmlNodeList responseNodes = document.GetElementsByTagName("a:response"); 
        foreach (XmlNode responseNode in responseNodes) 
        { 

         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); 
          XmlNode toNode = propstatNode.SelectSingleNode("descendant::d:to", nsmgr); 


          // make new data object 

          Mail mail = new Mail(); 
          if (uriNode != null) 
           mail.Uri = uriNode.InnerText; 
          if (fromNode != null) 
           mail.From = fromNode.InnerText; 
          if (descNode != null) 
           mail.Body = descNode.InnerText; 
          if (toNode != null) 
           mail.To = toNode.InnerText; 
          unreadMail.Add(mail); 

         } 
        } 
        var ac = unreadMail; 

       } 
       catch (Exception e) 
       { 
        string msg = e.Message; 
       } 
       finally 
       { 

        responseStream.Close(); 
       } 
      } 

в выходной XML я получаю пустое текстовое описание для недоставленных писем:

<a:status>HTTP/1.1 404 Resource Not Found</a:status><a:prop><e:textdescription /></a:prop></a:propstat></a:response> 
+2

Существует несколько способов (в зависимости от конфигурации сервера Exchange и т. Д.) ... пожалуйста, покажите код ... что вы пробовали? что именно не работает? – Yahia

+0

@Yahia посмотреть, что сделали .... –

+0

спасибо за обновление ... Я подозреваю, что «тело» потенциально «замаскировано» как приложение ... см. Мой ответ ниже ... – Yahia

ответ

1

Я вижу несколько вариантов взаимодействия с серверами Exchange. WebDAV довольно сложно использовать и не поддерживается в более поздней версии (2010), MS предоставляет EWS, но они не работают со старыми версиями.

С моей POV вы можете использовать любой из следующих компонентов (коммерческий!):

Еще один момент:

Wh en handling Undeliverable почты Я сделал опыт, что тело иногда предоставляется как приложение - в WebDAV это должно быть доступно через глагол X-MS-ENUMATT (но BEWARE: конкретные «вложения», такие как winmail.dat, автоматически «декодируются» Outlook на дисплее).

+0

хорошо спасибо за ваш ответ, но есть ли бесплатная версия lib бесплатно. Могу ли я использовать webdav для получения вложения электронной почты, чтобы получить его оттуда. –

+1

@ AI25 Я не знаю ни одной бесплатной библиотеки open source для этого ... в Exchange WebDAV-протоколе IIRC есть имя глагола 'ENUMATT' или подобное, которое может помочь ... проверить документы Exchange на MSDN для этого ... НО, если вложение является «winmail.dat», тогда у него есть недокументированный формат! – Yahia

1

вы можете попробовать отправить запрос HTTP на сервер так же, как OWA делает (с указанием почтового идентификатора в нем, конечно) - и тогда вы получите HTML, который вы можете проанализировать.

также - проверьте, находится ли исходное сообщение в массиве вложений «не доставленного» письма.

Смежные вопросы