Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: MaVo am 25.04.07 - 13:13:50

Titel: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: MaVo am 25.04.07 - 13:13:50
Hallo zusammen,

als Administrator stehe ich vor folgender Herausforderung und hoffe hier eine Lösung zu bekommen.

Um den SPAM Mails Herr zu werden, sollen Benutzer die nicht erkannten SPAM Mails in einen Ordner -SPAM in ihrer Mailbox bzw. die vom Spamfilter falsch erkannten SPAM Mails in den Ordner -HAM verschieben.

Nachts soll ein Agent den Inhalt der Ordner in eine SPAM Box verschieben bzw. in eine HAM Box kopieren.

Diesen Agent habe ich bereits fertig programmiert, nur weiß ich jetzt nicht ob ich ihn zentral aus einer Mailbox starten oder über den Design Task in alle Mailboxen anlegen und dort starten soll.  :-:

Was wäre die praktikabelste Möglichkeit?

Vielen Dank
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: eknori am 25.04.07 - 13:29:30
Warum gibst du den Leuten nicht einfach 2 Buttons an die Hand, mit denen sie die Mail entweder als SPAM oder HAM in eine zentrale Datenbank schieben können ( Zugriff : Einlieferer ).
Ob die nun die Mails in einen Ordner packen oder gleich verschieben ist doch egal für die Zielerreichung. Nur dir spart es die Programmierung des Agenten
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: MaVo am 25.04.07 - 13:50:33
Warum gibst du den Leuten nicht einfach 2 Buttons an die Hand, mit denen sie die Mail entweder als SPAM oder HAM in eine zentrale Datenbank schieben können ( Zugriff : Einlieferer ).
Dies hatte ich bereits realisiert, doch beim Starten des Agents gibt es eine Fehlermeldung, wenn eine markierte Mail in der Voransicht geöffnet ist oder die Kollegen markieren ab und zu versehentlich Mails, die sie gar nicht in die Spam-Box verschieben wollten.  :(

Aus diesem Grund soll dies über Ordner realisiert werden, wegen der einfacheren Bedienung.
Zur Realisierung bekam ich die Lösung der  Leipziger Messe  (http://www.esc.de/1064920413/1096018145/1102004637/2004_12_2_1102005029/SpamFix_LeipzigerMesse.pdf")auf den Schreibtisch.
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: umi am 25.04.07 - 14:25:33
Der Einfachheit halber würde ich den Agent zentral starten.

- Änderungen am Agent sind sofort wirksam
- Benutzer können den Agent nicht "versehentlich" startetn/Manipulieren
- Es laufen nicht gleichzeitig X Agenten los
- Je nach Anzahl Mailboxen könnte die Laufzeit des Agents noch zu beachten sein.


Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: MaVo am 26.04.07 - 10:11:45
Vielen Dank Urs für den Tipp.

Während des Programmierens stoße ich auf eine "Herausforderung" (hab wenig Erfahrung in  LotusScript Programmierung).

Welches Verfahren ist besser geeignet über LS auf alle Mailboxen (Benutzer- wie auch Mail-IN-DBs) zu zugreifen?

Auslesen der Mailboxnamen über Adressbuch oder kann ich auch die Verzeichnisse (Mail bzw. MailinDB) und die darin enthaltenen Mailboxen über Funktionen erreichen?
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: koehlerbv am 26.04.07 - 10:33:16
Sicher ist nur das Auslesen des Domino Directorys.

Bernhard
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: MaVo am 26.04.07 - 10:57:49
Sicher ist nur das Auslesen des Domino Directorys.
Vielen Dank Bernhard für den Hinweis.

Werde als Basis den KB-Artikel Sample LotusScript code to change ACL rights for all mail file owners (http://www-1.ibm.com/support/docview.wss?rs=475&context=SSKTWP&context=SSKTMJ&dc=DA490&dc=DA4A10&dc=DB520&dc=DB530&dc=DA4A30&dc=DA480&dc=D700&dc=DB500&dc=DA4A20&dc=DA440&dc=DA460&dc=DA430&dc=DA470&dc=DB550&dc=D600&dc=DA420&dc=DA500&dc=DA410&dc=DB540&dc=DA400&dc=DB510&q1=lotusscript+mailbox+access&uid=swg21228961&loc=en_US&cs=utf-8&lang=en) verwenden und mein Glück in der Programmierung versuchen.
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: MaVo am 21.06.07 - 15:58:42
Ich habe den Agenten wie folgt erstellt....


Dieser Agent wird nach dem Vorschlag von umi ...
Der Einfachheit halber würde ich den Agent zentral starten.
aus einer DB heraus gestartet.

Doch beim Verschieben der Mail (Call doc.CopyToDatabase(spamDb)) aus dem Ordner in die Mailbox bekomme ich folgende Fehlermeldung "Type mismatch".
spamDB ist ausserhalb von Schleife gesetzt.

Egal ob der Agent manuell oder automatisch gestartet wird.

Warum?

Code
Set maildb= session.Getdatabase(servername, databasename(counter))
'Spam-Mails verschieben
Print "Mailbox " & databasename(counter) & " geöffnet!"
Ordner = "-Spam\Spam"
Set view = maildb.GetView(Ordner)
	If view Is Nothing Then
		Print "Fehler: kein Spam-Ordner in Mailbox " & databasename(counter) & " vorhanden!"
		Call agentmailer("Ham-Spam Agent hat Fehler gemeldet! " &"Fehler: kein Spam-Ordner in Mailbox " & databasename(counter) & " vorhanden!")					
	Else
		'Verarbeitung der Mails	
		Print "Spam-Ordner geöffnet!"
		Call view.Refresh
		view.AutoUpdate = False
					
		Set vc = view.AllEntries
					
		If vc.count > 0 Then					
			For intviewcounter = 1 To vc.Count
				Set ve = vc.GetNthEntry(intviewcounter)
				If ve.IsDocument Then
					Set doc = ve.Document
					If Instr(doc.Subject(0), "{Spam?}")=0 And doc.HasItem("SMTPOriginator") Then
						Call doc.CopyToDatabase(spamDb)				
						Print "Spam: " + doc.subject(0) + " --> erfolgreich übertragen"
						End If			
					End If
				Next
						
				Call vc.RemoveAll(True)
			End If

Kann mir bitte ein Programmierer auf die Sprünge helfen. Wie gesagt hab wenig Erfahrung in LS-Programmierung.
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: m3 am 21.06.07 - 16:11:00
Na dann wird spamDb nicht gesetzt sein.
Debugger anwerfen oder Print/MsgBox Statement einbauen und nachschauen.
Und/Oder Code pfosten!

BTW: Du solltest checken, ob "maildb" gesetzt ist, bevor du weiter machst.
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: Driri am 21.06.07 - 16:14:13
Was sagt denn der Debugger an der Stelle ? Sind doc und spamDb sauber ?

Wobei ich eher auf ein Problem mit spamDb tippe. Hast Du geprüft, ob die Datenbank offen ist ?


Noch ein Tipp für die Schleife durch die ViewEntryCollection : Benutz lieber GetFirstEntry vor der Schleife und dann jeweils GetNextEntry innerhalb der Schleife. GetNthEntry zieht mehr Performance.

Also so in etwa :

Set ve = vc.GetFirstEntry

While Not (ve Is Nothing)
   ...
   Set ve = vc.GetNextEntry(ve)
Wend
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: m3 am 21.06.07 - 16:27:00
Also so in etwa :

Set ve = vc.GetFirstEntry

While Not (ve Is Nothing)
   ...
   Set ve = vc.GetNextEntry(ve)
Wend

Dann ersparst Du Dir auch die IF-Abfrage, ob was in der Collection ist.
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: Driri am 21.06.07 - 17:01:13
Stimmt, netter Nebeneffekt  ;)
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: MaVo am 22.06.07 - 10:02:31
Vielen Dank Driri und m3 für Eure Antworten.  :)

Habe den Agenten anhand Euren Tipps verbessert.  :)

