通过EWS下载所有电子邮件

时间:2015-02-23 09:33:41

标签: c# exchangewebservices

我目前想要将所有电子邮件(无论它们位于哪个文件夹中)下载到我的SQL Server数据库。

现在,虽然我知道如何搜索电子邮件或订阅流媒体通知,但我还没有学习如何将所有邮件从EWS同步到我的数据库。

var emailMessages = GetItems<MSEmailMessage>(WellKnownFolderName.MsgFolderRoot);
foreach (var emailMessage in emailMessages)
{
    Debug.WriteLine(emailMessage.Subject);
}

private IList<T> GetItems<T>(WellKnownFolderName wellKnownFolderName) where T : Item
{
    IList<T> result = new List<T>();

    Folder folder = Folder.Bind(_exchangeService, wellKnownFolderName);
    if (folder.TotalCount > 0)
    {
        ItemView view = new ItemView(folder.TotalCount);
        FindItemsResults<Item> items = _exchangeService.FindItems(wellKnownFolderName, view);
        foreach (var resultItem in items.OfType<T>())
        {
            result.Add(resultItem);
        }
    }

    return result;
}

这会返回0封电子邮件(在初始化新folder.TotalCount之前,它甚至在检查ItemView之前引发了异常...)。

检查WellKnownFolderName.Inbox时会收到来自收件箱的电子邮件,但它不允许我查询子文件夹以同步整个邮件。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

您可以建立一个文件夹列表来搜索邮件。然后遍历每个文件夹并获取该文件夹中的所有电子邮件。

在下面的代码段中,我们可以创建一个folderSearchFilterFolderTraversal设置为深,它将扫描目标文件夹的所有子文件夹。然后,我们可以将此过滤器应用于两个主要的知名文件夹InboxSentItems

获得要编制索引的文件夹列表后,您可以使用自己的代码从该文件夹中检索所有邮件。

var view = new FolderView(int.MaxValue)
{
    PropertySet = new PropertySet(BasePropertySet.FirstClassProperties) { FolderSchema.DisplayName }
};
SearchFilter foldersearchFilter = new SearchFilter.IsGreaterThan(FolderSchema.TotalCount, 0);
view.Traversal = FolderTraversal.Deep;
List<Folder> searchFolders;
try
{
    searchFolders = new List<Folder>
            {
                Folder.Bind(ExchangeService, WellKnownFolderName.Inbox),
                Folder.Bind(ExchangeService, WellKnownFolderName.SentItems)
            };
}
catch (ServiceResponseException e) {}

searchFolders.AddRange(ExchangeService.FindFolders(WellKnownFolderName.Inbox, foldersearchFilter, view).Folders);
searchFolders.AddRange(ExchangeService.FindFolders(WellKnownFolderName.SentItems, foldersearchFilter, view).Folders);

var results = new List<Item>();
foreach (var searchFolder in searchFolders)
{
    //Get all emails in this folder
}

答案 1 :(得分:0)

是的,根文件夹中可能包含0条消息。当您在文件夹中执行FindItems时,结果不会从子文件夹冒泡。如果你想要收到他们的消息,你需要迭代每个文件夹。