문제

MS Exchange Server(회사 내부)의 특정 사서함에서 전자 메일을 모니터링하고 읽을 수 있는 기능이 필요합니다.또한 보낸 사람의 이메일 주소, 제목, 메시지 본문을 읽고 첨부 파일이 있는 경우 다운로드할 수 있어야 합니다.

C#(또는 Vb.net)을 사용하여 이를 수행하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

엉망입니다. .NET Interop DLL을 통한 MAPI 또는 CDO입니다 공식적으로 Microsoft가 지원하지 않습니다-잘 작동하는 것처럼 보이지만 메모리 모델이 다르기 때문에 메모리 누출에 문제가 있습니다. CDOEX를 사용할 수 있지만 원격으로는 아니지만 Exchange 서버 자체에서만 작동합니다. 쓸모없는. 당신은 Outlook과 상호 연락 할 수 있지만 이제는 Outlook에 의존했습니다. 지나침. 마지막으로, 당신은 사용할 수 있습니다 Exchange 2003의 WebDAV 지원, 그러나 Webdav는 복잡하지만 .NET은이를 내장 지원이 좋지 않으며 (부상에 모욕을 추가하기 위해) Exchange 2007 거의 완전히 떨어집니다 WebDav 지원.

해야 할 남자는 무엇입니까? 나는 결국 사용했다 내세의 IMAP 구성 요소 IMAP를 통해 Exchange 2003 서버와 통신하기 위해 이로 인해 매우 잘 작동했습니다. (나는 일반적으로 무료 또는 오픈 소스 라이브러리를 찾지만, 2003 년의 IMAP 구현의 일부에 관해서는 .net을 원하는 모든 도서관을 찾았습니다. 시도해. 나는 거기에 다른 사람들이 있다는 것을 알고 있습니다.)

그러나 조직이 Exchange 2007에 있다면 운이 좋다. Exchange 2007에는 비누 기반 웹 서비스 인터페이스가 제공됩니다 결국에는 교환 서버와 상호 작용하는 통일 된 언어 독립적 인 방법을 제공합니다. 2007+를 요구할 수 있다면 이것이 확실히가는 길입니다. (슬프게도 저에게는 우리 회사는 "2003 년은 깨지지 않았습니다"정책을 가지고 있습니다.)

Exchange 2003과 2007을 모두 브리지를해야한다면 IMAP 또는 POP3가 갈 길입니다.

다른 팁

음,

나는 여기에 너무 늦었을 수도 있지만 이런 종류의 EWS는 그렇지 않습니까?

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 );
}
  1. 현재 선호되는 (Exchange 2013 및 2016) API는 EWS. 순전히 HTTP 기반이며 모든 언어에서 액세스 할 수 있지만 .그물 그리고 자바 특정 라이브러리.

    당신이 사용할 수있는 ewseditor API와 함께 연주합니다.

  2. 확장 된 MAPI. 이것은 Outlook에서 사용하는 기본 API입니다. 그것은 끝납니다 MSEMS RPC (Exchange 2013은 더 이상 지원하지 않음) 또는 RPC-Over-HTTP (Exchange 2007 또는 Newer) 또는 Mapi-Over-HTTP (Exchange 2013 및 Newer)를 사용하여 Exchange Exchange와 대화 할 수있는 Exchange Mapi 제공자.

    API 자체는 관리되지 않는 C ++ 또는 델파이. 당신은 또한 사용할 수 있습니다 구원 (모든 언어) - 그 rdo 물체 제품군은 확장 된 MAPI 래퍼입니다. 확장 된 MAPI를 사용하려면 Outlook 또는 MAPI의 독립형 (Exchange) 버전 (확장 된 지원에 따라 유니 코드 PST 및 MSG 파일을 지원하지 않으며 Exchange 2016에 액세스 할 수 없습니다). 확장 된 MAPI는 서비스에 사용할 수 있습니다.

    API를 사용하여 플레이 할 수 있습니다 Outlookspy 또는 mfcmapi.

  3. Outlook Object 모델 - 교환 별은 아니지만 코드가 실행되는 시스템의 Outlook에서 사용 가능한 모든 데이터에 액세스 할 수 있습니다. 서비스에서 사용할 수 없습니다.

  4. Exchange Active Sync. Microsoft는 더 이상이 프로토콜에 중요한 리소스를 투자하지 않습니다.

  5. Outlook은 CDO 1.21 라이브러리를 설치하는 데 사용되었지만 (확장 된 MAPI를 랩핑 함) Microsoft에 의해 더 이상 사용되지 않았으며 더 이상 업데이트를받지 못했습니다.

  6. 예전에는 Mapi33이라는 제 3 자 .NET MAPI 래퍼가 있었지만 더 이상 개발되거나 지원되지 않습니다.

  7. Webdav- 감가 상각 된.

  8. Exchange (CDOEX) 용 협업 데이터 개체 - 감가 상각 된.

  9. Exchange Ole DB 제공자 (ExoLedb) - 감가 상각 된.

다음은 Webdav를하기 위해 놓친 오래된 코드입니다. 나는 그것이 Exchange 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;
    }
}

그리고 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; }
    }
}

나는 코드를 사용했습니다 codeproject.com에 게시되었습니다. POP3를 사용하려면 내가 찾은 더 나은 솔루션 중 하나입니다.

Exchange 서버가 POP 또는 IMAP를 지원하도록 구성된 경우 쉬운 방법입니다.

또 다른 옵션은 WebDav 액세스입니다. ~이있다 도서관 이용 가능. 이것이 최선의 선택 일 수 있습니다.

COM 객체를 사용하여 Exchange에 액세스하는 옵션이 있다고 생각하지만 그것이 얼마나 쉬운 지 잘 모르겠습니다.

그것은 모두 당신의 관리자가 당신에게 내가 당신에게 접근 할 의향이 무엇인지에 달려 있습니다.

MAPI를 사용하여 사서함에 액세스하고 필요한 정보를 얻을 수 있어야 합니다.불행하게도 제가 아는 유일한 .NET MAPI 라이브러리(MAPI33)는 유지 관리되지 않는 것 같습니다.이는 .NET을 통해 MAPI에 액세스하는 좋은 방법이었지만 지금은 그 효율성에 대해 말할 수 없습니다.어디서 얻을 수 있는지에 대한 자세한 정보는 여기에서 확인하세요. MAPI33.dll의 다운로드 위치는 무엇입니까?

나는 구속을 사용하여 결국 해결 된 솔루션을 얻었고,이 질문들을 살펴보십시오 ...

한 가지 옵션은 Outlook을 사용하는 것입니다. Exchange 서버에 액세스하고 Outlook을 인터페이스로 사용하는 메일 관리자 응용 프로그램이 있습니다. 더럽지 만 작동합니다.

예제 코드 :

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);
        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top