Das Notes Forum

HCL Notes / Domino / Diverses => Entwicklung => Thema gestartet von: schroederk am 18.03.20 - 14:06:57

Titel: Agent zum Ändern vom SendTo Feld?
Beitrag von: schroederk am 18.03.20 - 14:06:57
Hallo,

wir haben vor Kurzem unsere Maildomain geändert. Die alte Adresse haben wir als Alias hinzugefügt, damit die Mails and die alte Adresse noch ankommen.
Jedesmal wenn ein Mitarbeiter eine Mail bekommt, die noch an die alte Adresse gesendet wurde und er antwortet  an alle, dann erscheint seine alte Adresse im Kopie-An-Feld.
Die meisten passen nicht auf und erhalten dann ihre Antwort nochmal an sich selber zugestellt.
Die anderen nervt es auch, immer manuell den Empfänger aus der Kopie zu entfernen.

Ich hatte als Lösung gedacht, übergangsweise einen Agenten in die Schablone zu setzen, der nach Eingang einer Mail, prüft, ob an die alte Domain gesendet wurde und dann die alte Domain durch die neue Domain ersetzt.

In meinem Test wird der Agent zwar brav aufgerufen, nur scheint er nichts zu machen. Im Protokoll steht, dass er x Dokumente bearbeitet hat, aber geändert hat sich nichts.

Könnt ihr mal darüberschauen, was ich (mal wieder) falsch gemacht habe?

Nebenbei: wo ist eigentlich im 11er Client die Konsole hin, über die man im Agent mit Print Debug-Ausgaben erzeugen konnte?

Hier das Script:

Code
	Dim session As New NotesSession
	Dim doccol As NotesDocumentCollection
	Dim newemail As NotesDocument
	Dim sendto As String
	Dim newsendto As String
	Dim formula As String

	Set doccol = session.currentdatabase.unprocesseddocuments	
	Set newemail = doccol.getfirstdocument
	While Not (newemail Is Nothing)
		'sendto = CStr(newemail.GetItemValue("SendTo")(0))
		sendto = newemail.SendTo
		newemail.~_ViewIcon = 159
		Print "*** pruefe: " & sendto
		If (InStr(sendto, "@altedomain") > 0) Then
			formula = |@ReplaceSubstring("| & sendto & |" ; "@altedomain" ; "@neuedomain")|
			newsendto = Evaluate(formula)
			Call newemail.Replaceitemvalue("SendTo", newsendto)
			Call newemail.Save(True, False)
			Print "*** gefunden! Ersetze!"
		End If
		Set newemail = doccol.getnextdocument(newemail)
	Wend
	doccol.Updateall
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: JayDee am 18.03.20 - 14:28:35
Mit welchen Rechten  / welchem Signer läuft denn der Agent?

Die Konsole ist zu den "Verpassten Alarmen" (Glockensymbol) gewandert
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: schroederk am 18.03.20 - 14:43:34
Der Signer ist aktuell auch der Eigentümer der Datenbank und hat aktuell Managerrechte.

Ich hab Ausgaben von einem anderen Agent unter dem Glockensymbol und dort unter Status gefunden.
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: Tode am 18.03.20 - 16:16:07
Eine Ausgabe eines Agenten "Nach Eingang neuer Mail" findest Du aber nicht am Client, sondern nur in der Server- Console.
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: jBubbleBoy am 18.03.20 - 16:39:21
Code
sendto = newemail.SendTo
diese Zeile ist fehlerhaft und führt zu einem Abbruch des Agenten
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: Peter Klett am 18.03.20 - 17:17:23
Du musst dann auch beachten, dass SendTo ein Mehrfachwert sein kann.

sendto und newsendto dürfen kein String sein, sondern Variant, und die Überprüfung, ob die alte Domäne enthalten ist, musst Du je Element vornehmen. Die alte Domäne könnte ja z.B.auch im zweiten Element stehen

EDIT: Ach ja, und copyto und blindcopyto müsstest Du auch noch berücksichtigen.

