सी # में एमएस एक्सचेंज ईमेल पढ़ें


91

मुझे एमएस एक्सचेंज सर्वर (मेरी कंपनी के लिए आंतरिक) पर किसी विशेष मेलबॉक्स से ई-मेल को मॉनिटर करने और पढ़ने की क्षमता की आवश्यकता है। मुझे प्रेषक के ई-मेल पते, विषय, संदेश निकाय को पढ़ने और किसी भी अनुलग्नक को डाउनलोड करने में सक्षम होने की आवश्यकता है।

C # (या VB.NET) का उपयोग करने का सबसे अच्छा तरीका क्या है?


4
Microsoft ने Exchange 2007 SP1 और v2010 के लिए Exchange वेब सेवाएँ प्रबंधित API को रिलीज़ कर दिया है, जो किसी को Outlook की आवश्यकता के बिना प्रोग्राम को आपके मेलबॉक्स में लाने की अनुमति देता है। मेरे ब्लॉग पर मेरे दो लेख हैं जो इस दृष्टिकोण पर चर्चा करते हैं: - C #: एक्सचेंज वेब सेवाओं का उपयोग करके एक्सचेंज से सभी ईमेल प्राप्त करना
3megaMan

Exchange वेब सेवाएँ प्रबंधित API 1.0 SDK Exchange Server 2007 SP1 और इसके बाद के संस्करण के लिए Exchange को अद्यतन करने के लिए Microsoft अनुशंसित विधि है। msdn.microsoft.com/en-us/library/dd633710(EXCHG.80).aspx
jlo

जवाबों:


90

यह एक गड़बड़ है। .NET इंटरॉप DLL के माध्यम से MAPI या CDO आधिकारिक तौर पर Microsoft द्वारा असमर्थित है - यह ठीक काम करने के लिए दिखाई देगा, लेकिन उनके अलग-अलग मेमोरी मॉडल के कारण मेमोरी लीक की समस्याएं हैं। आप CDOEX का उपयोग कर सकते हैं, लेकिन यह केवल Exchange सर्वर पर ही काम करता है, दूरस्थ रूप से नहीं; निकम्मा। आप आउटलुक के साथ जुड़ सकते हैं, लेकिन अब आपने आउटलुक पर निर्भरता बना ली है; overkill। अंत में, आप Exchange 2003 के WebDAV समर्थन का उपयोग कर सकते हैं , लेकिन WebDAV जटिल है, .NET के पास इसके लिए खराब समर्थन है, और (चोट के लिए अपमान जोड़ने के लिए) Exchange 2007 लगभग पूरी तरह से WebDAV समर्थन को गिरा देता है।

एक आदमी को क्या करना है? मैंने अपने Exchange 2003 सर्वर के साथ IMAP के माध्यम से संवाद करने के लिए AfterLogic के IMAP घटक का उपयोग कर समाप्त किया , और यह बहुत अच्छी तरह से काम कर रहा है। (मैं आम तौर पर मुफ्त या ओपन-सोर्स लाइब्रेरी की तलाश करता हूं, लेकिन मैंने सभी .NET चाहने वालों को पाया - विशेष रूप से जब यह 2003 के IMAP कार्यान्वयन के कुछ quirks की बात आती है - और यह काफी सस्ता था और पहले पर काम किया था। कोशिश करो। मुझे पता है कि वहाँ अन्य लोग भी हैं।)

यदि आपका संगठन एक्सचेंज 2007 में है, तो आप भाग्य में हैं। Exchange 2007 SOAP-आधारित वेब सेवा इंटरफ़ेस के साथ आता है जो अंत में Exchange सर्वर के साथ सहभागिता का एक एकीकृत, भाषा-स्वतंत्र तरीका प्रदान करता है। यदि आप 2007+ आवश्यकता बना सकते हैं, तो यह निश्चित रूप से जाने का रास्ता है। (मेरे लिए दुख की बात है कि मेरी कंपनी के पास "लेकिन 2003 टूटी नहीं है" नीति है।)

