读取Outlook邮件RTFBody报"not implemented"错误如何提前检测?
Outlook VBA 检测MailItem.RTFBody可用性的解决方案
问题根因
你之前尝试的所有检测方法都会触发错误,原因是访问oMail.RTFBody这个动作本身就会在属性不可用的场景下直接抛出"not implemented"运行时错误,不等校验逻辑执行。
方案1:使用错误捕获机制(实现最简单,兼容性最好)
利用VBA的错误捕获能力,捕捉访问RTFBody时的异常,即可判断属性是否可用:
Sub CreateTempTaskFromMail() Dim oMail As Outlook.MailItem Set oMail = ActiveInspector.CurrentItem Dim s As String s = oMail.Subject Dim oTask As Outlook.TaskItem Set oTask = CreateTaskWithTempFolder(s, False) ' 自定义创建任务的函数 ' 检测RTFBody是否可用 Dim rtfContent As Variant On Error Resume Next ' 开启错误捕获,遇到错误继续执行 rtfContent = oMail.RTFBody If Err.Number = 0 Then ' 无错误,属性可用 oTask.RTFBody = rtfContent Else ' 属性不可用,可添加降级逻辑,比如赋值纯文本正文 oTask.Body = oMail.Body End If On Error GoTo 0 ' 恢复默认错误处理逻辑 End Sub
方案2:使用PropertyAccessor预检测(无错误跳转实现)
RTFBody属性底层对应MAPI标准属性PR_RTF_COMPRESSED,可以通过PropertyAccessor直接检测该属性是否存在,不需要访问RTFBody本身,不会触发对应错误:
Sub CreateTempTaskFromMail() Dim oMail As Outlook.MailItem Set oMail = ActiveInspector.CurrentItem Dim s As String s = oMail.Subject Dim oTask As Outlook.TaskItem Set oTask = CreateTaskWithTempFolder(s, False) ' 自定义创建任务的函数 Const PR_RTF_COMPRESSED As String = "http://schemas.microsoft.com/mapi/proptag/0x10090102" Dim propAcc As Outlook.PropertyAccessor Set propAcc = oMail.PropertyAccessor Dim rtfExist As Boolean On Error Resume Next ' 尝试获取MAPI属性值,不会触发RTFBody的not implemented错误 Call propAcc.GetProperty(PR_RTF_COMPRESSED) rtfExist = (Err.Number = 0) On Error GoTo 0 If rtfExist Then oTask.RTFBody = oMail.RTFBody Else ' 降级逻辑 oTask.Body = oMail.Body End If End Sub
补充说明
如果需要保留格式,RTFBody不可用时也可以读取oMail.HTMLBody属性,再转换为RTF格式赋值给任务。
内容的提问来源于stack exchange,提问作者Volker
相关产品推荐
相关产品推荐

