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

C# 如何获取Outlook共享邮箱的已发送邮件文件夹对象

获取Outlook共享邮箱已发送邮件文件夹实现

问题点

直接调用会话级的GetDefaultFolder接口仅能返回主账户原生的已发送邮件文件夹,无法拿到关联共享邮箱下的对应文件夹,原调用代码如下:

(Interop.Folder)m_outlook.Application.Session.GetDefaultFolder(Interop.OlDefaultFolders.olFolderSentMail);

原调用方式失效的核心原因:Session.GetDefaultFolder默认仅绑定主邮箱的存储对象,不会主动枚举其他挂载的共享存储下的默认文件夹。

正确实现方式

根据共享邮箱的挂载方式不同,有两种稳定实现方案:

方案1:遍历账户存储获取(适配手动添加的共享邮箱账户)

如果共享邮箱是在Outlook账户设置中手动添加、存在独立账户条目的场景,直接遍历会话下所有账户的投递存储,排除主邮箱后,从对应存储取已发送文件夹即可,示例代码:

using Outlook = Microsoft.Office.Interop.Outlook;
using System.Diagnostics;

List<Outlook.Folder> GetAllSharedSentFolders(Outlook.Application outlookApp, string mainMailSmtp)
{
    List<Outlook.Folder> result = new List<Outlook.Folder>();
    Outlook.NameSpace session = outlookApp.Session;
    foreach (Outlook.Account account in session.Accounts)
    {
        // 跳过主邮箱账户
        if (string.Equals(account.SmtpAddress, mainMailSmtp, StringComparison.OrdinalIgnoreCase))
            continue;
        try
        {
            Outlook.Store store = account.DeliveryStore;
            if (store == null || store.ExchangeStoreType == Outlook.OlExchangeStoreType.olExchangePublicFolder)
                continue;
            Outlook.Folder sentFolder = store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
            if (sentFolder != null)
                result.Add(sentFolder);
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"获取账户{account.SmtpAddress}已发送文件夹失败: {ex.Message}");
        }
    }
    return result;
}

方案2:通过SMTP地址解析共享收件人获取(适配自动映射的共享邮箱)

如果共享邮箱是通过Exchange自动映射挂载、不会出现在Accounts集合中的场景,先通过共享邮箱的SMTP地址解析出有权限访问的收件人对象,再获取对应存储下的已发送文件夹,示例代码:

using Outlook = Microsoft.Office.Interop.Outlook;
using System.Diagnostics;

List<Outlook.Folder> GetSharedSentFoldersBySmtp(Outlook.Application outlookApp, List<string> sharedMailSmtpList)
{
    List<Outlook.Folder> result = new List<Outlook.Folder>();
    Outlook.NameSpace session = outlookApp.Session;
    foreach (string smtp in sharedMailSmtpList)
    {
        Outlook.Recipient recipient = session.CreateRecipient(smtp);
        // 必须先解析地址,确认地址有效且当前账号有权限访问
        if (!recipient.Resolve() || recipient.AddressEntry == null)
            continue;
        try
        {
            Outlook.Folder sentFolder = session.GetSharedDefaultFolder(recipient, Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
            if (sentFolder != null)
                result.Add(sentFolder);
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"获取共享邮箱{smtp}已发送文件夹失败: {ex.Message}");
        }
    }
    return result;
}

注意事项

  • 调用前确保当前账号对目标共享邮箱拥有文件夹读取权限,否则会抛出COM访问拒绝异常
  • 不建议长期持有GetSharedDefaultFolder返回的文件夹对象缓存,Outlook缓存过期后可能出现权限异常,每次使用前重新获取稳定性更高
  • 若共享邮箱配置了Exchange端"已发送邮件留存到共享邮箱"策略,上述方法获取到的文件夹就是共享邮箱外发邮件的实际存储位置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:33:19