Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: immanuel am 30.12.04 - 11:11:15

Titel: E-Mails nach Inhalten parsen
Beitrag von: immanuel am 30.12.04 - 11:11:15
Hallo Zusammen
Ich habe die Idee im Kopf Mails nach definierten Strukturen zu parsen - viellicht mit regulären Ausdrücken - und dann neue Dokumente - mit neuer Schablone -mit den ausgelesenen Daten zu estellen. Konkret möchte ich Mails, die über ein fixes Webformular einer Website abgeschickt werden, mit Lotus Notes verarbeiten.

Habt ihr sowas schonmal gemacht, oder habt Ansätze, wie dies am einfachsten zu realisieren ist?

Lieber Gruss
Manuel
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: Semeaphoros am 30.12.04 - 11:13:45
Basiert die Website auf Domino? Wenn ja, braucht es eigentlich keine Mails. Formular ausfüllen lassen in einer EingabeDB, und im WebQuerySave Ereignis den Input mit LS abarbeiten und entsprechend drauf reagieren. Wie schwer das dann zu machen ist, hat man selber in der Hand mit einer passenden Gestaltung des Eingabeformulars (Maske)
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: immanuel am 30.12.04 - 11:22:26
Hallo!
Nein, ist kein Domino Webserver, sondern ein externer Server, von dem wir die Mails erhalten. An der Struktur der Mails können wir leider nichts ändern.

Gruss
Manuel
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: Semeaphoros am 30.12.04 - 11:24:09
Ok, dann lasst das in eine Mailin-Datenbank laufen und fangt es mit einem After Mail Arrives Agenten ab
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: Marinero Atlántico am 30.12.04 - 11:35:31
Regular expressions gibt es mit java.
Wenn ich nicht völlig vergesslich bin, sind regex erst ab 1.4 Bestandteil des jsdk (domino 6.5).
Für vorherige Java-Versionen (1.3.1 -> Domino6) existieren Zusatzpackages. (z.B. hier: http://jakarta.apache.org/regexp/index.html ).
Du kannst die entsprechenden jars in deine Domino-JVM einbinden (über JavaUserClasses in notes.ini oder als Zusatzlibs direkt in den Agenten).

Gruß Axel
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: immanuel am 30.12.04 - 11:45:05
Wir haben Domino 6.5.2 im Einsatz, so sollte es kein Problem von wegen Javalibs geben. Da ich jedoch noch nie Java mit Domino verwendert habe, habe ich keine Ahnung, wie ich die Implementation in Java angehen könnte.  ::) Also wenn ihr gerade ein Beispiel habt, wie ein Mail z.B: per Java verarbeitet werden könnte - insbesondere Zugriff auf bestimmte Stellen eines E-Mails - wäre mir mit einem Beipiel sehr gedient.
Wenn geht, würde ich lieber auf Java verzichten und das ganze mit LS realisieren, deoch weiss ich nicht, wie einfach Mails mit LS geparst werden können. Schön wäre schon, wenn schon Methoden, wie Regex, bestehen würden...

Grüsse
Manuel
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: Marinero Atlántico am 30.12.04 - 11:58:05
LotusScript hat imho keine Regex Funktionalitäten.
Vielleicht gibt es irgendwo Zusatzfunktionalitäten via dll oder so.
Notes besitzt eine Java Hilfe, wo es eine Menge mehr oder minder hilfreichen Java code gibt.
Falls du dich für Java entscheidest, kannst du dort anfangen und ggbfls konkretere Fragen stellen.
Btw. hat der Javaranch Moderator Mehran (Max) Habibi ein didaktisches konkret empfehlenswertes Einsteigerbuch für Regex in Java für Apress geschrieben
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: Semeaphoros am 30.12.04 - 12:21:41
LS hat kein Regex, das ist richtig. Ist aber durchaus denkbar, dass man da fertige Algorithmen finden kann, beispielsweise bei OpenNTF
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: Marinero Atlántico am 30.12.04 - 12:44:10
... hängt von der Aufgabe ab, ob du regex brauchst.
Sehe es eindeutig als ein Nebenthema, wenn auch ein interessantes.
Bringt für das parsen eine Menge an Flexibilität und Überschaubarkeit. Hat aber eine gewisse Lernkurve ...
Gute regex zu schreiben halte ich für wesentlich schwieriger als mit Java auf Domino Objekte wie Dokumente zuzugreifen. Die Java-Api (s. Hilfe) ist da sehr, sehr, sehr ähnlich wie die LotusScript Api.
Wobei manche Perl oder Unix/Linux Leute regex aus dem eff-eff können.
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: eknori (retired) am 30.12.04 - 13:35:59
Julian Robichaux hat da was auf seiner Seite ( An agent that allows you to use regular expressions in LotusScript ) http://www.nsftools.com/tips/NotesTips.htm#ls2jexamples
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: Marinero Atlántico am 30.12.04 - 14:09:27
... nett.
Nur so als Hinweis: Wobei ich ehrlichgesagt mit diesem LS2J Zeugs sehr, sehr vorsichtig wäre (LS2J + memory leak in google).
Es ist wirklich nicht schwierig das alles in Java zu schreiben.
Ausserdem ist das fröhliche Aufrufen von Methoden über Prozessräume (Java VM und LotusScript code laufen im Rechner wo ganz anders) weder gut für Performance noch Übersichtlichkeit.
Es gibt nix was ich weniger brauchen kann als so ein feature zu benutzen und dann gibt es einen memory leak oder sonstige obskures Zeugs.

