通过 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,这将扫描目标文件夹的所有子文件夹。然后我们可以将此过滤器应用于两个主要的知名文件夹 Inbox
和 SentItems
一旦有了要索引的文件夹列表,就可以使用自己的代码从该文件夹中检索所有邮件。
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
}
我目前想将所有电子邮件(无论它们在哪个文件夹中)下载到我的 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,这将扫描目标文件夹的所有子文件夹。然后我们可以将此过滤器应用于两个主要的知名文件夹 Inbox
和 SentItems
一旦有了要索引的文件夹列表,就可以使用自己的代码从该文件夹中检索所有邮件。
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
}