2017-04-14 83 views
1

我试图获取用户在通讯组列表(包含〜200人)中的详细信息。Outlook - 通讯组列表成员详细信息

当我创建一封新邮件时,添加此DL作为唯一收件人并运行下面的宏,它返回〜15个第一个结果,然后出现“Outlook试图从Microsoft Exchange服务器检索数据”有一段时间我收到“操作失败”错误。

如果我继续执行代码,则会返回下一个〜15值并重新出现此问题。像这样的接口有一些Exchange反垃圾邮件限制。

Sub GetDetails(olMail As MailItem) 

    Dim i As Integer, j As Integer 
    For i = 1 To olMail.Recipients.Count ' count = 1 
     If olMail.Recipients.Item(i).AddressEntry.GetExchangeUser Is Nothing Then 
      For j = 1 To olMail.Recipients.Item(i).AddressEntry.Members.Count ' count ~= 200 
       Debug.Print olMail.Recipients.Item(i).AddressEntry.Members.Item(j).GetExchangeUser.FirstName 
      Next j 
     End If 
    Next i 
End Sub 

但是,如果我展开通讯组列表(使用“+”图标),并运行稍加修改代码,为所有用户结果没有问题,(只服用几秒钟)返回。

Sub GetDetails(olMail As MailItem) 

    Dim i As Integer 
    For i = 1 To olMail.Recipients.Count ' count ~= 200 
     If Not olMail.Recipients.Item(i).AddressEntry.GetExchangeUser Is Nothing Then 
      Debug.Print olMail.Recipients.Item(i).AddressEntry.GetExchangeUser.FirstName 
     End If 
    Next i 
End Sub 

任何想法?

+0

有发行版列表不是ExchangeUser上的人?你的第二个片段说明了这一点,但它看起来像第一个没有(它处理'Recipients.Item(1)',但*不*单个收件人')。 (这只是一个黑暗中的镜头,我没有任何其他想法) –

+0

所有是交换用户。问题是我不知道如何通过单个收件人遍历它们。 –

+0

一个想法是将呼叫添加到WinAPI睡眠功能100或200毫秒。你得到的错误看起来像是一个冲突/超时类型的事情,你可能会在每次迭代时停留一小段时间。 –

回答

1

您需要立即在代码中释放Outlook COM对象。如果您的加载项尝试枚举存储在Microsoft Exchange Server上的集合中的超过256个Outlook项目,这一点尤其重要。如果您没有及时释放这些物品,您可以达到Exchange对任何时候打开的物品的最大数量施加的限制。完成后,只需将变量设置为Nothing即可释放对该对象的引用。

+0

问题发生在几次迭代(〜10)之后。释放对象 '昏暗Ø 集合O = olMail.Recipients.Item(I).AddressEntry.Members.Item(J) Debug.Print o.GetExchangeUser.FirstName 集合O = Nothing' 没有帮助。 –

+1

我在单行代码中看到很多点。所以,我建议打破属性和方法调用链,并在单独一行中声明它们(每个属性或方法在一行代码中)。因此,您将能够及时发布它们。 –

+0

它可能是需要释放的'Members'对象,而不是'Item'对象... –

0

根据尤金的反馈更新(工作)代码:

Sub GetDetails(olMail As MailItem) 
    Dim oRecipients As Recipients 
    Dim oRecipient As Recipient 
    Dim oMembers As AddressEntries 
    Dim oMember As AddressEntry 
    Dim i As Integer, j As Integer, dRecCnt As Integer, dMemCnt As Integer 

    Set oRecipients = olMail.Recipients 

    dRecCnt = oRecipients.Count 
    For i = 1 To dRecCnt 
     Set oRecipient = oRecipients.Item(i) 

     If oRecipient.AddressEntry.GetExchangeUser Is Nothing Then 
      Set oMembers = oRecipient.AddressEntry.Members 

      dMemCnt = oMembers.Count 
      For j = 1 To dMemCnt 
       Set oMember = oMembers.Item(j) 

       Debug.Print c & ": " & oMember.GetExchangeUser.FirstName 

       Set oMember = Nothing 
      Next j 

      Set oMembers = Nothing 
     End If 

     Set oRecipient = Nothing 
    Next i 

    Set oRecipients = Nothing 
End Sub