LotusScript代理发送HTML邮件报错:对象变量未设置
LotusScript代理发送多封邮件报错的解决方案
问题根源
你的代码把邮件文档(maildoc)、MIME实体(body)和流(stream)都放在循环外初始化,第一次发送邮件后这些对象的状态已经失效,导致第二次循环报错:
- 第一次循环结束时调用了
stream.Close(),第二次循环无法再向已关闭的流写入内容 - 已发送的
maildoc对应的MIME实体(body)已经绑定到已发送文档,无法再次设置内容 ns.ConvertMIME在第一次循环后恢复为True,第二次创建MIME时未重新关闭转换,可能干扰MIME结构生成
修复后的代码
Sub Initialize Dim ns As New NotesSession Dim db As NotesDatabase Dim docs As NotesDocumentCollection Dim doc As NotesDocument Dim body As NotesMIMEEntity Dim maildoc As NotesDocument Dim stream As NotesStream Dim formula As String Dim header As String Dim body2 As String Set db = ns.CurrentDatabase header = "Test Agent" body2 = "Test Agent" formula = "(Form = ""frm-testdevelop-solicitud"" ) & (Estado = ""Borrador"" )" Set docs = db.Search(formula, Nothing, 0) If docs.Count > 0 Then Print "hay " + Cstr(docs.Count) + " docs" Set doc = docs.GetFirstDocument While Not doc Is Nothing ' 每次循环创建全新的邮件文档、流和MIME实体 Set maildoc = db.CreateDocument Set stream = ns.CreateStream() ns.ConvertMIME = False ' 创建MIME前关闭自动转换 ' 配置邮件基础信息 maildoc.Form = "Memo" maildoc.Subject = "Test Agent" maildoc.SendTo = "Email Destination" maildoc.CopyTo = "" maildoc.BlindCopyTo = "" ' 创建MIME实体 Set body = maildoc.CreateMIMEEntity ' 写入HTML内容到流 Call stream.WriteText(|<html lang="es">|) Call stream.WriteText(|<head>|) Call stream.WriteText(|<meta name="viewport" content="width=device-width, initial-scale=1.0">|) Call stream.WriteText(|<meta http-equiv="X-UA-Compatible" content="ie=edge">|) Call stream.WriteText(|</head>|) Call stream.WriteText(|<body>|) Call stream.WriteText(|<div style="background-color: #897d7d; border-radius: 0.5em; width: auto; height: 50px;"> <h1 style="color: white; text-align: center; padding: 0.1em; font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;">| & header & |</h1> </div>|) Call stream.WriteText(|<p>| & body2 & |</p>|) Call stream.WriteText(|</body>|) Call stream.WriteText(|</html>|) Call stream.Position = 0 ' 重置流指针到开头,确保完整读取内容 ' 绑定MIME内容到邮件 Call body.SetContentFromText(stream, {text/html;charset="utf-8"}, ENC_NONE) ' 关闭流 Call stream.Close() ' 恢复MIME自动转换 ns.ConvertMIME = True ' 发送邮件 Call maildoc.Send(False) ' 释放当前循环的对象,避免内存泄漏 Set maildoc = Nothing Set body = Nothing Set stream = Nothing ' 处理下一个文档 Set doc = docs.GetNextDocument(doc) Wend Else Print "No hay documentos" End If End Sub
关键改动说明
- 将
maildoc、stream、body的创建逻辑移到循环内部,保证每封邮件都使用独立的全新对象 - 每次循环开始时重新设置
ns.ConvertMIME = False,避免MIME转换干扰邮件结构 - 添加
stream.Position = 0:写入HTML后将流指针移到开头,确保SetContentFromText能读取完整的HTML内容 - 移除了未使用的
NotesUIWorkspace和NotesMIMEHeader对象,精简代码 - 循环结束后显式释放对象,减少内存占用
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

