You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:20:29