2009-05-14 3 views
14

Знаете ли вы, есть ли способ?Доступ к электронной почте обмена в C#

Я использовал this library для доступа к серверу pop3, но он не работает с сервером обмена.

Знаете ли вы о какой-либо другой библиотеке или фрагменте кода, который покажет мне, как это сделать?

Я не могу изменить какие-либо настройки на сервере.

+0

Какая версия Exchange? Если вы используете 2007, я могу дать вам пример кода для веб-служб Exchange ... –

+0

Это Exchange 2003 – juan

ответ

6

Зависит от версии Exchange. WebDAV работает с 2000 по 2007 год, но Web Services требует 2007+.

Возможно, это самый простой способ получить работу. CDO - еще один вариант, но it's not supported from C# - так что вам нужно будет пойти out of proc.

Обмен также имеет OLEDB provider, но я его никогда не использовал - это supported from .NET, однако.

1

Необходимо использовать Exchange SDK, если POP3 не включен на сервере Exchange. Другие варианты - использовать WebDAV.

1

Вы можете использовать эту библиотеку: http://www.dimastr.com/redemption/

+0

Это похоже на Outlook - не Exchange. Тонкая (но важная) разница. –

+0

Redemption имеет как обложку CDO, называемую RDO, так и объекты Safe * Item, которые работают вместе с OOM – 76mel

+0

Нет, он также поддерживает Exchange. Вы можете использовать ProfMan для создания временного профиля для доступа к хранилищу Exchange – Christian

1

Другой вариант заключается в настройке Обмен, чтобы включить IMAP4. Существуют сторонние библиотеки IMAP4 для .NET, например. Rebex.

+0

Я не могу изменить настройки на сервере – juan

1

Вы можете использовать веб-службы EWS (Exchange Webservices), начиная с Exchange 2007. Они, похоже, всегда установлены и лучше поддерживаются, чем Webdav.

Вы можете просто импортировать веб-сервис из своего Exchangeserver (искать asmx-файл в каталоге установки). Вы можете загружать EML-файлы из своих писем и делать многое другое!

17

Если вы используете Exchange 2007 и имеете веб-службы, это довольно просто. Я добавил 2,0-стиль классический веб-ссылки на мой VS2008 проекта, и я могу получить сообщения электронной почты, как это:

// exchange 2007 lets us use web services to check mailboxes. 
using (ExchangeServiceBinding exchangeServer = new ExchangeServiceBinding()) 
{ 
    ICredentials creds = new NetworkCredential("user","password"); 
    exchangeServer.Credentials = creds; 
    exchangeServer.Url = "https://myexchangeserver.com/EWS/Exchange.asmx"; 
    FindItemType findItemRequest = new FindItemType(); 
    findItemRequest.Traversal = ItemQueryTraversalType.Shallow; 

    // define which item properties are returned in the response 
    ItemResponseShapeType itemProperties = new ItemResponseShapeType(); 
    itemProperties.BaseShape = DefaultShapeNamesType.AllProperties; 
    findItemRequest.ItemShape = itemProperties; 

    // identify which folder to search 
    DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1]; 
    folderIDArray[0] = new DistinguishedFolderIdType(); 
    folderIDArray[0].Id = DistinguishedFolderIdNameType.inbox; 

    // add folders to request 
    findItemRequest.ParentFolderIds = folderIDArray; 

    // find the messages 
    FindItemResponseType findItemResponse = exchangeServer.FindItem(findItemRequest); 

    // read returned 
    FindItemResponseMessageType folder = (FindItemResponseMessageType)findItemResponse.ResponseMessages.Items[0]; 
    ArrayOfRealItemsType folderContents = new ArrayOfRealItemsType(); 
    folderContents = (ArrayOfRealItemsType)folder.RootFolder.Item; 
    ItemType[] items = folderContents.Items; 

    // if no messages were found, then return null -- we're done 
    if (items == null || items.Count() <= 0) 
     return null; 

    // FindItem never gets "all" the properties, so now that we've found them all, we need to get them all. 
    BaseItemIdType[] itemIds = new BaseItemIdType[items.Count()]; 
    for (int i = 0; i < items.Count(); i++) 
     itemIds[i] = items[i].ItemId; 

    GetItemType getItemType = new GetItemType(); 
    getItemType.ItemIds = itemIds; 
    getItemType.ItemShape = new ItemResponseShapeType(); 
    getItemType.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties; 
    getItemType.ItemShape.BodyType = BodyTypeResponseType.Text; 
    getItemType.ItemShape.BodyTypeSpecified = true; 

    GetItemResponseType getItemResponse = exchangeServer.GetItem(getItemType); 
    ItemType[] messages = new ItemType[getItemResponse.ResponseMessages.Items.Count()]; 

    for (int j = 0; j < messages.Count(); j++) 
     messages[j] = ((ItemInfoResponseMessageType)getItemResponse.ResponseMessages.Items[j]).Items.Items[0]; 

    return messages; 
} 

