Autor Thema: Zentraler oder dezentrale Agent(en) fürs Einsammeln von Mails aus Mailboxen  (Gelesen 3304 mal)

Offline MaVo

  • @Notes Preisträger
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 544
  • Geschlecht: Männlich
  • Geht nicht - gibt´s nicht
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
« Letzte Änderung: 22.06.07 - 11:30:57 von MaVo »
Gruß
Martin

"The man with a new idea is a Crank until the idea succeeds." - Mark Twain

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
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
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline MaVo

  • @Notes Preisträger
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 544
  • Geschlecht: Männlich
  • Geht nicht - gibt´s nicht
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 auf den Schreibtisch.
Gruß
Martin

"The man with a new idea is a Crank until the idea succeeds." - Mark Twain

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
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.


Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline MaVo

  • @Notes Preisträger
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 544
  • Geschlecht: Männlich
  • Geht nicht - gibt´s nicht
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?
Gruß
Martin

"The man with a new idea is a Crank until the idea succeeds." - Mark Twain

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Sicher ist nur das Auslesen des Domino Directorys.

Bernhard

Offline MaVo

  • @Notes Preisträger
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 544
  • Geschlecht: Männlich
  • Geht nicht - gibt´s nicht
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 verwenden und mein Glück in der Programmierung versuchen.
Gruß
Martin

"The man with a new idea is a Crank until the idea succeeds." - Mark Twain

Offline MaVo

  • @Notes Preisträger
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 544
  • Geschlecht: Männlich
  • Geht nicht - gibt´s nicht
Ich habe den Agenten wie folgt erstellt....

  • Anzahl aller Mailboxen (Benutzer wie Mail-in-DB) aus dem Domino Adressbuch ermitteln
  • Daraus Array-Größe festlegen
  • Abspeichern aller Mailboxendateinamen (im Format mail\xxx.nsf) in einem Array
  • Über eine Schleife greife ich auf die Mailboxen zu und verschiebe die Mails aus den Ordnern Spam bzw. Ham in die vorgesehenen Mailboxen

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.
Gruß
Martin

"The man with a new idea is a Crank until the idea succeeds." - Mark Twain

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
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.
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Driri

  • Gast
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
« Letzte Änderung: 21.06.07 - 16:16:15 von Driri »

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
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.
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Driri

  • Gast
Stimmt, netter Nebeneffekt  ;)

Offline MaVo

  • @Notes Preisträger
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 544
  • Geschlecht: Männlich
  • Geht nicht - gibt´s nicht
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
Gruß
Martin

"The man with a new idea is a Crank until the idea succeeds." - Mark Twain

Driri

  • Gast
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

Offline MaVo

  • @Notes Preisträger
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 544
  • Geschlecht: Männlich
  • Geht nicht - gibt´s nicht
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?
Gruß
Martin

"The man with a new idea is a Crank until the idea succeeds." - Mark Twain

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Alternativ kannst du auch jede Variable in einer eigenen Zeile definieren. Finde ich persönlich übersichtlicher.

Offline MaVo

  • @Notes Preisträger
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 544
  • Geschlecht: Männlich
  • Geht nicht - gibt´s nicht
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.

Gruß
Martin

"The man with a new idea is a Crank until the idea succeeds." - Mark Twain

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz