在C#中访问交换电子邮件

你知道有没有办法?

我已经使用这个库来访问pop3服务器,但它不适用于Exchange服务器。

你知道其他任何图书馆或代码片段会告诉我怎么做吗?

我无法更改服务器上的任何设置。

取决于Exchange版本。 WebDAV适用于2000年至2007年,但Web服务需要2007年以上。

那些可能是最容易上class的人。 CDO是另一种选择,但C#不支持它 – 所以你必须退出proc 。

Exchange也有一个OLEDB提供商 ,但我从来没有使用它 – 但它得到了.NET的支持 。

如果您使用Exchange 2007并启用了Web服务,这非常简单。 我在我的VS2008项目中添加了2.0风格的经典Web参考,我可以收到这样的邮件:

// 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对象的数组,其具有您期望的邮件消息(正文,附件等)的所有属性。 我希望这有帮助!

直接在托管代码(VB.net / C#)中使用EWS是最笨拙的。

我已经摸索了几天了,并得出结论,最好围绕API构建我自己的包装类,使服务可以在一行或两行代码中使用,而不是使用目前的实施。

你猜怎么着? 微软打败了我:Exchange Web Services Managed API的第一个候选版本可在此处下载。

安装,注册dll引用(\ Program Files \ Microsoft \ Exchange \ Web Services \ 1.0 \ Micorosft.Exchange.WebServices.dll),并导入命名空间(Microsoft.Exchange.WebServices.Data),然后就可以开始了。

我假设您的问题是您的Exchange服务器仅支持NTLM身份validation,并且不允许纯文本身份validation? 或者您可能没有使用正确的用户名约定。 例如,您可以尝试使用username @ domain格式,其中domain是内部NT域,可能与您的Internet域不同。

如果是这种情况,那么寻找支持NTLM的库。

通过telnet进行测试的步骤

转到命令提示符键入:telnet my.server.com 110您应该从您的Exchange服务器获得响应,如此+确定Microsoft Exchange Server 2003 POP3服务器版本6.5.7638.1(my.server.com)准备就绪。

type:CAPA这应该返回您的Exchange服务器支持的function列表。 CAPA + OK能力列表遵循TOP USER PIPELINING EXPIRE NEID UIDL SASL NTLM。

请注意,我的不显示PLAIN

以下是来自电子邮件服务器的响应,它准备好了+ OK Dovecot。 CAPA + OK CAPA TOP UIDL RESP-CODES PIPELINING STLS USER SASL PLAIN。

如果您的回复不包括PLAIN,请停止,因为您需要一个支持SPA的库

键入:user myusername或type:user myusername@domain.corp将domain.corp替换为您的域

然后你应该收到+ OK

输入:传递mypass

您应该得到回复+确定

类型:列表

应该得到一个电子邮件列表。 这可能有助于查看您的问题是否是用户名格式问题。

我写这个来从我的收件箱收到电子邮件。 如果有电子邮件,我每天早上都要完成一项繁琐的工作,所以我写了一些代码来检查我的文件夹中是否有电子邮件标题。 我添加了一小部分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"); } } } 

马特

您可以使用此库: http : //www.dimastr.com/redemption/

如果Exchange Server中未启用POP3,则需要使用Exchange SDK 。 另一种选择是使用WebDAV

另一种选择是配置Exchange以启用IMAP4。 存在用于.NET的第三方IMAP4库,例如rebex。

您可以从Exchange 2007开始使用EWS(Exchange Web服务)。它们似乎始终安装并且比Webdav更受支持。

您只需从Exchange服务器导入Web服务(在安装目录中搜索asmx文件)。 您可以从邮件中下载EML文件并执行更多操作!

您可以使用Exchange Web服务 (Exchange 2007或2010)或WebDav (Exchange直到2007,2010不支持WebDAV),但如果要进行快速开发,API和实现可能有点麻烦。

我以前成功地使用了IndependentSoft的WebDav和Exchange Web服务库,这些库提供了Exchange API的包装并且使用起来更加简单。 他们也很好地解析了消息和MIME。

  1. 当前首选的API(在Exchange 2013和2016中)是EWS 。 它纯粹基于HTTP,可以从任何语言访问,但有.Net和Java特定的库。

    您可以使用EWSEditor来使用API​​。

  2. 扩展MAPI 。 这是Outlook使用的本机API。 它最终使用MSEMS Exchange MAPI提供程序,该提供程序可以使用RPC(Exchange 2013不再支持它)或RPC-over-HTTP(Exchange 2007或更高版本)或MAPI-over-HTTP(Exchange 2013和更高版本)与Exchange通信。

    API本身只能从非托管C ++或Delphi访问。 您还可以使用Redemption (任何语言) – 其RDO系列对象是扩展MAPI包装器。 若要使用扩展MAPI,您需要安装Outlook或MAPI的独立(Exchange)版本 (在扩展支持上,它不支持Unicode PST和MSG文件,并且无法访问Exchange 2016)。 扩展MAPI可用于服务。

    您可以使用OutlookSpy或MFCMAPI来使用API​​。

  3. Outlook对象模型 – 不是特定于Exchange的,但它允许访问运行代码的计算机上的Outlook中可用的所有数据。 不能用于服务。

  4. Exchange Active Sync 。 Microsoft不再向此协议投入任何重要资源。

  5. Outlook用于安装CDO 1.21库(它包装了扩展MAPI),但它已被Microsoft弃用,不再接收任何更新。

  6. 曾经有一个名为MAPI33的第三方.Net MAPI包装器,但它不再被开发或支持。

  7. WebDAV – 已弃用。

  8. Exchange协作数据对象(CDOEX) – 已弃用。

  9. Exchange OLE DB提供程序(EXOLEDB) – 已弃用。