Vba Outlook-通讯组列表成员详细信息

Vba Outlook-通讯组列表成员详细信息,vba,outlook,exchange-server,Vba,Outlook,Exchange Server,我试图在一个包含约200人的通讯组列表中获取用户的详细信息 当我创建新电子邮件时,将此DL添加为唯一的收件人并运行下面的宏,它首先返回约15个结果,然后Outlook尝试从Microsoft Exchange server托盘检索数据。出现消息,一段时间后,我收到操作失败错误 如果我继续执行代码,将返回接下来的15个值,并且此问题再次出现。好像有一些Exchange反垃圾邮件限制 Sub GetDetails(olMail As MailItem) Dim i As Integer,

我试图在一个包含约200人的通讯组列表中获取用户的详细信息

当我创建新电子邮件时,将此DL添加为唯一的收件人并运行下面的宏,它首先返回约15个结果,然后Outlook尝试从Microsoft Exchange server托盘检索数据。出现消息,一段时间后,我收到操作失败错误

如果我继续执行代码,将返回接下来的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

有什么想法吗?

您需要在代码中立即释放Outlook COM对象。如果外接程序试图枚举存储在Microsoft Exchange服务器上的集合中超过256个Outlook项目,这一点尤为重要。如果您不及时释放这些对象,您可以达到Exchange对任何时间打开的最大项目数施加的限制。完成后,只需将变量设置为Nothing即可释放对对象的引用。

根据Eugene的反馈更新了工作代码:

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

发行版列表上是否有人不是ExchangeUser?您的第二个代码段说明了这一点,但第一个代码段似乎没有。它处理Recipients.Item1,但不处理单个收件人。这只是一个偶然的机会,我没有任何其他想法,因为所有的用户都是exchange用户。问题是,我不知道如何像通过单个收件人一样对它们进行迭代。一种想法是添加对WinAPI睡眠函数的调用100或200毫秒。您得到的错误看起来像是冲突/超时之类的东西,您可以在每次迭代时稍加停顿来避免。即使使用1-1.5秒也可以尝试。问题仍然存在。扩展列表第二种方法在~3秒内返回所有电子邮件的数据。似乎第一种方法查询Exchange服务器,而第二种方法在本地查询所有数据。问题在几次迭代~10后出现。释放对象Dim o Set o=olMail.Recipients.Itemi.AddressEntry.Members.Itemj Debug.Print o.GetExchangeUser.FirstName Set o=Nothing没有任何帮助。我在一行代码中看到很多点。因此,我建议打破属性和方法调用的链条,并在单独的一行中声明它们,每行代码中的每个属性或方法。因此,您将能够及时发布它们。我同意,但这并不能解决问题。似乎AddressEntry是在本地解析的,AddressEntry。服务器上的成员遇到了一些大型DLL的限制。即使是这段代码也会导致问题:对于j=1到20,Set m=olMail.Recipients.Itemi.AddressEntry.Members Set m=Nothing下一行代码中仍然有很多点。尽量避开它们。