Access exchange e-mail in C#

Wiesz, czy jest jakiś sposób?

Użyłem tej biblioteki, Aby uzyskać dostęp do serwera pop3, ale nie działa ona z serwerem exchange.

Czy znasz jakąś inną bibliotekę lub fragment kodu, który pokaże mi jak to zrobić?

Nie mogę zmienić żadnych ustawień na serwerze.

Author: juan, 2009-05-14

11 answers

Zależy od wersji Exchange. WebDAV działa z 2000 do 2007, ale Web Services wymaga 2007+.

Te są prawdopodobnie najłatwiejsze do pracy. CDO jest inną opcją, ale nie jest wspierane z C# - więc musisz wyjść z proc.

Exchange ma również OLEDB provider, ale nigdy z niego nie korzystałem - jest to jednak obsługiwane przez.Net.
 6
Author: Mark Brackett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-08 20:04:03

Jeśli używasz Exchange 2007 i masz włączone Usługi internetowe, jest to dość proste. Dodałem klasyczny odnośnik internetowy w stylu 2.0 do mojego projektu VS2008 i mogę otrzymywać takie wiadomości e-mail:

// 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;
}

Zmienna "messages" będzie tablicą obiektów ItemType zwracanych z exchange, które mają wszystkie właściwości, których można oczekiwać dla wiadomości mail (Treść, załączniki, itd.). Mam nadzieję, że to pomoże!

 18
Author: Scott Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-15 16:10:59