«Сообщения» переменная будет массивом ItemType возвращаемых объектов из обмена, которые обладают всеми свойствами вы ожидаете почтового сообщения (Body, Attachments и т. д.). Надеюсь, это поможет!

+0

Отличный образец! Благодаря :-) –

3

Я предполагаю, что ваша проблема заключается в том, что ваш сервер обмена поддерживает только аутентификацию NTLM и не допускает проверку подлинности с использованием обычного текста? Или вы не можете использовать правильное соглашение о имени пользователя. Например, вы можете попробовать использовать формат username @ domain, где домен является внутренним доменом NT, который может быть не таким же, как ваш интернет-домен.

Если это так, тогда найдите библиотеку, поддерживающую NTLM.

Шагов для тестирования через телнет

Перейти к командной строке введите следующую команду: телнет my.server.com 110 вы должны получить ответ от сервера обмена, как этот + OK Microsoft Exchange Server 2003 версии сервера POP3 6.5 .7638.1 (my.server.com) готов.

тип: CAPA это должно вернуть список возможностей, поддерживаемых вашим сервером обмена. CAPA + OK список Capability следующим TOP пользователь PIPELINING EXPIRE НИКОГДА НЕ UIDL SASL NTLM .

Обратите внимание, что шахта не показывает ОБЫЧНОЙ

Вот ответ от сервера электронной почты, который делает + OK Dovecot готов. CAPA + OK CAPA TOP UIDL RESP-КОДЫ PIPELINING STLS USER SASL PLAIN .

Если ваш ответ не включает ОБЫЧНЫЕ затем остановиться, как вам нужна библиотека, которая поддерживает SPA

Типа: пользователь MyUserName ИЛИ Типа: пользовательский [email protected] заменяющий domain.corp с доменом

затем вы должны получить + OK

Тип: пройти mypass

Вы должны получить ответ + O K Тип

: список

Если получить список писем. Это может помочь выяснить, является ли ваша проблема проблемой формата имени пользователя.

5

