通过 EWS 下载所有电子邮件

Download all email messages via EWS

我目前想将所有电子邮件(无论它们在哪个文件夹中)下载到我的 SQL 服务器数据库。

现在虽然我知道如何搜索电子邮件或订阅流式通知,但我还没有学习如何将所有消息从 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;
}

这 returns 0 封电子邮件(它甚至在初始化新 ItemView 之前检查 folder.TotalCount 之前抛出异常...)。

在检查收件箱中的 WellKnownFolderName.Inbox returns 电子邮件时,它不允许我查询子文件夹以同步所有邮件。

我错过了什么?

对,根文件夹中可能有 0 条消息。当您在文件夹中执行 FindItems 时,结果不会从子文件夹中冒出。如果您想获取他们的消息,您需要遍历每个文件夹。

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

在下面的代码片段中,我们可以创建一个 folderSearchFilter 并将 FolderTraversal 设置为 Deep,这将扫描目标文件夹的所有子文件夹。然后我们可以将此过滤器应用于两个主要的知名文件夹 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
}