Axel
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: koehlerbv am 30.12.04 - 23:52:02
Bevor hier noch weiter theoretisiert wird: Kannst Du mal näheres über Deine Anforderungen "Das kommt 'rein - das soll 'rauskommen" schreiben ? Ohne diese Infos nützen ja auch regualar expressions gar nix.

Bernhard
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: Semeaphoros am 31.12.04 - 00:01:26
Genau, da warte ich eigentlich auch schon drauf ....
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: immanuel am 31.12.04 - 10:47:10
Hallo Zusammen

Ich möchte aus Mails mit bleibender Struktur die Postadresse herausparsen und schlisslich auf den Wert per Variabel zugreifen. Vor und nach der Adresse steht in diesem Mail ein ****, was super für Regex oder so verwendet werden könnte. Zudem möchte ich, dass das Mail nach einem Geldbetrag geparst wird und diesen Wert schliesslich als Feld in einem neuen Dokument gespeichert wird.
Auf die Idee bin ich gekommen, weil ich mails mit Geldbetrag angaben erhalte, jedoch mit einem Blosen mail nicht den Betrag in einer Ansicht erscheinen lassen kann. Daher bin ich auf die Idee von neuen Dokumenten gekommen. Das gnaze wäre dann eine Struktur-Automat, der Mails in bestimmte Dokumente konvertiert...
Seid ihr drausgekommen?

Gruss
Manuel
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: eknori (retired) am 31.12.04 - 12:08:37
poste doch mal beispielhaft eine dieser Mails; möglicherweise läßt sich das "Parsen" einfacher gestalten, als angenommen ...
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: immanuel am 31.12.04 - 12:50:28
Hallo Zusammen

Ein Mail kann so aussehen:
Code
TransaktionsID: 1111111
Zusatzparameter:

Spende für: Zweck

Zahlungsart: Visa
Zahlungsnummer: 1111111
Transaktionsbestätigung für Spendenbetrag: 200
Währung: CHF
ESR Member:
ESR Referenznummer:
ESR Nummer:
Spender wünscht keine Werbung. true

***********************************************
Adresse:
Herr
Nachname Vorname
Strasse
PLZ Ort

***********************************************

Gut wäre, wenn das Parsen auf der Seite des Servers geschehen würde, wie z.B. über einen Agenten, weil die Clients R5 und R6 sind.

LG Manuel
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: Semeaphoros am 31.12.04 - 13:15:38
Also, um das zu parsen, wenn es denn so stabil ist, wie Du das schilderst, braucht es nicht wirklich regex. R5 oder R6 spielt da auch fast keine Rolle, und dass man das auf dem Server platziert ist so, wie ich das oben vorgeschlagen habe, eigentlich auch gegeben, ein clientseitiges Parsen wäre eigentlich schon eher komplizierter.
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: koehlerbv am 31.12.04 - 13:17:24
In diesem Falle - wenn immer diese Formulardaten genauso vorkommen - ganz einfach:

- Text aus Body ziehen
- Zeilenweise aufdröseln
- dabei nach den Kennern suchen wie "Spendenbetrag"
- an der dann erwarteten Stelle den Wert extrahieren (incl. Prüfungen / Konvertierungen)

Du weisst ja faktisch schon, wo oder wonach die Dich interessierenden Daten stehen.

HTH,
Bernhard
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: TMC am 31.12.04 - 13:23:57
Genau, das erscheint mir jetzt auch eher simpel.

Mit item.Text auslesen.

Dann bietet sich IMHO an, das ganze in eine Liste zu überführen.
Dadurch hat man schön Zugriff auf die einzelnen Werte, und zieht sich das raus, was man braucht.
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: eknori (retired) am 31.12.04 - 14:02:50
habs mal schnell exemplarisch für die Währung zusammengebraten

Sub Click(Source As Button)
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim col As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim rtItem As Variant
   Dim plaintext As Variant
   Dim retVal As String
   Dim key As String
   Dim pos As Integer
   
   Set db = s.CurrentDatabase
   Set col = db.UnprocessedDocuments
   Set doc = col.GetFirstDocument
   Set rtitem = doc.GetFirstItem( "Body" )
   If ( rtitem.Type = RICHTEXT ) Then
      plainText = rtitem.GetFormattedText( False, 0 )
   End If
   key = "Währung:"
   
   'Msgbox plaintext
   
   
   pos=Instr(1, plaintext, Key)
   'Msgbox pos
   retval = Mid(plaintext,pos + Len(key) + 1 ,3)
   Msgbox retval
End Sub