Damit Ihr mir besser helfen könnt, habe ich einen größeren Auszug des Codes hier angehängt.

Anmerkung:
Wenn die Zeile "Call doc.CopyToDatabase(spamDb)" auskommentiere läuft der Agent reibungslos durch und schreibt auch die Betreffzeile des verarbeitenden Dokuments raus.

Code
Dim session As New NotesSession
Dim view As NotesView
Dim doc, doc2 As NotesDocument
Dim db As New NotesDatabase( "", "" )	
Dim spamDB, hamDB, maildb As NotesDatabase
Dim databasename () As String
Dim MailFileName, servername, spamFile, Ordner As String	
Dim counter, endcounter, iMailboxNr, iMailInDBNr, iarray, intviewcounter As Integer
Dim vc As NotesViewEntryCollection
Dim ve As NotesViewEntry

Print "Ham-Spam Agent gestartet!"
iMailboxNr = 0
iMailInDBNr = 0
iarray = 0
counter = 1
servername = "<Servername>"

:
:
:



'Spambox öffnen
Set spamDb = New NotesDatabase( "", "" )
spamFile = "mail\MailInDB\SpamBox.nsf"

Call spamDb.Open( servername, spamFile )
If Not spamDB.isOpen Then
	Print "Keine Spam-Mailbox vorhanden! Stop des Agenten!"
	Exit Sub		
