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

标签 c# .net exchange-server

你知道有没有办法?

我用过 this library访问 pop3 服务器,但它不适用于交换服务器。

您是否知道任何其他库或一段代码可以告诉我如何去做?

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

最佳答案

如果您使用 Exchange 2007 并启用了 Web 服务,这很容易。我在我的 VS2008 项目中添加了一个 2.0 风格的经典 Web Reference,我可以收到这样的邮件消息:

// 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”变量将是从 exchange 返回的 ItemType 对象数组,这些对象具有您期望的邮件消息的所有属性(正文、附件等)。希望对您有所帮助!

关于c# - 在 C# 中访问交换电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/865267/

相关文章:

c# - 为什么在 C# 中不允许这样做?

c# - 如何以编程方式创建 Enterprise Architect 包、类、属性

c# - 如何将英文数字转换为阿拉伯数字,例如 196 转换为١٩٦?

.net - 更改了 .Net 4 中泛型方法的 LdToken 行为?

c# - 与 Exchange 服务器集成

c# - 如何将asmx服务转换为rest以通过URL调用

.net - 有没有办法从表中获取不同的 PartionKeys

php - MS Exchange - 以一个用户身份登录并使用 TLS 从另一个用户发送

exchange-server - 从电子邮件(或数千封电子邮件)中提取数据 [基于交换]

c# - 调用覆盖方法时如何强制执行方法调用(在基类中)?