Also ehrlich, ich würde den Zirkus nicht machen. Wenn die nicht dran denken, den Empfänger rauszunehmen, bekommen die eben selbst eine Mail, ja und? Entf F9 weg is. Und beim dritten Mal werden sie wohl dran denken ...
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: schroederk am 20.03.20 - 07:13:14
Vielen Dank für die Hinweise.
Ich bin schonmal einen Schritt weiter, aber würde jetzt doch nochmal eure Unterstützung gebrauchen können.

Das script bricht jetzt an der Formel ab: Error 221 invalid formuila.
Die angewendete Formel sieht so aus:
Code
(@ReplaceSubstring(""max mustermann" <max.mustermann@altedomain>" ; "@altedomain" ; "@neuedomain"))

Ich bin mir recht sicher, dass das an den im zu dursuchenden String enthaltenen Anführungsstrichen liegt.
Habt ihr eine Idee, wie damit umgehen könnte?
Vorher ersetzen (z.B. durch ein Sternchen) und danach wieder zurück?

Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: Peter Klett am 20.03.20 - 07:26:25
Code
(@ReplaceSubstring(""max mustermann" <max.mustermann@altedomain>" ; "@altedomain" ; "@neuedomain"))

Du willst doch bestimmt nicht den zusammengebauten String ersetzen, wenn Du den kennst, kannst Du ihn doch auch gleich richtig setzen. Aber vielleicht verstehe ich es auch nicht wirklich, was Du da machst ;). Du könntest es mit einfachen Anführungszeichen probieren

Code
(@ReplaceSubstring('"max mustermann" <max.mustermann@altedomain>' ; "@altedomain" ; "@neuedomain"))

Was Du aber wohl wirklich brauchst, ist ein

Code
(@ReplaceSubstring(SendTo ; "@altedomain" ; "@neuedomain"))
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: schroederk am 20.03.20 - 09:29:28
Naja, ich will, dass bei jeder eingehende Mail geprüft wird, ob die alte Domain bei den Empfängern vorkommt und wenn ja, dann durch die neue Domain ersetzen. Damit die lieben Kollegen, 2 Sekunden Zeit sparen und nicht mehr beim Antworten die Kopie an die alte Domain entfernen müssen.

Das Script sieht aktuell wie folgt aus (die Schleife, mit der ich vorher jeden einzelnen Empfänger geprüft habe, habe ich aktuell auskommentiert)
Das Script wirft aktuell einen Fehler auf der Console: *** CheckRecipientOldDomain: Error occured  0:  in line  0. Agent stopped.

Code
	Dim session As New NotesSession
	Dim doccol As NotesDocumentCollection
	Dim newemail As NotesDocument
	Dim newsendto() As String
	Dim formula As String
	Dim i As Integer

	On Error GoTo HandleError
	
	Set doccol = session.currentdatabase.unprocesseddocuments	' hole alle neuen eMails
	Set newemail = doccol.getfirstdocument						' fange beim ersten Document an
	While Not (newemail Is Nothing)
		Print "*** Test ***"
		Print "*** CheckRecipientOldDomain Subject=" & CStr(newemail.Getitemvalue("Subject")(0))
'		Erase newsendto
'		i = 0
'		ForAll xsendto In newemail.SendTo
'			ReDim Preserve newsendto(i)
'			Print "*** untersuche: " & xsendto
'			If (InStr(xsendto, "@altedomain") > 0) Then			' Wenn Adresse noch alte Domain beinhaltet, dann
'				Print "*** gefunden!! " 
'				formula = |@ReplaceSubstring("| & xsendto & |" ; "@altedomain" ; "@neuedomain")|
'				xsendto = Evaluate(formula)
'				Print "**** geändert auf " & xsendto
'			End If
'			newsendto(i) = xsendto
'			i = i + 1
'		End ForAll
'		Call newemail.Replaceitemvalue("SendTo", newsendto)	' setze korrigerte Empfängerliste
		formula = |@ReplaceSubstring(newemail.SendTo ; "@altedomain" ; "@neuedomain" )|
		Evaluate(formula)
		Call newemail.Save(True, False)
		Set newemail = doccol.getnextdocument(newemail)
	Wend
	doccol.Updateall
	