Używanie EWS bezpośrednio w kodzie zarządzanym (VB.net / C#) jest niezdarny, aby powiedzieć, że najlepszy.

Włóczę się po nim od kilku dni i doszedłem do wniosku, że lepiej zbudować własne klasy opakowujące wokół API, dzięki czemu usługi mogą być użyteczne w jednej lub dwóch wierszach kodu, a nie na stronie z bieżącą implementacją.

Zgadnij co? Microsoft pobił mnie do tego: pierwszy kandydat do wydania Exchange Web Services Managed API jest dostępny do pobrania tutaj .

Zainstaluj, zarejestruj referencję dll (\Program Files \ Microsoft \ Exchange \ Web Services\1.0 \ Micorosft.Wymiana.WebServices.dll), oraz zaimportować przestrzeń nazw (Microsoft.Wymiana.WebServices.Data) i jesteś gotowy do akcji.

 5
Author: Ryan Barrett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-19 14:53:40

Zakładam, że twój problem polega na tym, że twój serwer exchange obsługuje tylko uwierzytelnianie NTLM i nie pozwala na uwierzytelnianie za pomocą zwykłego tekstu? Możesz też nie używać odpowiedniej konwencji nazwy użytkownika. Na przykład możesz spróbować użyć formatu username@domain, gdzie domena jest wewnętrzną domeną NT, która może nie być taka sama jak Twoja domena internetowa.

Jeśli tak jest, poszukaj biblioteki obsługującej NTLM.

Kroki do testowania przez telnet

Przejdź do wiersza polecenia Typ: telnet my.server.com 110 powinieneś otrzymać odpowiedź od swojego serwera exchange w następujący sposób + OK Microsoft Exchange Server 2003 POP3 server Wersja 6.5.7638.1 (my.server.com) gotowy.

Typ: CAPA powinno to zwrócić listę funkcji obsługiwanych przez serwer exchange. CAPA + Lista możliwości OK TOP Użytkownik PIPELINING EXPIRE NEVER UIDL SASL NTLM .

Zauważ, że mój nie pokazuje zwykłego

Oto odpowiedź serwera pocztowego, który robi+OK gotowy. CAPA + OK CAPA TOP UIDL RESP-KODY PIPELINING STLS Użytkownik SASL PLAIN .

Jeśli Twoja odpowiedź nie zawiera PLAIN to zatrzymaj, ponieważ potrzebujesz biblioteki obsługującej SPA

Typ: użytkownik myusername Lub Typ: user [email protected] zastępując domenę.corp z twoją domeną

Należy wówczas otrzymać + OK

Typ: pass mypass

Powinieneś otrzymać odpowiedź + OK

Type: list

Powinien dostać listę e-maili. Może to pomóc sprawdzić, czy twój problem jest problem z formatem nazwy użytkownika.

 3
Author: Jim Scott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-15 17:14:45

Napisałem to, aby otrzymać e-mail z mojej skrzynki odbiorczej. Mam żmudne zadanie do wykonania każdego ranka, jeśli istnieje e-mail, więc napisałem ten fragment kodu, aby sprawdzić mój folder pod kątem tytułu wiadomości e-mail. Dodałem mały kawałek tworzenia xml, aby pokazać możliwości. To nie wymiana, ale działa w moim przypadku. XCData koduje dowolny specjalny znak w ciele. Chyba powinienem zwrócić uwagę, że temat e-maila, którego szukam, to [Ticket-Support#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

 2
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-08 19:31:43

Możesz użyć tej biblioteki: http://www.dimastr.com/redemption/

 1
Author: Christian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 19:58:42

Musisz użyć Exchange SDK Jeśli POP3 nie jest włączony na serwerze Exchange. Inną opcją jest użycie WebDAV.

 1
Author: Jose Basilio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 19:58:48

Inną opcją jest skonfigurowanie Exchange, aby włączyć IMAP4. Istnieją biblioteki IMAP4 innych firm dla. NET, np. rebex.

 1
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 20:06:47

Możesz używać EWS (Exchange webservices) począwszy od Exchange 2007. Wydają się być zawsze instalowane i są lepiej obsługiwane niż Webdav.

Możesz po prostu zaimportować webservice ze swojego serwera Exchangeserver(wyszukaj plik asmx w katalogu instalacyjnym). Można pobrać EML-pliki z poczty i zrobić wiele więcej rzeczy!

 1
Author: Christian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-15 16:00:21

Możesz użyć Exchange Web Services (Exchange 2007 lub 2010) lub WebDav (Exchange do 2007, 2010 nie obsługuje WebDAV), ale API i implementacja mogą być nieco uciążliwe, jeśli chcesz zrobić szybki rozwój.

W przeszłości korzystałem z bibliotek IndependentSoft dla WebDav i Exchange Web Services, które zapewniają owijanie wokół interfejsów API Exchange i są znacznie prostsze w użyciu. Zajmują się przetwarzaniem wiadomości i MIME całkiem dobrze.

 1
Author: Can Gencer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-08 22:44:14
  1. Obecnie preferowanym API (w Exchange 2013 i 2016) jest EWS. Jest on oparty wyłącznie na HTTP i może być dostępny z dowolnego języka, ale istnieją specyficzne biblioteki . Net i Java.

    Możesz użyć EWSEditor do zabawy z API.

  2. Rozszerzone MAPI . Jest to natywne API używane przez Outlook. Kończy się za pomocą dostawcy Msems Exchange MAPI, który może rozmawiać z Exchange za pomocą RPC (Exchange 2013 już nie obsługuje je) lub RPC-over-HTTP (Exchange 2007 lub nowszy) lub MAPI-over-HTTP (Exchange 2013 i nowszy).

    [[2]} API jest dostępne tylko z niezarządzanego C++ lub Delphi . Możesz również użyć Redemption (dowolnego języka) - jego rodzina obiektów RDO jest rozszerzonym opakowaniem MAPI. Aby korzystać z rozszerzonej MAPI, musisz zainstalować Outlook lub standalone (Exchange) wersja MAPI (na rozszerzonej obsłudze, i nie obsługuje Unicode PST i MSG plików i nie można uzyskać dostępu do Exchange 2016). Rozszerzone MAPI mogą być używane w usłudze.

    Możesz grać z API używając OutlookSpy lub MFCMAPI .

  3. Outlook Object Model - nie jest specyficzny dla Exchange, ale umożliwia dostęp do wszystkich danych dostępnych w Outlooku na komputerze, na którym działa kod. Nie może być używany w serwisie.

  4. Exchange Active Sync . Microsoft nie inwestuje już w to żadnych znaczących zasobów protokół.

  5. Outlook używany do instalacji biblioteki CDO 1.21( owija Rozszerzone MAPI), ale został wycofany przez Microsoft i nie otrzymuje już żadnych aktualizacji.

  6. Kiedyś istniał zewnętrzny wrapper MAPI. Net o nazwie MAPI33, ale nie jest już rozwijany ani wspierany.

  7. WebDAV-deprecated.

  8. Collaborative Data Objects for Exchange (CDOEX) - przestarzałe.

  9. Exchange OLE DB Provider (EXOLEDB) - deprecated.

 0
Author: Dmitry Streblechenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-26 19:19:16