【问题标题】:Lotus Notes and VBA Checking Email Address in Public Address BooksLotus Notes 和 VBA 检查公共通讯簿中的电子邮件地址
【发布时间】:2015-01-06 22:21:46
【问题描述】:

我试图弄清楚如何使用 VBA 检查电子邮件地址是否在公共通讯簿中。我在网上找到了一些代码,对其进行了修改,但代码在“Set doc = view.GetAllDocumentsByKey(ChkEmailAddr)”行给出了错误 91。我认为问题与变量“view”的声明类型或“Set view = b.GetView("People\By Internet Mail") 行中的视图类型有关。”

我很确定我已经激活了所有正确的引用。选择“Lotus Notes Domino 对象”和“Lotus Notes 自动化类”。

我试图获取视图列表,但我不知道该怎么做。您是否在我的代码中看到错误或对我可以尝试进行一些故障排除有什么想法?

  Sub CheckEmailAddress()

 Dim books As Variant
 Dim view As lotus.NotesView
 'Dim view As Object
 Dim doc As NotesDocumentCollection
 Dim dc As NotesDocument
 Dim done As Variant
 Dim docarr(3, 50) As Variant
 Dim ChkEmailAddr As String

 ChkEmailAddr = "user@example.com"     

 Set Session = CreateObject("Notes.Notessession")

 books = Session.AddressBooks
 done = False

 For Each b In books
   ' check every public address book,
   ' unless we're already done
   If (b.IsPublicAddressBook) Then
   Debug.Print TypeName(b)

     Call b.Open("", "")
     Debug.Print b.Title
     ' look up person's last name
     ' in People view of address book


     Set view = b.GetView("People\By Internet Mail")
     Debug.Print TypeName(view)
     'Debug.Print view
     'Set view = b.GetView("main")
     'Debug.Print TypeName(view)
     Set doc = view.GetAllDocumentsByKey(ChkEmailAddr)
     ' if person is found, display the phone number item
     'from the Person document
     If Not (doc Is Nothing) Then

        For j = 0 To doc.Count
            docarr(0, j) = doc.GetNthDocument(j).Items(11).Text
             docarr(1, j) = doc.GetNthDocument(j).Items(93).Text
            docarr(2, j) = doc.GetNthDocument(j).Items(95).Text
            docarr(3, j) = doc.GetNthDocument(j).Items(14).Text
        Next j
     End If
   End If
Next b
 findEmailLotus = docarr

结束子

【问题讨论】:

标签: vba lotus-notes


【解决方案1】:

我很抱歉这么说,但是您有很多 问题。编写您开始的代码的人不知道他或她在做什么。

首先,除非您要求在代码运行时运行 Notes 客户端,否则您应该使用 Lotus.NotesSession 而不是 Notes.NotesSession。 (前者对应“Lotus Notes Domino Objects”,使用COM与Notes API对话,后者对应“Lotus Notes Automation Classes,使用OLE与Notes客户端对话”——因此要求客户端必须运行。)

其次,您没有提到您正在处理的 Lotus Notes 版本,但最近的版本(8 及更高版本)包括 NotesDirectory 类,其中包括一个可能是更好的解决方案的 LoookupNames 方法比编写自己的代码来循环浏览地址簿。

第三,在完成set view 操作之后,您真的应该进行If Not view is Nothing 测试。这将告诉您打开视图是否真的有问题。

第四,doc 对于来自GetAllDocumentsByKey 的返回值来说是一个非常糟糕的变量名。在 20 多年编写 Notes 代码的过程中,我可以说任何阅读 Notes 代码的人都希望变量名 doc 始终引用单个文档。您收到的是NotesDocumentCollection,而不是单个文档。帮自己一个忙,将其更改为 docsdc,或除 doc 之外的任何其他内容。

第五,在这种情况下通常不建议使用GetNthDocument。它在大型集合中表现非常糟糕。然而,更糟糕的是,您调用了四次,而每次迭代只能调用一次。而不是For 循环,考虑将其更改为对GetFirstDocument 的调用,然后是While Not doc is Nothing 循环,该循环检索您的项目值并将它们存储在您的数组中,然后在循环底部调用getNextDocument

第六,引用.Items(11).Items(93)...的代码完全是错误的。任何给定文档中的可用项目都是可变的,因为 Notes 是无模式的。这些项目编号将针对不同的人引用不同的字段 - 即,本质上是随机值。这不可能是你想要的。您应该使用 getFirstItem() 调用以及您真正想要放入数组中的项目的实际名称。您需要研究 Domino 目录中使用的字段名称才能弄清楚这一点。我推荐 NotesPeek 作为探索 Notes 数据库和/或仅在 Domino Designer 客户端中打开 Domino 目录并查看 Person 表单(和关联的子表单)以找出您需要的好工具。

至于您询问的实际错误,我的猜测是通过添加If Not view Is Nothing 的推荐测试您将获得更多信息,但可能还不够。你没有提到你的调试打印正在生成什么,但我相信在某些情况下,即使数据库没有成功打开,标题也是可用的,所以我认为你不应该相信它作为测试是否调用工作。事实上,你真的不应该只是打一个Call db.open("","") 电话。你应该做一个If db.open("","") = true 来测试它是否真的有效。

【讨论】:

  • 仔细想想,NotesDirectory 类和 LookupNames 方法可能不会通过 COM 接口公开,因此无论 Notes 版本是什么,它都可能不是 VBA 的选项。我不确定。
  • 您的第五点(GetNthDocument 的效率)是他最不担心的。 :-) 我想起了 Tom Christiansen 的建议:“正确性、可维护性和效率,并按此顺序排列。因为如果您不在乎代码是否正确,我可以让它更有效率!”
  • @RichardSchwartz 嗨,Richard,我很抱歉在这里发布此消息,但我正试图与您联系,因为您是 Lotus 的专家并且对它有深入的了解。我在创建 Lotus.NotesSession 时遇到问题。我发布了一个问题来解释我的问题,但基本上 Lotus Domino 对象在 VBA 64 位上不起作用。有没有办法让它工作?谢谢
  • 根据此 IBM 技术说明 (www-01.ibm.com/support/docview.wss?uid=swg21454291),64 位环境不支持 Lotus Notes/Domino 对象类。也就是说,32 位应用程序可以在 64 位环境中调用它们并且(大部分)工作,但您可能必须手动注册 nlsxbe.dll,因为安装程序(在某些版本中,无论如何)没有这样做。然而,据我所知,64 位 VBA 可能无法调用这些类。您或许可以改用 Domino 访问服务。
  • 这里是 Domino 访问服务的链接。请注意,您需要在服务器上启用它,它不像类那样功能齐全,但它确实提供了许多功能。 www-10.lotus.com/ldd/ddwiki.nsf/…
【解决方案2】:

对于知道莲花音符的人来说,这是微不足道的。对于那些不这样做的人,可能有更简单的方法使用网络访问。

请求这个地址 保留您的 cookie

http://server/names.nsf?login&username=MYUSERNAM&password=MYPASSWORD

然后访问这个 url 并查找 404 状态或 200 状态

http://server/names.nsf/($Users)/email@domain.com?opendocument

当然,这要求您在服务器上启用 Web 访问,并且在许多情况下将密码放入您的代码是不好的,如果您的服务器以某些方式进行配置,它将无法正常工作。

在编码之前,在您的服务器上进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多