End If

'Hambox öffnen
Set hamDb = New NotesDatabase( "", "" )
hamFile = "mail\MailInDB\HamBox.nsf"


Call hamDb.Open( servername, spamFile )
If Not hamDB.isOpen Then
	Print "Keine Ham-Mailbox vorhanden! Stop des Agenten!"
	Exit Sub		
End If
	
' Für jede DB SPAM und HAM verarbeiten
For counter = 1 To iarray
	Set maildb= session.Getdatabase(servername, databasename(counter))
	If maildb.IsOpen Then
		'Spam-Mails verschieben
		Print "Mailbox " & databasename(counter) & " geöffnet!"
		Ordner = "-Spam\Spam"
		Set view = maildb.GetView(Ordner)
		If view Is Nothing Then
			Print "Fehler: kein Spam-Ordner in Mailbox " & databasename(counter) & " vorhanden!"
			Call agentmailer("Ham-Spam Agent hat Fehler gemeldet! " &"Fehler: kein Spam-Ordner in Mailbox " & databasename(counter) & " vorhanden!")					
		Else
			'Verarbeitung der Mails	
			Print "Spam-Ordner geöffnet!"
			Call view.Refresh
			view.AutoUpdate = False
				
			Set vc = view.AllEntries
			
			Set ve = vc.GetFirstEntry
					
			While Not (ve Is Nothing)
				If ve.IsDocument Then
					Set doc = ve.Document
					'wenn Mail nicht als Spam erkannt wurde und aus dem Internet kommt, dann ...
					If Instr(doc.Subject(0), "{Spam?}")=0 And doc.HasItem("SMTPOriginator") Then
						Call doc.CopyToDatabase(spamDb)				
						Print "Spam: " + doc.subject(0) + " --> erfolgreich übertragen"
					End If			
				End If
				Set ve = vc.GetNextEntry(ve)
			Wend
				
			Call vc.RemoveAll(True)
			
			view.AutoUpdate = True
			
			Print "Spam-Mails in Mailbox " &databasename(counter) &" verarbeitet!"	
		:
		:
		End If
	End If
Next
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: Driri am 22.06.07 - 10:05:02
Zitat
Dim spamDB, hamDB, maildb As NotesDatabase

Damit werden spamDB und hamDB erstmal als Variant deklariert. Korrekt wäre :

Dim spamDB As NotesDatabase, hamDB As NotesDatabase, maildb As NotesDatabase
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: MaVo am 22.06.07 - 10:43:12
VIELEN Dank Driri. Genau daran lag´s.  :D

Müsste ich dann auch vor jeder Variablendeklaration den Typ definieren?

z.B. diese Zeile
Code
Dim MailFileName, servername, spamFile, Ordner As String

durch diese
Code
Dim MailFileName As String, servername As String, spamFile As String, Ordner As String

ersetzen?
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: MadMetzger am 22.06.07 - 10:49:53
Alternativ kannst du auch jede Variable in einer eigenen Zeile definieren. Finde ich persönlich übersichtlicher.
Titel: Re: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen
Beitrag von: MaVo am 22.06.07 - 11:32:46
Alternativ kannst du auch jede Variable in einer eigenen Zeile definieren. Finde ich persönlich übersichtlicher.
Finde ich auch  :)

Danke MadMetzger für den Tipp.