Ist noch nicht dynamisch, da beim MID noch mit einem  festen Wert gearbeitet wird (3)
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: eknori (retired) am 31.12.04 - 14:13:54
hier der Code für das dynamische parsen

Sub Click(Source As Button)
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim col As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim rtItem As Variant
   Dim plaintext As Variant
   Dim retVal As String
   Dim key As String
   Dim pos As Integer
   Dim pos1 As Integer
   Dim ToRead As Integer
   Set db = s.CurrentDatabase
   Set col = db.UnprocessedDocuments
   Set doc = col.GetFirstDocument
   Set rtitem = doc.GetFirstItem( "Body" )
   If ( rtitem.Type = RICHTEXT ) Then
      plainText = rtitem.GetFormattedText( False, 0 )

   End If
   
   key = "Zahlungsart:"
   
   pos=Instr(1, plaintext, Key)
   pos1 = Instr(pos, plaintext, Chr(10))
   
   ToRead = pos1 - (pos + Len(key) + 1)
   retval = Trim(Mid(plaintext,pos + Len(key) + 1 ,ToRead))
   Msgbox retval
   
End Sub
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: immanuel am 31.12.04 - 15:46:48
Hallo Ulrich

Vielen Dank! Ich werde es am Montag im Geschäft ausprobieren... Vielen Dank auf für alle Antworten!
Lieber Gruss und noch ein schönes altes Jahr :)

Greez
Manuel
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: eknori (retired) am 31.12.04 - 15:54:58
hier dann noch schnell zum Jahresabschluss die letzte Version

Sub Click(Source As Button)
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim col As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim rtItem As Variant
   Dim plaintext As String
   Dim retVal As String
   Dim StartKey  As String, EndKey As String
   Dim pos As Integer
   Dim pos1 As Integer
   Dim ToRead As Integer
   
   Set db = s.CurrentDatabase
   Set col = db.UnprocessedDocuments
   Set doc = col.GetFirstDocument
   Set rtitem = doc.GetFirstItem( "Body" )
   If ( rtitem.Type = RICHTEXT ) Then
      plainText = rtitem.GetFormattedText( False, 0 )
   End If
   
   'Startkey= "Währung:"
   'Endkey = Chr(10)
   
   Startkey= "Adresse:"
   Endkey = "***********************************************"
   
   Msgbox GetParseString (plaintext, Startkey, EndKey)
   
End Sub

Function GetParseString(ToParse As String, StartsWith As String, EndsWith As String) As String
   Dim i As Integer, j As Integer
   i=Instr(1, ToParse, StartsWith)
   j= Instr(i, ToParse, EndsWith)
   GetParseString = Trim(Mid(ToParse,i + Len(StartsWith) + 1 , j - (i + Len(StartsWith) + 1)))
End Function
Titel: Re: E-Mails nach Inhalten parsen
Beitrag von: Tode am 03.01.05 - 16:25:52
@eknori: nicht schlecht der Code.
Mein Ansatz wäre zwar ein anderer, aber das ist ja immer Geschmackssache...  ;D

Hier mein Senf zu dem Würstchen...

Sub Initialize
   Dim ses As New NotesSession
   Dim db As NotesDatabase
   Dim dc As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim body As NotesRichtextItem
   
   Dim plainText As String
   Dim valArr As Variant
   
   Dim TransaktionsID As String, summe As Double
   
   Set db = ses.CurrentDatabase
   Set dc = db.UnprocessedDocuments
   
   Set doc = dc.GetFirstDocument
   Set body = doc.GetFirstItem( "Body" )
   
   plainText = body.GetFormattedText( False , 0 )
'- ggf. chr 10 durch chr 13 ersetzen, so dass wir ein einheitliches Bild bekommen
   plainText = Replace( plaintext, Chr$( 10 ) , Chr$( 13 ) )
   valArr = Fulltrim( Split( plainText , Chr$( 13 ) ) )
   
'- dieses Array können wir nun nach den verschiedenen Werten durchparsen
   TransaktionsID = GetLineVal( valArr , "TransaktionsID: " , "" )
   Summe = GetLineVal( valArr , "Transaktionsbestätigung für Spendenbetrag: " , "" )
   
   
End Sub

Function GetLineVal( valArr As Variant , startText As String, cutText As String ) As Variant
'- startText: Der Text, nach dem gesucht wird, cutText: Ein Text, der gegebenenfalls am Ende der Wertes abgeschnitten wird
   Dim tmpVal As String
   Dim i As Integer, pos As Integer
   
   For i = 0 To Ubound( valArr )
      tmpVal = Strright( valArr( i ) , startText )
      If tmpVal <> "" Then
         If cutText <> "" Then
            tmpVal = Strleft( tmpVal , cutText )            
         End If
'- beim ersten gefundenen Wert wird abgebrochen         
         GetLineVal = tmpVal
         Exit Function
      End If
   Next
'- Der Wert wurde bis hier nicht gefunden: also ist er nicht vorhanden...   
   GetLineVal = ""
End Function

Gruß
Tode