You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VSTO开发:从Outlook已发送邮件2中获取发送日期异常

问题:获取Outlook指定「已发送邮件」文件夹的发送日期数据

我需要从Outlook的已发送邮件中获取「发送日期(Sent Date)」,参照微软官方文档修改代码后无报错,但无法获取目标文件夹的数据。

当前代码实现:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    outlookNameSpace = this.Application.GetNamespace("MAPI");
    inbox = outlookNameSpace.GetDefaultFolder(
        Microsoft.Office.Interop.Outlook
        .OlDefaultFolders.olFolderSentMail);

    items = inbox.Items;
    items.ItemAdd +=
        new Outlook.ItemsEvents_ItemAddEventHandler(items_ItemAdd);
}

更新说明:
程序无任何报错,但测试发现当前代码获取的是「已发送邮件1」的数据,而我需要获取「已发送邮件2」的数据(存在两个已发送邮件文件夹:已发送邮件1、已发送邮件2)


解决方案

GetDefaultFolder(OlDefaultFolders.olFolderSentMail)仅会返回Outlook预设的默认已发送邮件文件夹(即「已发送邮件1」)。要获取非默认的「已发送邮件2」,需要遍历邮箱的文件夹结构定位目标文件夹,具体实现如下:

修改后代码

private Outlook.NameSpace outlookNameSpace;
private Outlook.Items items;

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    outlookNameSpace = this.Application.GetNamespace("MAPI");
    // 获取当前邮箱的根文件夹
    Outlook.Folder rootFolder = outlookNameSpace.Session.DefaultStore.GetRootFolder() as Outlook.Folder;
    // 查找目标文件夹「已发送邮件2」
    Outlook.Folder targetSentFolder = FindFolder(rootFolder, "已发送邮件2") as Outlook.Folder;

    if (targetSentFolder != null)
    {
        items = targetSentFolder.Items;
        items.ItemAdd += Items_ItemAdd;
    }
}

// 递归遍历文件夹,匹配目标名称
private Outlook.Folder FindFolder(Outlook.Folder parentFolder, string targetFolderName)
{
    Outlook.Folder foundFolder = null;
    foreach (Outlook.Folder subFolder in parentFolder.Folders)
    {
        if (subFolder.Name.Equals(targetFolderName, StringComparison.OrdinalIgnoreCase))
        {
            foundFolder = subFolder;
            break;
        }
        // 递归查找子文件夹
        foundFolder = FindFolder(subFolder, targetFolderName);
        if (foundFolder != null) break;
    }
    return foundFolder;
}

private void Items_ItemAdd(object Item)
{
    if (Item is Outlook.MailItem mailItem)
    {
        // 获取发送日期
        DateTime sentDate = mailItem.SentOn;
        // 后续处理逻辑示例
        Console.WriteLine($"邮件发送日期:{sentDate}");
    }
}

关键说明

  1. 默认文件夹限制:GetDefaultFolder只能访问Outlook内置的默认文件夹,无法直接获取自定义或额外创建的文件夹
  2. 文件夹遍历逻辑:通过递归方法FindFolder遍历整个邮箱文件夹树,使用不区分大小写的匹配避免名称大小写问题
  3. 发送日期获取:在ItemAdd事件中,判断Item为MailItem后,通过SentOn属性直接获取发送日期

内容的提问来源于stack exchange,提问作者gabrielcassimiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:54:28