यदि आपको Exchange 2003 और 2007 दोनों को पाटने की आवश्यकता है, तो IMAP या POP3 निश्चित रूप से जाने का रास्ता है।


21
Microsoft द्वारा SOAP-
जूलू

4
यह लगभग वैसा ही है जैसे कि Microsoft ने इसे किसी भी चीज़ के साथ निष्क्रिय किया हो, लेकिन आउटलुक
क्रिस एस

67

उम,

मैं यहाँ थोड़ी देर हो सकता हूँ लेकिन इस तरह से ईडब्ल्यूएस की बात नहीं है?

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

मेलबॉक्स से मेल प्राप्त करने के लिए कोड की लगभग 6 पंक्तियाँ लेता है:

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

5
"ईडब्ल्यूएस प्रबंधित एपीआई माइक्रोसॉफ्ट एक्सचेंज सर्वर 2007 सर्विस पैक 1 (SP1) और माइक्रोसॉफ्ट एक्सचेंज के बाद के संस्करणों के साथ संचार करने वाले अनुप्रयोगों के कार्यान्वयन को सरल करता है"
क्रिस एस

2
एहसास यह अनिवार्य रूप से एक साल पुराने संदेश के लिए एक नेक्रोबम्प है, लेकिन इस कोड ने मुझे लगभग पांच मिनट में इसी तरह की परियोजना के लिए तैयार किया था। के माध्यम से पहली बार पूरी तरह से काम किया। वास्तव में चयनित उत्तर IMO की तुलना में अधिक समकालीन / व्यापक समाधान ... किसी और के संदर्भ के लिए ध्यान देने योग्य।
डेविड डब्ल्यू

2
यह चल रहा है पर ध्यान दें। आपको NuGet पैकेज "Microsoft Exchange WebServices"
जॉन M

4
यह मेरे लिए पहली कोशिश पर काम किया। यह नया स्वीकृत उत्तर होना चाहिए।
kroe761

क्या मुझे पता है कि अगर मुझे अपने स्वयं के मेलबॉक्स से अलग एक ईमेल पते का उपयोग करना था service.autodiscoverurl, तो क्या मुझे प्रवेश करने की आवश्यकता होगी service.credentials, क्या मैं सही हूं?
जिमकोड

19
  1. वर्तमान में पसंदीदा (एक्सचेंज 2013 और 2016) एपीआई ईडब्ल्यूएस है । यह पूरी तरह से HTTP आधारित है और इसे किसी भी भाषा से एक्सेस किया जा सकता है, लेकिन इसमें .Net और जावा विशिष्ट पुस्तकालय हैं।

    आप API के साथ खेलने के लिए EWSEditor का उपयोग कर सकते हैं ।

  2. विस्तारित MAPI । यह आउटलुक द्वारा उपयोग किया जाने वाला देशी एपीआई है। यह MSEMSExchange MAPI प्रदाता का उपयोग करके समाप्त होता है , जो RPC (Exchange 2013 अब इसका समर्थन नहीं करता है) या RPC-over-HTTP (Exchange 2007 या नया) या MAPI-over-HTTP (Exchange 2013 और नया) का उपयोग कर Exchange से बात कर सकता है।

    एपीआई को केवल अनवांटेड C ++ या डेल्फी से ही एक्सेस किया जा सकता है । आप रिडेम्पशन (किसी भी भाषा) का उपयोग कर सकते हैं - वस्तुओं का आरडीओ परिवार एक विस्तारित एमएपीआई आवरण है। विस्तारित MAPI का उपयोग करने के लिए, आपको MAPI के आउटलुक या स्टैंडअलोन (एक्सचेंज) संस्करण को स्थापित करने की आवश्यकता है (विस्तारित समर्थन पर, और यह यूनिकोड पीएसटी और एमएसजी फ़ाइलों का समर्थन नहीं करता है और एक्सचेंज 2016 तक पहुंच नहीं सकता है)। विस्तारित MAPI का उपयोग सेवा में किया जा सकता है।

    आप OutlookSpy या MFCMAPI का उपयोग करके एपीआई के साथ खेल सकते हैं ।

  3. आउटलुक ऑब्जेक्ट मॉडल - एक्सचेंज विशिष्ट नहीं है, लेकिन यह उस मशीन पर आउटलुक में उपलब्ध सभी डेटा तक पहुंच की अनुमति देता है जहां कोड चलता है। एक सेवा में इस्तेमाल नहीं किया जा सकता।

  4. एक्सचेंज सक्रिय सिंक । Microsoft अब इस प्रोटोकॉल में किसी भी महत्वपूर्ण संसाधन का निवेश नहीं करता है।

  5. आउटलुक सीडीओ 1.21 लाइब्रेरी स्थापित करता था (यह विस्तारित एमएपीआई को लपेटता है), लेकिन इसे माइक्रोसॉफ्ट द्वारा अपदस्थ किया गया था और अब कोई अद्यतन प्राप्त नहीं होता है।

  6. एक थर्ड-पार्टी .Net MAPI रैपर हुआ करता था, जिसे MAPI33 कहा जाता है, लेकिन अब इसे विकसित या समर्थित नहीं किया जा रहा है।

  7. WebDAV - पदावनत।

  8. एक्सचेंज (CDOEX) के लिए सहयोगात्मक डेटा ऑब्जेक्ट - पदावनत।

  9. एक्सचेंज OLE DB प्रदाता (EXOLEDB) - पदावनत।


