Читайте MS обмениваются электронными сообщениями в C#

Мне нужна способность контролировать для и прочитать электронную почту из конкретного почтового ящика на Exchange Server MS (внутренний к моей компании). Я также должен смочь считать адрес электронной почты отправителя, предмет, тело сообщения и загрузить вложение, если таковые имеются.

Что лучший способ состоит в том, чтобы сделать это использование C# (или VB.NET)?

89
задан Sae1962 2 October 2019 в 17:25
поделиться

7 ответов

Это - путаница. MAPI или CDO через.NET interop DLL официально не поддерживаются Microsoft - это, будет казаться, будет хорошо работать, но существуют проблемы с утечками памяти из-за их отличающихся моделей памяти. Вы могли использовать CDOEX, но который только работает над самим Exchange Server, не удаленно; бесполезный. Вы могли interop с Outlook, но теперь Вы только что сделали зависимость от Outlook; излишество. Наконец, Вы могли использовать поддержка WebDAV 2003 Exchange , но WebDAV является сложным.NET имеет плохую встроенную поддержку его, и (для добавления оскорбления травмы) Exchange 2007 почти полностью отбрасывания поддержка WebDAV.

, Что должен сделать парень? Я закончил тем, что использовал компонент IMAP AfterLogic для общения с моим сервером Exchange 2003 через IMAP, и это закончило тем, что работало очень хорошо. (Я обычно ищу свободные или библиотеки с открытым исходным кодом, но я нашел все.NET, желающие - особенно когда дело доходит до некоторых причуд реализации IMAP 2003 - и этот был достаточно дешевым и обработанным на первой попытке. Я знаю, что там существуют другие.)

, Если Ваша организация находится на Exchange 2007, однако, Вы находитесь в удаче. Exchange 2007 идет с основанным на SOAP интерфейсом веб-сервиса , который наконец обеспечивает объединенный, независимый от языка способ взаимодействовать с Exchange Server. Если можно сделать 2007 + требование, это - определенно способ пойти. (Печально для меня, моя компания имеет, "но 2003 не повреждается" политика.)

, Если необходимо соединить оба Exchange мостом, 2003 и 2007, IMAP или POP3 определенно способ пойти.

89
ответ дан Nicholas Piasecki 24 November 2019 в 07:17
поделиться

Вот некоторый старый код, у меня было наложение вокруг, чтобы сделать 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;
    }
}

И модель. Почта:

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; }
    }
}
10
ответ дан CodingWithSpike 24 November 2019 в 07:17
поделиться

Я использовал код, который был опубликован на CodeProject.com . Если Вы хотите использовать POP3, это - одно из лучших решений, которые я нашел.

1
ответ дан Eldila 24 November 2019 в 07:17
поделиться

Если Ваш Exchange Server настроен для поддержки POP или IMAP, это - простой способ.

Другая опция является доступом WebDAV. существует библиотека доступны для этого. Это могло бы быть Вашим наилучшим вариантом.

я думаю, что существуют опции с помощью COM-объектов для доступа к Exchange, но я не уверен, насколько легкий это.

Все это зависит от того, к чему точно Ваш администратор готов предоставить Вам доступ, я предполагаю.

0
ответ дан Denis Troller 24 November 2019 в 07:17
поделиться

Необходимо быть в состоянии использовать MAPI, чтобы получить доступ к почтовому ящику и получить информацию, в которой Вы нуждаетесь. К сожалению, единственная библиотека MAPI.NET (MAPI33), о котором я знаю, кажется, не сохраняется. Это раньше было отличным способом получить доступ к MAPI через.NET, но я не могу говорить с ее эффективностью теперь. Существует больше информации о том, где можно получить ее здесь: местоположение Загрузки для MAPI33.dll?

0
ответ дан Community 24 November 2019 в 07:17
поделиться

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

0
ответ дан Community 24 November 2019 в 07:17
поделиться

Одна опция состоит в том, чтобы использовать Outlook. У нас есть почтовое приложение менеджера, которые получают доступ к Exchange Server и перспективе использования как интерфейс. Его грязное, но это работает.

Пример кода:

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);
        }
0
ответ дан duncane 24 November 2019 в 07:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: