Доступ к электронной почте обмена в С#

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

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

Если вы используете 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, возвращенных из обмена, которые имеют все свойства, которые вы ожидаете для почтового сообщения (Body, Attachments и т.д.). Надеюсь, это поможет!

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Тип: CAPA это должно вернуть список возможностей, поддерживаемых сервером Exchange. CAPA + OK Список возможностей следует ВВЕРХ USER PIPELINING ЭКСПЕРТ НИКОГДА UIDL SASL NTLM .

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

Вот ответ с сервера электронной почты, который делает + OK Dovecot. CAPA + OK CAPA ВВЕРХ UIDL RESP-КОДЫ PIPELINING STLS USER SASL PLAIN .

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

type: имя пользователя myusername ИЛИ введите: user [email protected], заменив domain.corp своим доменом

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

Тип: передать mypass

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

введите: list

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

Ответ 5

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

Ответ 6

Вам нужно использовать Exchange SDK, если POP3 не включен в Exchange Server. Другими параметрами являются WebDAV.

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

  • В настоящее время предпочтительный API (в Exchange 2013 и 2016) EWS. Это чисто HTTP-протокол и может быть доступен с любого языка, но есть . Net и Java.

    Вы можете использовать EWSEditor, чтобы играть с API.

  • Расширенная MAPI. Это собственный API, используемый Outlook. Он заканчивается использованием провайдера MSEMS Exchange MAPI, который может разговаривать с Exchange с использованием RPC (Exchange 2013 больше не поддерживает его) или RPC-over-HTTP (Exchange 2007 или новее) или MAPI-over-HTTP (Exchange 2013 и новее).

    К самому API можно получить доступ только из неуправляемого С++ или Delphi. Вы также можете использовать Redemption (любой язык) - его RDO - это расширенная оболочка MAPI. Чтобы использовать Extended MAPI, вам необходимо установить Outlook или автономную (Exchange) версию MAPI (при расширенной поддержке, и она не поддерживает Unicode PST и MSG и не могут получить доступ к Exchange 2016). Расширенный MAPI может использоваться в сервисе.

    Вы можете играть с API с помощью OutlookSpy или MFCMAPI.

  • Объектная модель Outlook - не специфичная для Exchange, но она позволяет получить доступ ко всем данным, доступным в Outlook на машине, где выполняется код, Невозможно использовать в службе.

  • Exchange Active Sync. Microsoft больше не инвестирует в этот протокол значительные ресурсы.

  • Outlook, используемый для установки библиотеки CDO 1.21 (она переносит Extended MAPI), но Microsoft устарела и больше не получает никаких обновлений.

  • Раньше была сторонняя .NET MAPI-оболочка, называемая MAPI33, но она больше не разрабатывается и не поддерживается.

  • WebDAV - устаревший.

  • Совместимые объекты данных для Exchange (CDOEX) - устаревшие.

  • Поставщик OLE DB Exchange (EXOLEDB) - устарел.