Outlook 2010 – 奇怪的item.Attachments错误

我有下面的代码,应该保存附加到电子邮件的特定的Excel文件。 代码与规则相结合,当接收到具有特定主题的电子邮件时触发该脚本。

代码被触发,但是最近看到的最奇怪的错误是:itm.Attachments.Count显示为零,显然这个文件没有保存! 但是…如果我在“For each …”行上放置一个断点,并添加itm.Attachments.Count来观察窗口,则显示为零。 如果我只添加itm,然后浏览到附件属性,然后到计数属性它显示为1计数(因为它应该)和代码执行正常。 我花了半天的时间去了解发生了什么事情,但我无法弄清楚。

行为在Windows 7 x64上的Outlook 2010 x64和Windows 7 x86上的Outlook 2010 x86上都是相同的。 在“信任中心”中启用macros。 我附上了代码和规则设置的一些屏幕截图,还有一个显示手表窗口奇怪的电影。

这个脚本是在一段时间之前build立的,在几台电脑上运行得很好,它基于以下步骤:iterrors.com/outlook-automatically-save-an-outlook-attachment-to-disk/。 有任何想法吗?

规则屏幕在这里
1分钟。 电影在这里

Public Sub Kona(itm As Outlook.MailItem) Dim objAtt As Outlook.Attachment Dim saveFolder As String saveFolder = "C:\test" For Each objAtt In itm.Attachments If InStr(objAtt.DisplayName, "Kona Preferred Fixed Price Matrix (ALL)") Then objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName End If Set objAtt = Nothing Next End Sub 

如果您在Outlook中configuration了IMAP帐户:您的“离线设置”可能设置为仅在本地磁盘上存储长达1个月,3个月,12个月的电子邮件。

如果您的磁盘上有足够的空间,并希望在本地caching更多电子邮件,则可以按照以下方式设置同步滑块:文件 – >帐户设置 – >帐户设置… – >双击您的IMAP帐户。

尝试增加Outlook中的脱机存储。 有关详细信息,请参阅Outlook 2013中的清空收件箱和其他IMAP同步问题 。

我最好的理解这种行为是微软的Outlook(至less我testing的2010版本)有一个错误。 可能还有其他因素,我不知道对此作出贡献,但是我能够在Windows Vista上使用不同的Service Pack级别/版本的Outlook 2010重现错误。 Office 2013似乎不受影响。

我设法创build了一个解决方法。

我发现通过在debugging模式下通过代码逐步显示消息

 objMailItem.GetInspector.Activate 

随后正确检测到附件的数量(不必做一些奇怪的事情,比如为对象variables设置监视,然后在IDE中单击它)。

但是,这只能通过代码,而不是正常执行期间。

由于这个原因,我怀疑这个消息在正常的代码执行过程中可能不会显示足够长的时间来让Outlook从内裤中扭出来。 我推断可能会插入一个延迟,为此留出足够的时间。

我尝试了几种插入延迟的方法。 这是为我工作的那个。 我创build了一个表单

 frmTimer 

并添加了免费软件RSTimer OCX控件( http://www.softpedia.com/get/Programming/Components-Libraries/RS-Timer.shtml )。

我设定了

 Interval 

OCX属性为1000毫秒。

显示这样的消息之后,表单被加载:

 objMailItem.GetInspector.Activate frmTimer.Show ' <-- form is loaded and displayed (it is not sufficient to just 'load' it) objMailItem.Close OlInspectorClose.olDiscard 

该表单有一个单一的事件处理程序:

 Private Sub RSTimer1_Timer() Unload frmTimer End Sub 

当事件触发时,表单将被卸载并继续执行代码

 objMailItem.GetInspector.Activate frmTimer.Show objMailItem.Close OlInspectorClose.olDiscard ' <-- code execution continues here 

这是一个完整的function,可以正确检测附件。

 Function EmailHasAttachments(ByVal objMailItem As Outlook.MailItem) As Boolean On Error GoTo ErrHandler objMailItem.GetInspector.Activate frmTimer.Show objMailItem.Close OlInspectorClose.olDiscard If objMailItem.Attachments.Count > 0 Then EmailHasAttachments = True Else EmailHasAttachments = False End If ExitHere: Exit Function ErrHandler: Debug.Print Err.Number, Err.Description Select Case Err.Number Case 12345 ' handle the error Case Else MsgBox "An unknown error has occurred." Exit Function End Select End Function