Notes.NotesSession与Domino.NotesSession密码提示

时间:2015-09-03 17:49:56

标签: vb.net visual-studio-2010 lotus-notes

对我对引用/ COM / dll的理解不足表示道歉。

我有一个没有 Option Strict 的VB.Net应用程序。它使用下面的代码发送莲花电子邮件。

Dim s As Object = CreateObject("Notes.Notessession")
Dim db As Object = s.GetDatabase("", "")
Call db.openmail()
doc = db.CreateDocument
doc.ReplaceItemValue("SendTo", "someEmail@someEmailSpot.com")
doc.ReplaceItemValue("Subject", "Some subject text")
doc.ReplaceItemValue("Body", "Some body text")
Call doc.Send(False)

当我使用 Option Strict 重新创建代码

Dim db As Object = s.GetDataBase("", "")

行在 s.GetDataBase 下有一个后期绑定错误,我不知道如何解决。我找不到添加到我的项目的引用,以便我可以将它转换为Notes.Notessession。

我可以使用以下引用 - “ Lotus Domino Objects Interop.Domino.dll - 编写以下代码。

Dim session As New Domino.NotesSession
session.Initialize()
Dim dir As Domino.NotesDbDirectory = session.GetDbDirectory("")
dir.OpenMailDatabase()
Dim db As Domino.NotesDatabase = dir.OpenMailDatabase
Dim doc As Domino.NotesDocument = db.CreateDocument
doc.ReplaceItemValue("SendTo", "someEmail@someEmailSpot.com")
doc.ReplaceItemValue("Subject", "Some subject text")
doc.ReplaceItemValue("Body", "Some body text")
doc.Send(False)

问题是,似乎Domino.NotesSession要求我提供Notes.NotesSession没有的密码,无论是初始化中的参数还是未传递密码时创建的提示,如上面的代码。

我的问题是:

  1. 有没有办法让Domino.NotesSession对象初始化而不需要密码,就像Notes.NotesSession对象一样?

  2. 在运行时引用什么来创建Notes.NotesSession对象,以及如何在设计时添加此引用?

  3. 是否有视图可以查看运行时后期绑定的对象类型? 据推测,在第一个代码块中, s 被绑定到Notes.Notessession,但是在watch中查看它或使用TypeOf只返回一个通用的“_ComObject”。

2 个答案:

答案 0 :(得分:3)

Notes.NotesSession是Notes客户端的OLE对象的根。 Domino.NotesSession是Notes / Domino数据的COM对象的根。

仅当Notes客户端已在运行时,OLE对象才能避免密码提示。如果它没有运行,调用OLE对象将启动客户端并提示输入密码。大多数人都避免使用OLE对象,除非他们实际上将使用它们来驱动Notes UI,这是通过Notes.NotesUIWorkspace和各种其他NotesUI类完成的。

由于Domino.NotesSession是COM,它独立于客户端运行,但它仍然使用随客户端一起安装的Notes API。 Notes的安全设置(文件 - 安全 - 用户安全 - 安全基础)中有一个复选框,标记为“不提示输入其他基于Notes的程序的密码”。如果选中该框,则在Notes客户端已在运行时调用COM类时将无法获得密码提示。基本上,这使您在使用OLE类时处于平等地位。但请注意:在该复选框项目的描述旁边,在括号中,它表示“(降低安全性)”。很多人确实选择启用此设置,但您确实需要注意它确实可能会打开一个漏洞,通过该漏洞,不可靠的代码可以使用用户的凭据访问Notes数据库信息。

关于为什么你在IDE中看到/没有看到引用,我们只是说它始终是不一致的并且保留它。我不能给你任何押韵或理由。也就是说,最好不要看到Notes.NotesSession引用,因为只要他们看到两者,它就会让人感到困惑。大多数人应该使用COM类。

答案 1 :(得分:1)

不确定这会直接回答您的问题,希望它有用:

对于Notes 6.5(至少),任何客户都可以通过代码发送邮件(不需要开发人员许可证。)如果您没有安装客户端,则下面的代码将无效。并且 - 如果您没有当前登录的会话,我认为您可以避免提供密码。

下面是我测试代码中最干净的发送工具。一个技巧是某些属性(如地址)更喜欢数组而不是简单的字符串。

Option Explicit On
Imports Domino ' ref to Interop.Domino.dll
Public Class frmLotousNotes
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim notesSession As Object, notesDatabase As Object, notesDocument As Object
        Dim aTo(0) As String
        Try
            'Instantiate Lotus Notes COM's objects.
            notesSession = CreateObject("Notes.NotesSession")
            notesDatabase = notesSession.GETDATABASE("", "")
            'Make sure Lotus Notes is open and available.
            If notesDatabase.IsOpen = False Then notesDatabase.OPENMAIL()
            'Create the document for the e-mail.
            notesDocument = notesDatabase.CreateDocument
            'Add data to the mainproperties of the e-mail's document.
            aTo(0) = txtTo.Text ' note array needed for some properties
            With notesDocument
                .Form = "Memo"
                .SendTo = aTo
                .Subject = txtSubject.Text & ": " & Now()
                .Body = txtMsg.Text
                .SaveMessageOnSend = True
            End With
            'Send the e-mail.
            With notesDocument
                .PostedDate = Now()
                .send(0, aTo)
            End With
            MsgBox("sent")
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            'Release objects from memory.
            notesDocument = Nothing
            notesDatabase = Nothing
            notesSession = Nothing
        End Try
    End Sub

End Class