Доступ к электронной почте обмена в С#
Знаете ли вы, есть ли способ?
Я использовал эту библиотеку для доступа к серверу 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.
Ответ 7
Вы можете использовать эту библиотеку:
http://www.dimastr.com/redemption/
Ответ 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) - устарел.