对我对引用/ 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没有的密码,无论是初始化中的参数还是未传递密码时创建的提示,如上面的代码。
我的问题是:
有没有办法让Domino.NotesSession对象初始化而不需要密码,就像Notes.NotesSession对象一样?
在运行时引用什么来创建Notes.NotesSession对象,以及如何在设计时添加此引用?
是否有视图可以查看运行时后期绑定的对象类型? 据推测,在第一个代码块中, s 被绑定到Notes.Notessession,但是在watch中查看它或使用TypeOf只返回一个通用的“_ComObject”。
答案 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