使用C#访问交换电子邮件

时间:2009-05-14 19:39:01

标签: c# .net exchange-server

你知道是否有办法吗?

我使用this library来访问pop3服务器,但它不适用于Exchange服务器。

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

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

11 个答案:

答案 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的WebDavExchange Web Services库,它们提供了Exchange API的包装,使用起来更简单。他们也很好地解析了消息和MIME。

答案 10 :(得分:0)

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

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

  2. 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可用于服务。

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

  3. Outlook Object Model - 不是特定于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) - 已弃用。

相关问题