答案 0 :(得分:18)
如果您使用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对象数组,它包含您对邮件消息所期望的所有属性(正文,附件等)。我希望这有帮助!
答案 1 :(得分:6)
取决于Exchange版本。 WebDAV适用于2000年到2007年,但Web Services需要2007 +。
这些可能是最容易上班的。 CDO是另一种选择,但it's not supported from C# - 所以你必须去out of proc。
Exchange还有一个OLEDB provider,但我从未使用过它 - 但它是supported from .NET。
答案 2 :(得分:5)
直接在托管代码(VB.net / C#)中使用EWS是最笨拙的。
我一直在摸索它几天了,并得出结论,最好围绕API构建我自己的包装类,使服务可以在一行或两行代码中使用,而不是当前实施的页面。
猜猜是什么?微软打败了我:Exchange Web Services托管API的第一个候选版本可供下载here。安装,注册dll引用(\ Program Files \ Microsoft \ Exchange \ Web Services \ 1.0 \ Micorosft.Exchange.WebServices.dll),然后导入命名空间(Microsoft.Exchange.WebServices.Data)并准备就绪滚动。
答案 3 :(得分:3)
我认为您的问题是您的Exchange服务器仅支持NTLM身份验证并且不允许纯文本身份验证?或者您可能没有使用正确的用户名约定。例如,您可以尝试使用username @ domain格式,其中domain是内部NT域,可能与您的Internet域不同。
如果是这种情况,那么寻找支持NTLM的库。
通过telnet进行测试的步骤
转到命令提示符 输入:telnet my.server.com 110 你应该从你的交换服务器得到这样的响应 + OK确定Microsoft Exchange Server 2003 POP3服务器版本6.5.7638.1(my.server.com)。
类型:CAPA 这应该返回您的Exchange服务器支持的功能列表。 CAPA + OK功能列表如下 最佳 用户 流水线 永远没有 UIDL SASL NTLM
请注意我的不显示PLAIN
以下是来自电子邮件服务器的回复,它确实准备好了+ OK Dovecot。 CAPA + OK CAPA 最佳 UIDL RESP-CODES 流水线 STLS 用户 SASL PLAIN
如果您的回复不包含PLAIN,请停止,因为您需要支持SPA的库
键入:user myusername 要么 键入:user myusername@domain.corp将domain.corp替换为您的域
然后你应该收到 + OK
输入:传递mypass
你应该得到答复 + OK
输入:list
应该获取电子邮件列表。这可能有助于查看您的问题是否是用户名格式问题。
答案 4 :(得分:2)
我这是为了从收件箱中收到电子邮件。如果有电子邮件,我每天早上都要做一个繁琐的工作,所以我写了一些代码来检查我的文件夹中的电子邮件标题。 我添加了一些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");
}
}
}
马特
答案 5 :(得分:1)
如果Exchange Server中未启用POP3,则需要使用 Exchange SDK 。另一种选择是使用 WebDAV 。
答案 6 :(得分:1)
您可以使用此库: http://www.dimastr.com/redemption/
答案 7 :(得分:1)
另一个选项是配置Exchange以启用IMAP4。存在用于.NET的第三方IMAP4库,例如Rebex的。
答案 8 :(得分:1)
您可以从Exchange 2007开始使用EWS(Exchange Web服务)。它们似乎始终安装并且比Webdav更受支持。
您只需从Exchange服务器导入Web服务(在安装目录中搜索asmx文件)。您可以从邮件中下载EML文件并执行更多操作!
答案 9 :(得分:1)
您可以使用Exchange Web Services(Exchange 2007或2010)或WebDav(Exchange直到2007,2010不支持WebDAV),但如果您想要API和实现可能有点麻烦快速发展。
我过去曾成功使用IndependentSoft的WebDav和Exchange Web Services库,它们提供了Exchange API的包装,使用起来更简单。他们也很好地解析了消息和MIME。
答案 10 :(得分:0)
当前首选的API(在Exchange 2013和2016中)为EWS。它纯粹基于HTTP,可以从任何语言访问,但有.Net和Java个特定库。
您可以使用EWSEditor来使用API。
Extended 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或standalone (Exchange) version of MAPI(在扩展支持上,它不支持Unicode PST和MSG文件,无法访问Exchange 2016)。扩展MAPI可用于服务。
您可以使用OutlookSpy或MFCMAPI来使用API。
Outlook Object Model - 不是特定于Exchange的,但它允许访问运行代码的计算机上Outlook中可用的所有数据。不能用于服务。
Exchange Active Sync。 Microsoft不再向此协议投入任何重要资源。
Outlook用于安装CDO 1.21库(它包装了扩展MAPI),但它已被Microsoft弃用,不再接收任何更新。
曾经有一个名为MAPI33的第三方.Net MAPI包装器,但不再开发或支持它。
WebDAV - 已弃用。
Exchange协作数据对象(CDOEX) - 已弃用。
Exchange OLE DB提供程序(EXOLEDB) - 已弃用。