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

无法为Outlook Table添加Sender等7个MailItem属性列的问题

问题描述

运行环境:Windows 11 Pro 64位、MS Office LTSC Pro Plus 2021

尝试构建邮件属性表时,无法为Sender及另外6个邮件属性添加表格列。添加ReceivedTime等属性代码可正常执行,但添加Sender等属性会触发运行时错误。

测试代码

Public Sub TestMail()

' 获取"已删除邮件"文件夹中主题为"Test"的邮件Table对象
' 改编自官方示例代码

' 执行结果:
'   当bAddSender为True时:
'       在oTable.Columns.Add ("Sender")处报错
'       运行时错误 '-2147024809 (80070057)': 属性"Sender"不支持此操作
'       SendUsingAccount、Recipients、Attachments、Saved、Sent、Session属性也会触发相同错误
'   当bAddSender为False时:
'       立即窗口输出: "2009 03 25 07:03:00, test"

Dim sFolder As String, sFilter As String, _
    oMSOutlook As NameSpace, oFolder As Outlook.Folder, oTable As Outlook.Table, oRow As Outlook.Row, _
    bAddSender As Boolean

sFilter = "[Subject] = ""Test"""
bAddSender = False

Set oMSOutlook = Application.GetNamespace("MAPI")
Set oFolder = oMSOutlook.GetDefaultFolder(olFolderDeletedItems)

Set oTable = oFolder.GetTable(sFilter)
oTable.Columns.Add ("ReceivedTime")
If bAddSender Then
    oTable.Columns.Add ("Sender")
End If

Set oRow = oTable.GetNextRow
Debug.Print (oRow("ReceivedTime") & ", " & oRow("Subject"))

End Sub     ' TestMail()

错误信息

Run-time error '-2147024809 (80070057)': The property "Sender" does not support this operation .

补充说明

  • 无法添加的7个属性:Sender、SendUsingAccount、Recipients、Attachments、Saved、Sent、Session,均属于MailItem属性列表。
  • 测试发现可添加未在该列表中的From列,且功能正常,但不清楚上述7个属性无法添加的原因。

问题原因与解决方案

核心原因

Outlook的Table对象仅支持添加可直接从文件夹存储读取的原生简单属性,你尝试的7个属性分为两类,均不满足Table的添加要求:

  1. 复杂对象类型属性:Sender、SendUsingAccount、Recipients、Attachments、Session返回的是复杂对象(如AddressEntry、Account集合),而非文本、日期这类简单数据类型,Table无法直接解析这类对象。
  2. 状态/计算型属性:Saved、Sent属于邮件的状态属性,这类属性需要加载完整的MailItem实例才能获取,无法通过Table的快速查询接口直接读取。

替代方案

方案1:使用Table原生支持的等效属性

对于发件人信息,直接使用Table支持的From属性,它返回发件人显示名称,能满足多数场景需求。

方案2:加载完整MailItem对象获取目标属性

如果必须获取那7个属性的详细数据,可通过Table中的EntryID定位并加载完整的MailItem对象,再读取属性值,示例代码如下:

Public Sub TestMailWithFullItem()
    Dim sFilter As String, oMSOutlook As NameSpace, oFolder As Outlook.Folder
    Dim oTable As Outlook.Table, oRow As Outlook.Row, oMail As Outlook.MailItem
    
    sFilter = "[Subject] = ""Test"""
    Set oMSOutlook = Application.GetNamespace("MAPI")
    Set oFolder = oMSOutlook.GetDefaultFolder(olFolderDeletedItems)
    Set oTable = oFolder.GetTable(sFilter)
    
    ' 添加必要的属性列,包括EntryID用于定位邮件
    oTable.Columns.Add ("ReceivedTime")
    oTable.Columns.Add ("EntryID")
    
    Set oRow = oTable.GetNextRow
    Do Until oRow Is Nothing
        ' 通过EntryID加载完整的MailItem对象
        Set oMail = oMSOutlook.GetItemFromID(oRow("EntryID"))
        
        ' 读取目标属性并输出
        Debug.Print "时间: " & oRow("ReceivedTime") & ", 主题: " & oRow("Subject")
        Debug.Print "发件人名称: " & oMail.Sender.Name & ", 发送账户: " & oMail.SendUsingAccount.DisplayName
        Debug.Print "是否保存: " & oMail.Saved & ", 是否已发送: " & oMail.Sent & vbNewLine
        
        Set oRow = oTable.GetNextRow
        Set oMail = Nothing
    Loop
End Sub

注意:此方式需逐个加载邮件对象,邮件数量较多时性能会低于直接使用Table,建议按需使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:22:20