Доступ к обмену электронной почтой в C # - PullRequest
14 голосов
/ 14 мая 2009

Знаете ли вы, есть ли способ?

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

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

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

Ответы [ 11 ]

18 голосов
/ 15 мая 2009

Если вы используете 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;
}

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

6 голосов
/ 15 мая 2009

Зависит от версии Exchange. WebDAV работает с 2000 по 2007, но для веб-служб требуется 2007 +.

Это, наверное, самый простой способ получить работу. CDO - это еще один вариант, но он не поддерживается в C # - поэтому вам придется выйти из proc .

Exchange также имеет поставщика OLEDB , но я никогда не использовал его - он поддерживается из .NET , однако.

5 голосов
/ 19 октября 2009

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

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

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

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

3 голосов
/ 15 мая 2009

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

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

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

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

тип: CAPA это должно вернуть список возможностей, которые поддерживает ваш сервер обмена. CAPA + OK список возможностей следует ТОП USER PIPELINING EXPIRE НИКОГДА UIDL САСЛ НТЛМ .

Обратите внимание, что мой не показывает PLAIN

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

Если ваш ответ не содержит PLAIN, остановитесь, так как вам нужна библиотека, поддерживающая SPA

тип: user myusername ИЛИ ЖЕ введите: user myusername@domain.corp, заменив domain.corp вашим доменом

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

Тип: pass mypass

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

тип: список

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

2 голосов
/ 08 июля 2011

Я написал это, чтобы получить электронную почту из моего почтового ящика. У меня есть утомительное задание каждое утро, если есть электронное письмо, поэтому я написал этот фрагмент кода, чтобы проверить свою папку на наличие заголовка электронного письма. Я добавил немного создания XML, чтобы показать возможности. Это не обмен, но это работает в моем случае. XCData кодирует любой специальный символ в теле. Думаю, мне следует указать, что тема письма, которую я ищу, - [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");


        }
    }
}

Мэтт

1 голос
/ 09 июля 2011

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

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

1 голос
/ 15 мая 2009

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

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

1 голос
/ 15 мая 2009

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

1 голос
/ 14 мая 2009

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

1 голос
/ 14 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...