HandleError:
	Print "*** CheckRecipientOldDomain: Error occured " &  Str(Err) & ": " & Error$ & " in line " & Str(Erl) & ". Agent stopped."
	Exit Sub
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: Peter Klett am 20.03.20 - 09:59:53
Mal aus dem Bauch unter Beibehaltung Deiner Scriptteile, ohne Anspruch auf Fehlerfreiheit
Code
	Dim session As New NotesSession
	Dim doccol As NotesDocumentCollection
	Dim newemail As NotesDocument
 	Dim newsendto As Variant

	On Error GoTo HandleError
	
	Set doccol = session.currentdatabase.unprocesseddocuments	' hole alle neuen eMails
	Set newemail = doccol.getfirstdocument						' fange beim ersten Document an
	While Not (newemail Is Nothing)
		Print "*** Test ***"
		Print "*** CheckRecipientOldDomain Subject=" & CStr(newemail.Getitemvalue("Subject")(0))
		If Instr (Join (newemail.SendTo, ":"), "@altedomain") > 0 Then
			newsendto = Evaluate (|@ReplaceSubstring(SendTo ; "@altedomain" ; "@neuedomain")|, newemail)
			Call newemail.Replaceitemvalue("SendTo", newsendto)	' setze korrigerte Empfängerliste
			Call newemail.Save(True, False)
		End If
		Set newemail = doccol.getnextdocument(newemail)
	Wend
	doccol.Updateall
	
HandleError:
	Print "*** CheckRecipientOldDomain: Error occured " &  Str(Err) & ": " & Error$ & " in line " & Str(Erl) & ". Agent stopped."
	Exit Sub
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: Tode am 20.03.20 - 10:19:34
Und was ist mit CopyTo?
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: Peter Klett am 20.03.20 - 10:24:30
Und was ist mit CopyTo?
Das hatte ich schon in #5 erwähnt, kann man dann ja analog erweitern
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: schroederk am 20.03.20 - 13:09:19
Ich hab den Code von Dir auch probiert, aber der wirft in der Console leider auch den Fehler:
*** CheckRecipientOldDomain: Error occured  0:  in line  0. Agent stopped.

Ich bin gerade etwas ratlos  :-\
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: maxritti am 20.03.20 - 13:37:09
Was ist denn die letzte Ausgabe von dem Agenten?
Nur die Fehlermeldung?

Peter hatte da ja zwei Debug-Prints drin...
Die kannst Du ja erweitern um genau die Zeile zu finden, wo der Fehler passiert.
Oder aber er legt erst gar nicht richtig los mit line 0.

Code
Print "*** Test ***"
Print "*** CheckRecipientOldDomain Subject=" & CStr(newemail.Getitemvalue("Subject")(0))
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: schroederk am 20.03.20 - 14:21:42
Die Print-Ausgaben erscheinen:

20.03.2020 12:53:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** Test ***
20.03.2020 12:53:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain Subject=Antwort: AW: Antwort: Migration - Rechteproblem auf Verzeichnis
20.03.2020 12:53:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** Test ***
20.03.2020 12:53:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain Subject=Test 18
20.03.2020 12:53:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain: Error occured  0:  in line  0. Agent stopped.

...

20.03.2020 12:55:57   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** Test ***
20.03.2020 12:55:57   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain Subject=Automatische Antwort: Antwort: Antwort: AW: Antwort: Migration - Rechteproblem auf Verzeichnis
20.03.2020 12:55:57   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain: Error occured  0:  in line  0. Agent stopped.


Ich habe die Print-Ausgaben erweitert und sowohl direkt in der IF- als auch nach dem Speichern eine Ausgabe erzeugt.

Hier die Augabe, bei  Mails, bei denen keine alte Domain gefunden wird.

20.03.2020 14:14:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** Test ***
20.03.2020 14:14:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain Subject=UPS: Refused a self-test; UPS is overloaded.
20.03.2020 14:14:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** Test ***
20.03.2020 14:14:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain Subject=UPS: Started a self-test.
20.03.2020 14:14:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** Test ***
20.03.2020 14:14:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain Subject=UPS: Passed a self-test.
20.03.2020 14:14:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain: Error occured  0:  in line  0. Agent stopped.

