我目前想要将所有电子邮件(无论它们位于哪个文件夹中)下载到我的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时会收到来自收件箱的电子邮件,但它不允许我查询子文件夹以同步整个邮件。
我错过了什么?
答案 0 :(得分:1)
您可以建立一个文件夹列表来搜索邮件。然后遍历每个文件夹并获取该文件夹中的所有电子邮件。
在下面的代码段中,我们可以创建一个folderSearchFilter
,FolderTraversal
设置为深,它将扫描目标文件夹的所有子文件夹。然后,我们可以将此过滤器应用于两个主要的知名文件夹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
}
答案 1 :(得分:0)
是的,根文件夹中可能包含0条消息。当您在文件夹中执行FindItems时,结果不会从子文件夹冒泡。如果你想要收到他们的消息,你需要迭代每个文件夹。