Использование EWS непосредственно в управляемом коде (VB.net/C#) неудобно сказать лучше.

Я уже несколько дней общался с ним и пришел к выводу, что лучше создавать собственные классы-обертки вокруг API, что делает услуги полезными в строке или двух кода, а не страницу с текущей реализацией.

Угадайте, что? Microsoft избила меня: первый выпуск Candidate для управляемых API-интерфейсов Exchange Web Services доступен для скачивания here.

Установите, зарегистрируйте ссылку на dll (\ Program Files \ Microsoft \ Exchange \ Web Services \ 1.0 \ Micorosft.Exchange.WebServices.dll) и импортируйте пространство имен (Microsoft.Exchange.WebServices.Data), и вы готовый к рулону.

2

Я написал это, чтобы получить электронную почту из моего почтового ящика. У меня есть утомительная задача делать каждое утро, если там есть электронная почта, поэтому я написал этот бит кода, чтобы проверить свою папку на название электронной почты. Я добавил небольшую часть создания xml, чтобы показать возможности. Его не обмен, но он работает в моем случае. XCData кодирует любой специальный символ в теле. Я думаю, я должен отметить, что по электронной почте тему я ищу это [Ticket - Поддержка # 12345]

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Outlook = Microsoft.Office.Interop.Outlook; 
using Microsoft.Office; 
using System.Xml.Linq; 

namespace ProcessEmail 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Outlook.Application outlook = new Outlook.Application(); 
      Outlook.NameSpace ns = outlook.GetNamespace("Mapi"); 
      object _missing = Type.Missing; 
      ns.Logon(_missing, _missing, false, true); 

      Outlook.MAPIFolder inbox = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); 

      int unread = inbox.UnReadItemCount; 
      XElement xmlMail = new XElement("Mail"); 
      foreach (Outlook.MailItem mail in inbox.Items) 
      {    
       string s = mail.Subject; 

       if (s != null) 
       { 
        if (s.Contains("Tickets") || (s.Contains("Support"))) 
        { 
         string[] splitter = s.Split('#'); 
         string[] split = splitter[1].Split(']');      
         string num = split[0].Trim(); 

         XElement mailrow = new XElement("MailRow", 
          new XElement("Ticket_Number",num), 
          new XElement("Subject", mail.Subject), 
          new XElement("Body", new XCData(mail.Body)), 
          new XElement("From", mail.SenderEmailAddress) 
          ); 
         xmlMail.Add(mailrow); 
        } 
       } 

      } 
      xmlMail.Save("E:\\mailxml.xml"); 


     } 
    } 
} 

Matt

1

Вы можете использовать Exchange Web Services (Exchange 2007 или 2010) или WebDav (Exchange вверх до 2007, 2010 не поддерживает WebDAV), но API и реализация могут быть немного громоздкими, если вы хотите быстро развиваться.

Я использовал библиотеки IndependentSoft для WebDav и Exchange Web Services в прошлом, которые предоставляют оболочку вокруг API-интерфейсов Exchange и намного проще в использовании. Они также отлично разбираются в сообщении и MIME.

0
  1. Предпочтительное в настоящее время API (в обмене 2013 и 2016) является EWS. Он основан исключительно на HTTP и может быть доступен с любого языка, но есть .Net и Java конкретных библиотек.

    Вы можете использовать EWSEditor, чтобы играть в API.

  2. Extended MAPI. Это собственный API, используемый Outlook. Он заканчивается использованием провайдера MSEMS Exchange MAPI, который может разговаривать с Exchange с использованием RPC (Exchange 2013 больше не поддерживает его) или RPC-over-HTTP (Exchange 2007 или новее) или MAPI-over-HTTP (Exchange 2013 и новее).

    Доступ к API можно получить только из неуправляемого C++ или Delphi. Вы также можете использовать Redemption (на любом языке) - его RDO Семейство объектов - Расширенная оболочка MAPI. Чтобы использовать расширенный MAPI, вам необходимо установить Outlook или standalone (Exchange) version of MAPI (при расширенной поддержке, и он не поддерживает файлы Unicode PST и MSG и не может получить доступ к Exchange 2016). Расширенный MAPI может использоваться в сервисе.

    Вы можете играть с API, используя OutlookSpy или MFCMAPI.

  3. Outlook Object Model - не Exchange специфический, но он позволяет получить доступ ко всем данным, доступным в Outlook на машине, где выполняется код. Невозможно использовать в службе.

  4. Exchange Active Sync. Microsoft больше не вкладывает значительные ресурсы в этот протокол.

  5. Перспективы, используемые для установки библиотеки CDO 1.21 (она обертывает Extended MAPI), но она устарела Microsoft и больше не получает никаких обновлений.

  6. Раньше была сторонняя. Net MAPI-оболочка, называемая MAPI33, но она больше не разрабатывается и не поддерживается.

  7. WebDAV - устаревший.

  8. Совместные объекты данных для обмена (CDOEX) - устаревшие.

  9. Exchange OLE DB Provider (EXOLEDB) - устаревшее.

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