Und hier, bei einer Mail an die alte Domain (Subject = Test 19):

20.03.2020 14:16:59   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** Test ***
20.03.2020 14:16:59   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain Subject=Test 19
20.03.2020 14:16:59   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** Test ***
20.03.2020 14:16:59   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain Subject=Einladung zu virtuellen Veranstaltungen: live & on-demand, flexibel, planbar und sicher
20.03.2020 14:16:59   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** Test ***
20.03.2020 14:16:59   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain Subject=IT-Ticket: 11174  => Anforderung erledigt
20.03.2020 14:16:59   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain: Error occured  0:  in line  0. Agent stopped.

aktueller Code:

Code
	While Not (newemail Is Nothing)
		Print "*** Test ***"
		Print "*** CheckRecipientOldDomain Subject=" & CStr(newemail.Getitemvalue("Subject")(0))
		If InStr (Join (newemail.SendTo, ":"), "@altedomain") > 0 Then
			Print "*** alte Domain gefunden --> ersetze"
			newsendto = Evaluate (|@ReplaceSubstring(SendTo ; "@altedomain" ; "@neuedomain")|, newemail)
			Call newemail.Replaceitemvalue("SendTo", newsendto)	' setze korrigerte Empfängerliste
			Call newemail.Save(True, False)
			Print "*** gespeichert"
		End If
		Set newemail = doccol.getnextdocument(newemail)
	Wend

Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: schroederk am 20.03.20 - 14:28:36
Da war ich etwas zu schnell, wenn die alte Domain gefunden wird, gehts doch sauber in den IF-Zweig:

20.03.2020 14:25:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** Test ***
20.03.2020 14:25:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain Subject=Test 20
20.03.2020 14:25:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** alte Domain gefunden --> ersetze
20.03.2020 14:25:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** gespeichert
20.03.2020 14:25:54   AMgr: Agent ('CheckRecipientOldDomain' in 'mail\maildb.nsf') printing: *** CheckRecipientOldDomain: Error occured  0:  in line  0. Agent stopped.

Der Fehler bleibt zwar, aber zum ersten Mal wird auch mal ersetzt.  :o
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: Peter Klett am 20.03.20 - 14:55:52
Die Nullen kommen daher, dass es keinen Fehler gibt.

   doccol.Updateall
   Exit Sub

HandleError:
   Print "*** CheckRecipientOldDomain: Error occured " &  Str(Err) & ": " & Error$ & " in line " & Str(Erl) & ". Agent stopped."
   Exit Sub


HandleError: ist ja nur eine Sprungmarke, da springt das Script hin, wenn ein Fehler auftaucht. Ist kein Fehler da, läuft der natürlich am Ende auch da rein, wenn er nicht gestoppt wird. Setz mal das Exit Sub davor
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: Peter Klett am 20.03.20 - 15:00:53
Und jetzt dann noch CopyTo und BlindCopyTo ;)
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: maxritti am 20.03.20 - 15:16:29
Die Nullen kommen daher, dass es keinen Fehler gibt.

   doccol.Updateall
   Exit Sub

HandleError:
   Print "*** CheckRecipientOldDomain: Error occured " &  Str(Err) & ": " & Error$ & " in line " & Str(Erl) & ". Agent stopped."
   Exit Sub


HandleError: ist ja nur eine Sprungmarke, da springt das Script hin, wenn ein Fehler auftaucht. Ist kein Fehler da, läuft der natürlich am Ende auch da rein, wenn er nicht gestoppt wird. Setz mal das Exit Sub davor

Na klasse. Da hast Du natürlich recht.
Ist gar nicht aufgefallen in der Hektik.  ;)
Titel: Re: Agent zum Ändern vom SendTo Feld?
Beitrag von: schroederk am 23.03.20 - 08:00:22
Herzlichen Dank Peter, das hab ich auch komplett übersehen. Dann baue ich jetzt noch das für CopyTo und BlindCopyTo ein und dann nochmal gründlich testen.
Auszurechnen, wie oft die lieben Kollegen jetzt ihre 2 Sekunden sparen müssen, damit sich dieser Aufwand gelohnt hat, wage ich nicht  ;D