Below is code to create an automated response whenever someone sends a message to a now obsolete mail file.
It can also be used for a “live” mailbox to indicate something like “We’ve received your message and will respond in 24 hours.”
The only requirements are that the Person document (or mail-in document) must still be present in the directory and a valid name is used in the “Run on Behalf of” field of the agent properties.
Usually this is done for someone who is no longer with the company and so is already in the “Deny Access” groups so using the mailfile owner’s name is often not an option.
It is set up to respond to EVERY message sent to it (unlike the Out of Office Agent) to assure the sender that there message HAS been received.
This particular variation was developed after someone with an autoresponder sent a message to one of our autoresponder mailboxes and ended up with an endless loop. Messages with identical sender and subject will receive only 1 response per day.
Make sure you customize everything in the agent below that has been bolded.
Agent Information
Name: Autoresponder – Ensure Unique
Last Modification: 01/03/2008 04:39:40 PM
Comment: [Not Assigned]
Shared Agent: Yes
Type: LotusScript
State: Disabled
Trigger: Before New Mail Arrives
Acts On: Each incoming mail document
LotusScript Code:
Option Public
Option Declare
‘This autoresponder will protect against responses from *other* autoresponders by
‘checking to see if we’ve already received a message from them with the same subject already that day.
‘see the “IsMessageUnique” logic for details
‘Also checks for $AssistMail field which indicates that the message was sent by some
‘automated process. This comes from the case where someone sent a message FROM
‘this inbox TO this inbox and started an endless loop.
‘Note also that there is a name in the “Run on Behalf of” field on the security tab.
‘If this field is populated it *must* be represented in the ACL (At least Reader, probably author is safer) or you
‘will get weird errors when the agent runs.
Sub Initialize
Dim sess As New NotesSession
Dim docNotify As NotesDocument
Dim docCur As NotesDocument
Dim sPrintText As String
Dim sMessage As String
Dim sSendTo As String
On Error Goto ErrGeneral
On Error 4294 Goto ErrBadAddress
Set docCur = sess.DocumentContext
If Not docCur Is Nothing Then
If Not Lcase$(docCur.Form(0)) = “nondelivery report” Then ‘Don’t bother for failed delivery reports
‘Only internet messages
‘ If docCur.hasitem(“SMTPOriginator”) Or docCur.hasitem(“MIME_Version”) Or docCur.hasitem(“$MIMETrack”) Then
If Not docCur.HasItem(“$AssistMail”) Then ‘isn’t sent by another agent
If IsMessageUnique(docCur) Then
Gosub ResponseMessage
End If
End If
‘ End If
End If
End If
LeaveSub:
Exit Sub
ResponseMessage:
Gosub SetupMessage
Set docNotify = sess.CurrentDatabase.CreateDocument
docNotify.SaveMessageOnSend = False
docNotify.Form = “Memo”
If Not docCur.ReplyTo(0)=”” Then
sSendTo = docCur.ReplyTo(0)
Else
sSendTo = docCur.From(0)
End If
docNotify.SendTo = sSendTo
‘Do not need the following fields since this is to be signed by the database owner.
‘if we ever change the signer to “Automail” then these should be set up properly
‘ docNotify.Principal=
‘ docNotify.ReplyTo=
docNotify.Subject = “re: ” & docCur.subject(0)
docNotify.Body = sMessage
Call docNotify.Send(False)
docCur.EFXResponded= Now
Call docCur.Save(True,False)
Return
SetupMessage:
sMessage= “This is no longer a valid email address for John Doe. ” &_
“If you would like you may contact him at john.doe@gmail.com, phone – 555-555-5555.“& Chr$(13) & Chr$(13)
Return
ErrBadAddress:
Resume LeaveSub
ErrGeneral:
sPrintText= “Error: ” + Cstr(Err) + ” defn: ” + Error$ + “. Aborting Agent”
Call ProblemNotify(sPrintText)
Resume LeaveSub
End Sub
Function IsMessageUnique(docCur As NotesDocument) As Boolean
‘Check to see if document is the only one with this sender and subject. If so return True
‘Otherwise, return false. We expect that multiple messages in a day from the same source with the same subject are probably
‘automated responses.
‘We only look at the most recent day’s worth of documents, if this doc is for a new day, great,
‘or if no match is found for the current day, also great
Dim sess As New notessession
Dim viewInbox As NotesView
Dim docChk As NotesDocument
Dim docComp As notesdocument
Dim bAscending As Boolean
Dim datRcvd As Notesdatetime
Dim datDoc As NotesDateTime
Dim datComp As NotesDateTime
IsMessageUnique=True
Set viewInbox =sess.CurrentDatabase.GetView(“($Inbox)”)
If viewInbox Is Nothing Then ‘Returns false
IsMessageUnique=False
Exit Function
End If
Set docChk = viewInbox.GetFirstDocument
Set datDoc = New NotesDateTime(docChk.Created)
Set docComp= viewInbox.GetLastDocument
Set datComp = New NotesDateTime(doccomp.Created)
If datDoc.TimeDifference(datComp) > 0 Then ‘First Document is older than last document, sorted in Descending order
bAscending = False
Else
bAscending = True
End If
Set datRcvd = New NotesDateTime(docCur.Created) ‘get created date from newly received document
Call datRcvd.SetAnyTime
If bAscending Then
Set docChk = viewInbox.GetLastDocument
Else
Set docChk = viewInbox.GetFirstDocument
End If
While Not docChk Is Nothing
Set datDoc = New NotesDateTime(docChk.Created)
Call datDoc.SetAnyTime
If Not datDoc.TimeDifference(datRcvd) = 0 Then ‘not sent on same date – either new day or have reached previous day
IsMessageUnique=True
Exit Function
End If
If docChk.From(0) = docCur.From(0) Then ‘Match, might not be not unique, check subject.
If docChk.Subject(0) = docCur.Subject(0) Then ‘Match, definitely not unique, end now.
IsMessageUnique=False
Exit Function
End If
End If
If viewInbox Is Nothing Then ‘Returns false
IsMessageUnique=False
Exit Function
End If
If bAscending Then
Set docChk = viewInbox.GetPrevDocument(docChk)
Else
Set docChk = viewInbox.GetNextDocument(docChk)
End If
Wend
End Function
Sub ProblemNotify(sPrintText As String)
Dim sess As New NotesSession
Dim db As NotesDatabase
Dim docProblem As NotesDocument
Dim item As NotesItem
If sess.isonserver Then ‘send an e-mail or print to Log
Set db = sess.currentdatabase
Set docProblem = db.CreateDocument
Set Item = docProblem.ReplaceItemValue(“Form”,”Memo”)
Set Item = docProblem.ReplaceItemValue(“SendTo”,”Your Default Notification Mailbox“)
Set Item = docProblem.ReplaceItemValue(“Principal”,sess.currentagent.name & ” Agent”)
Set Item = docProblem.ReplaceItemValue(“Subject”,”Error: ” & db.Title & ” DB – ” & sess.currentagent.name & ” Agent”)
Set Item = docProblem.ReplaceItemValue(“Body”,”On ” & db.server & “!!” &db.filepath & Chr$(13) & Chr$(13) & sPrintText)
Call docProblem.Send(False)
Else
Print sPrintText
Messagebox sPrintText,0,”Problem with ” & sess.currentagent.name & ” Agent”
End If
End Sub
Powered by ScribeFire.
good script
Hello,
Again I got impressed by you. thanks for the cool script
Very nice script – thank you! I wish it had a built-in HTML capability :))
Marc,
I know this was posted several years ago but can you give me some pointers on how to adapt this to forward specific items that are being recorded in a journaling DB? I need to move emails that are being journaled from the journal DB to another DB. My lotusscript is a little rusty.
Thanks.
@Matt – Matt, you’ll want to take a whole different approach on this item. Depending how time sensitive your need is and how much incoming mail you are dealing with you may be better off with a simple timed agent that reviews all new items in the journal database and then forward (or just insert) those that meet the criteria to your other DB.
Basically you’ll want to get a handle to the inbox folder (as a view) and then walk through all items in it. Either you should move the scanned items out of the inbox or you should mark them (add a field like “InspectedByAgent=”agentName””) and you can skip those ones on subsequent runs. Since your inbox will be sorted such that new items will be first, the first such tagged item you find will let you know you’re done.
Also, depending upon the fidelity required in the target database you can decide how much information you need to copy over there. You can essentially create a clone of the current message and insert it into the target database or you can route it there (send) depending on your agent’s access to that DB (same server/domain, etc or a remote location). You can also just include the relevant field(s), maybe subject and body only and you don’t need the “routeservers” or other metadata.
Unfortunately there are too many variables to just tell you what to do but hopefully the above can help. Everything I’ve described above is dead simple standard LotusScript so the language help and online forums can give you the examples you’ll need to bring yourself back up to snuff for this task.
Mark, thanks for creating and sharing this script. I especially like the anti-looping piece.