: EwsEditor GitHub के लिए ले जाया गया है github.com/dseph/EwsEditor
Opmet

10

यहाँ कुछ पुराना कोड है जिसे मैंने WebDAV करने के लिए रखा था। मुझे लगता है कि यह एक्सचेंज 2003 के खिलाफ लिखा गया था, लेकिन मुझे कोई और याद नहीं है। बेझिझक इसे उधार लें अगर इसके सहायक ...

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

और मॉडल। मेल:

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

1
नोट :: WebDAV समर्थन Exchange Server 2010 से हटा दिया गया है, इसके बजाय EWS का उपयोग करें।
हमारा आदमी केले में


0

यदि आपका Exchange सर्वर POP या IMAP का समर्थन करने के लिए कॉन्फ़िगर किया गया है, तो यह एक आसान तरीका है।

एक अन्य विकल्प WebDAV पहुंच है। उसके लिए एक पुस्तकालय उपलब्ध है। यह आपका सबसे अच्छा विकल्प हो सकता है।

मुझे लगता है कि एक्सचेंज तक पहुंचने के लिए COM ऑब्जेक्ट का उपयोग करने के विकल्प हैं, लेकिन मुझे यकीन नहीं है कि यह कितना आसान है।

यह सब इस बात पर निर्भर करता है कि वास्तव में आपका प्रशासक आपको मेरे अनुमान का उपयोग करने के लिए तैयार है या नहीं।


0

मेलबॉक्स तक पहुँचने और अपनी आवश्यक जानकारी प्राप्त करने के लिए आपको MAPI का उपयोग करने में सक्षम होना चाहिए। दुर्भाग्य से केवल .NET MAPI पुस्तकालय (MAPI33) मुझे पता है कि लगता है कि अप्राप्त है। यह .NET के माध्यम से MAPI तक पहुंचने का एक शानदार तरीका हुआ करता था, लेकिन मैं अब इसकी प्रभावशीलता पर बात नहीं कर सकता। जहाँ आप इसे प्राप्त कर सकते हैं, उसके बारे में अधिक जानकारी है: MAPI33.dll के लिए स्थान डाउनलोड करें?



0

एक विकल्प आउटलुक का उपयोग करना है। हमारे पास एक मेल प्रबंधक एप्लिकेशन है जो एक्सचेंज सर्वर तक पहुंचता है और इंटरफ़ेस के रूप में दृष्टिकोण का उपयोग करता है। इसका गंदा लेकिन यह काम करता है।

उदाहरण कोड:

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

1
यदि मैं Exchange 2003 तक पहुँच के लिए Win2003 में Windows सेवा का उपयोग करना चाहता हूँ ?? मुझे सर्वर win2003 में आउटलुक 2003 या 2007 स्थापित करने की आवश्यकता है?
कीकेनेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.