无法为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的添加要求:
- 复杂对象类型属性:
Sender、SendUsingAccount、Recipients、Attachments、Session返回的是复杂对象(如AddressEntry、Account集合),而非文本、日期这类简单数据类型,Table无法直接解析这类对象。 - 状态/计算型属性:
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
相关产品推荐
相关产品推荐

