eMail-Dateien einlesen

  • Hallo zusammen,

    wir haben eine Alarmanlage, die via eMail eine Nachricht absetzt an unser eMail-System (Tobit David.fx). Im Verzeichnis "\\server\david\Archive\GROUP\7" liegen jeweils all diese Dateien dieses Ordners; relevant sind aber nur die eigentlichen Nachrichten (Dateiendung: *.001):

    Zitat

    Sehr geehrte Damen und Herren,

    am 13.03.2012 um 08:25 Uhr
    ist im Objekt Firma
    das Ereignis Unscharfschaltung eingetreten.

    Wie würdet ihr vorgehen, um nun via AutoIt die aktuellste eMail (Datum / Uhrzeit auf Dateisystemebene - Erstellungsdatum!) herauszufiltern und dann das Datum in der eMail, die Uhrzeit aus der eMail (kann wenige Minuten abweichen) und das Ereignis (Unscharfschaltung o.ä.). auszulesen?

    Bin mal auf Eure Tipps gespannt ;)

  • Bin mal so weit - aber habe ein Problem, die aktuellste Datei einzulesen:

    [autoit]

    #include <String.au3>
    #include <array.au3>

    [/autoit][autoit][/autoit][autoit]

    $file = "\\server\david\Archive\GROUP\7\I0A61FE0.001"
    $output = FileReadLine($file, 5)
    $aResult = _StringBetween($output, "Ereignis ", " eingetreten", -1)

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,"",$aResult[0])

    [/autoit]
  • hallo F1109,

    anbei mal ein scriptausschnitt ...
    vielleicht kannste davon was benutzen :)

    Spoiler anzeigen
    [autoit]


    #Include <File.au3>
    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    DIM $aRecords, $file,

    [/autoit] [autoit][/autoit] [autoit]

    ;------- Daten einlesen & verarbeiten -------------------------
    $filepath = "V:\Reporting\Share\Tkanlage\"

    [/autoit] [autoit][/autoit] [autoit]

    $file =_FileListToArray($filepath,"mail*.001",1)
    ;_ArrayDisplay($file,"$FileList")

    [/autoit] [autoit][/autoit] [autoit]

    If @Error = 1 Then
    MsgBox (0,"","No Folders Found.",1)
    ;Exit
    $a = 1
    Else
    If @Error = 4 Then
    MsgBox (0,"","No Files Found.",1)
    Else
    For $x = 1 To $file[0]
    ;MsgBox(0,"",$file[$x])
    $a = 0
    einlesen()
    Next
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func einlesen()

    [/autoit] [autoit][/autoit] [autoit]

    $file = $filepath & $file[$x]
    ;MsgBox(0,"",$file)
    _file_array() ;liest file in ein array ...
    _insert() arbeitet das eingelesene array ab ...
    _leeren() ; leert variablen usw. ...

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; beispiel aus meinem script
    Func _insert()

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 1 to $aRecords[0] -1

    [/autoit] [autoit][/autoit] [autoit]

    ; file formatieren ...
    $aRecords[$x] = StringReplace($aRecords[$x], @LF, "|")
    $aRecords[$x] = StringReplace($aRecords[$x], " ", "|")
    $aRecords[$x] = StringReplace($aRecords[$x], '"|"', "|")
    $aRecords[$x] = StringReplace($aRecords[$x], ' |', "|")
    $aRecords[$x] = StringReplace($aRecords[$x], '| ', "|")
    $aRecords[$x] = StringReplace($aRecords[$x], '"', "")
    $aRecords[$x] = StringReplace($aRecords[$x], '#', "")
    ;Msgbox(0,'Record1 x:', $aRecords[$x])
    ;$aRecords[$x] = stringstripws($aRecords[$x],1) ;alle aufeinanderfolgenden leerzeichen auf eins reduzieren($aRecords[$x])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;formatiert file für weitere verarbeitung ungeändert aus meinem script
    Func _file_array()
    Dim $inhalt
    If Not _FileReadToArray($file,$aRecords) Then
    MsgBox(4096,"Error", " Error reading log to Array error:" & @error,1)
    Exit
    Else
    ; file formatieren ...
    For $x = 1 to $aRecords[0]
    ;Msgbox(0,'Record:' & $x, $aRecords[$x])
    $inhalt &= $aRecords[$x] & @CRLF
    Next
    ;$inhalt = StringReplace($inhalt, " ", "#")
    ;Leerzeilen & Zeichenumbrüche entfernen
    $inhalt = StringStripWS($inhalt,4)
    ;$inhalt = StringReplace($inhalt, "||", " ")
    ;$inhalt = StringReplace($inhalt, @CR, "##")
    $inhalt = StringReplace($inhalt, " ", @LF)
    ;ConsoleWrite($inhalt)
    $aRecords = StringSplit($inhalt,@CR,1)

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    ;_ArrayDisplay($aRecords)
    ;Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _leeren()
    $file = ""
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    gruß gmmg

  • Nettes Skript, danke. Ich stehe gerade davor, dass ich nicht weiß, wie ich am besten die vier letzten Dateien einlese, also die vier neuesten.

    [autoit]

    #include <String.au3>
    #include <array.au3>
    #include <file.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $aFilelist = _FileListToArray("\\server\david\Archive\GROUP\7\", "*.001")
    Dim $aFiledate[$aFilelist[0]+1]
    For $i = 1 To $aFilelist[0]
    $aFiledate[$i] = FileGetTime("\\server\david\Archive\GROUP\7\" & '\' & $aFilelist[$i], 0, 1)
    Next

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, 'Test', 'Die aktuellste Datei ist: ' & $aFilelist[_ArrayMaxIndex($aFiledate, 1)])

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $neuesteDatei = $aFilelist[_ArrayMaxIndex($aFiledate, 1)]

    [/autoit][autoit][/autoit][autoit]

    $file = "\\server\david\Archive\GROUP\7\\"&$neuesteDatei

    [/autoit][autoit][/autoit][autoit]

    $output = FileReadLine($file, 5)
    $aResult = _StringBetween($output, "Ereignis ", " eingetreten", -1)

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,"",$aResult[0])

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]

    Denn: es kommt auf die Uhrzeit an, die in der eMail steht - die ausgelesene ist ja "nur" die Zeit der eMail-Ankunft. Das kann mal' abweichen.

  • ich würde auf jedenfall die dateien, die verarbeitet wurden, in einen unterordner speichern, damit hast du dann nur die neusten im hauptordner

    zum einlesen ...

    1. alle entsprechenden dateien in ein array1
    2. steht das datum immer in der gleichen zeile? dann könntest du mit FileReadLine($file, line) das datum auslesen
    3. schreibe in array2 ( _ArrayAdd(array2, dateiname aus array1 & ";" & Zeile mit datum aus der jeweiligen datei
    4. array1 und array2 verarbeiten

    vlt. bissl umständlich, aber müsste machbar sein

    gruß gmmg

  • Wie bekomme ich die drei String-Between in ein Array?

    Also jeweils eine Spalte. Darunter würde ich jeweils mit _ArrayDelete die letzte Zeile löschen und das ganze 4 x.

    #Include <File.au3>
    #Include <Array.au3>
    #include <String.au3>


    [autoit]

    $aFilelist = _FileListToArray("\\server\david\Archive\GROUP\7\", "*.001")
    Dim $aFiledate[$aFilelist[0]+1]
    For $i = 1 To $aFilelist[0]
    $aFiledate[$i] = FileGetTime("\\server\david\Archive\GROUP\7\" & '\' & $aFilelist[$i], 0, 1)
    Next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $neuesteDatei = $aFilelist[_ArrayMaxIndex($aFiledate, 1)]
    $file = "\\server\david\Archive\GROUP\7\"&$neuesteDatei

    [/autoit][autoit][/autoit][autoit]

    Dim $result[4][3]

    [/autoit][autoit][/autoit][autoit]

    _StringBetween(FileReadLine($file, 3), "am ", " um", -1)
    _StringBetween(FileReadLine($file, 3), "um ", " Uhr", -1)
    _StringBetween(FileReadLine($file, 5), "Ereignis ", " eingetreten", -1)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($result, "Test")

    [/autoit]
  • Das nachfolgende Skript funktioniert soweit, ABER dann nicht, wenn zwei eMails das gleiche Datum und die gleiche Uhrzeit haben (z.B. Scharf- und Unscharfschaltung kurz hintereinander = kommt zur gleichen Zeit an).

    Wie könnten wir eine For-Schleife erstellen, die ein Array füllt und zwar so: Pro eMail eine Zeile / für Datum, Uhrzeit und Ereignis jeweils eine Spalte ? Ich denke, dass das für viele von Euch easy ist - ich komme da noch nicht ganz nach.

    [autoit]

    #Include <File.au3>
    #Include <Array.au3>
    #include <String.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $aFilelist = _FileListToArray("\\server\david\Archive\GROUP\7\", "*.001")
    Dim $aFiledate[$aFilelist[0]+1]
    For $i = 1 To $aFilelist[0]
    $aFiledate[$i] = FileGetTime("\\server\david\Archive\GROUP\7\" & '\' & $aFilelist[$i], 1, 1)
    Next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $neuesteDatei = $aFilelist[_ArrayMaxIndex($aFiledate, 1)]
    $file = "\\server\david\Archive\GROUP\7\"&$neuesteDatei
    $Datum1 = _StringBetween(FileReadLine($file, 3), "am ", " um", -1)
    $Uhrzeit1 = _StringBetween(FileReadLine($file, 3), "um ", " Uhr", -1)
    $Ereignis1 = _StringBetween(FileReadLine($file, 5), "Ereignis ", " eingetreten", -1)
    _ArrayDelete($aFiledate,$neuesteDatei)
    $neuesteDatei = $aFilelist[_ArrayMaxIndex($aFiledate, 1)]
    $file = "\\server\david\Archive\GROUP\7\"&$neuesteDatei

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Datum2 = _StringBetween(FileReadLine($file, 3), "am ", " um", -1)
    $Uhrzeit2 = _StringBetween(FileReadLine($file, 3), "um ", " Uhr", -1)
    $Ereignis2 = _StringBetween(FileReadLine($file, 5), "Ereignis ", " eingetreten", -1)
    _ArrayDelete($aFiledate,$neuesteDatei)
    $neuesteDatei = $aFilelist[_ArrayMaxIndex($aFiledate, 1)]
    $file = "\\server\david\Archive\GROUP\7\"&$neuesteDatei

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Datum3 = _StringBetween(FileReadLine($file, 3), "am ", " um", -1)
    $Uhrzeit3 = _StringBetween(FileReadLine($file, 3), "um ", " Uhr", -1)
    $Ereignis3 = _StringBetween(FileReadLine($file, 5), "Ereignis ", " eingetreten", -1)

    [/autoit][autoit][/autoit][autoit]

    _ArrayDelete($aFiledate,$neuesteDatei)
    $neuesteDatei = $aFilelist[_ArrayMaxIndex($aFiledate, 1)]
    $file = "\\server\david\Archive\GROUP\7\"&$neuesteDatei

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Datum4 = _StringBetween(FileReadLine($file, 3), "am ", " um", -1)
    $Uhrzeit4 = _StringBetween(FileReadLine($file, 3), "um ", " Uhr", -1)
    $Ereignis4 = _StringBetween(FileReadLine($file, 5), "Ereignis ", " eingetreten", -1)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Dim $Test2[5][3] = [ [$Datum1[0], $Uhrzeit1[0], $Ereignis1[0]], [$Datum2[0], $Uhrzeit2[0], $Ereignis2[0]], [$Datum3[0], $Uhrzeit3[0], $Ereignis3[0]] ]

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($Test2,"Übersicht")

    [/autoit]
  • Spoiler anzeigen
    [autoit]


    #Include <File.au3>
    #Include <Array.au3>
    #include <String.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $sPath = "\\server\david\Archive\GROUP\7\"
    Dim $aFilelist = _FileListToArray($sPath, "*.001")
    Dim $aFiledate[$aFilelist[0]+1]
    Dim $aInformation[UBound($aFiledate)-1][5]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aFilelist[0]
    $aInformation[$i][0] = $aFilelist[$i] ; Name der Datei übertragen
    $aFiledate[$i] = FileGetTime("\\server\david\Archive\GROUP\7\" & '\' & $aFilelist[$i], 1, 1)
    $aInformation[$i][1] = $aFiledate[$i] ; Time der Datei übertragen
    $ReturnedArray = _SplitInformation($sPath & $aInformation[$i][0]) ; Pfad + Name übergeben
    $aInformation[$i][2] = $ReturnedArray[0] ; Datum aus der Mail
    $aInformation[$i][3] = $ReturnedArray[1] ; Zeit aus der Mail
    $aInformation[$i][4] = $ReturnedArray[2] ; Ergebnis aus der Mail
    Next
    _ArrayDisplay($aInformation)
    Func _SplitInformation($Path)
    Local $fOpen = FileOpen($sPath,0)
    Local $Data = _StringBetween(FileReadLine($fOpen, 3), "am ", " um", -1)
    Local $Time = _StringBetween(FileReadLine($fOpen, 3), "um ", " Uhr", -1)
    Local $Ergebnis = _StringBetween(FileReadLine($fOpen, 5), "Ereignis ", " eingetreten", -1)
    FileClose($fOpen) ; File wieder schließen
    Local $Array[4]
    $Array[0] = $Data
    $Array[1] = $Time
    $Array[2] = $Ergebnis
    Return $Array
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    So ?