新邮件到达后UnprocessedDocuments代理异常问题求助
解决方案
一、让代理仅处理新到达的邮件
- 添加文档类型与位置校验
在处理前先确认文档是收件箱中的标准邮件:- 检查文档表单为
Memo(Notes默认邮件表单) - 验证文档在默认收件箱文件夹(内部名称为
($Inbox))
- 检查文档表单为
- 过滤新邮件专属标记
Notes新到达的邮件会携带$MailFlags字段,其中N代表未读/新邮件,通过这个标记可精准筛选目标文档。 - 正确标记已处理文档
取消注释Call session.UpdateProcessedDoc( doc ),并放在doc.save()之后执行——这会告知Notes服务器该文档已被处理,不会再被UnprocessedDocuments集合纳入。
二、提升代理速度,避免用户提前编辑
- 配置代理为高优先级服务器端运行
- 编辑代理属性,选择「Run on server」确保在服务器端执行(而非依赖客户端)
- 在「Basics」标签下将「Priority」设为「High」,让服务器优先调度该代理
- 处理时锁定文档
修改文档前调用doc.Lock(),阻止用户在代理处理过程中编辑文档;操作完成后调用doc.Unlock()释放锁。
修改后的代理代码
Sub Initialize Dim session As New NotesSession Dim db As NotesDatabase Dim collection As NotesDocumentCollection Dim doc As NotesDocument Dim mailFlags As Variant Set db = session.CurrentDatabase Set collection = db.UnprocessedDocuments Set doc = collection.GetFirstDocument() While Not(doc Is Nothing) ' 仅处理收件箱中的标准邮件文档 If doc.Form(0) = "Memo" And doc.IsInFolder("($Inbox)") Then mailFlags = doc.GetItemValue("$MailFlags") ' 筛选带有新邮件标记的文档 If Not Isempty(mailFlags) And Instr(mailFlags(0), "N") > 0 Then ' 锁定文档防止用户编辑 If doc.Lock() Then On Error Resume Next ' 避免锁定失败中断代理 If doc.Hasitem("$REF") Then doc.Subject= "($Ref) " & doc.Subject(0) Else doc.Subject = "(No Ref) " & doc.Subject(0) End If Call doc.save(True,False) ' 标记文档为已处理,避免重复触发 Call session.UpdateProcessedDoc( doc ) ' 释放文档锁 Call doc.Unlock() On Error Goto 0 End If End If End If Set doc = collection.GetNextDocument(doc) Wend End Sub
额外注意事项
- 确保代理的「Run on behalf of」账号拥有邮件数据库的编辑权限,否则无法完成锁定和修改操作
- 若延迟问题仍存在,可联系Notes管理员检查服务器代理调度任务的负载情况,调整相关配置
内容的提问来源于stack exchange,提问作者Mark Maden
相关产品推荐
相关产品推荐

