Jump to content

Monitor txt file for words then send alert mail


Recommended Posts

ramoyous,

There are several issues with what you are trying to do:

  1. The fields in the code that you posted are not populated.
  2. If your server requires authentication, the function that you are using will not work.
  3. You do not have an error routine to catch COM errors.
  4. What did you intend to do with this statement?  "$s_Password = """

 

I understand that you are a new user.  I will be glad to show you how to do this if you tell us exactly what you want to do and provide an example of the input file.

kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Link to comment
Share on other sites

It would be helpful if you could post an example of your text file (including a line with the text you search for).

 

Hello Mr Water,

    First, I thank you and i post an exemple from the texte file content.

Failure Over heat
Failure Compressor

and i need to send mail every time when a failure appear, and just a failure without sending the texte file.

 

Best regards

Link to comment
Share on other sites

ramoyous,

There are several issues with what you are trying to do:

  1. The fields in the code that you posted are not populated.
  2. If your server requires authentication, the function that you are using will not work.
  3. You do not have an error routine to catch COM errors.
  4. What did you intend to do with this statement?  "$s_Password = """

 

I understand that you are a new user.  I will be glad to show you how to do this if you tell us exactly what you want to do and provide an example of the input file.

kylomas

 

Hello Mr Kylomas

 

     Thank you very much for your help, your time and your support, i will explain my need

There is a texte file (log file) that an application write in it some informations and it will be like :

Failure Over heat
Failure compressor

my need is a script that can read this file and when it found a failure it will send a mail just when we have a failure and just one mail and every time a failure appear in the text file automaticly the script send another mail without content to facilate the code.

 

Thank you very much Mr Kylomas

 

Best regards

Link to comment
Share on other sites

ramoyous,

There are several issues with what you are trying to do:

  1. The fields in the code that you posted are not populated.
  2. If your server requires authentication, the function that you are using will not work.
  3. You do not have an error routine to catch COM errors.
  4. What did you intend to do with this statement?  "$s_Password = """

 

I understand that you are a new user.  I will be glad to show you how to do this if you tell us exactly what you want to do and provide an example of the input file.

kylomas

 

Hello

   I'm trying to answear your questions

The server i will use is smtp.gmail.com   and i think that he require authentication  for this i've put the  "password" variable.

 

Thank you dear Kylomas

Link to comment
Share on other sites

You need to add some error checking so you know what goes wrong:

#include <INet.au3>
$TextFileName = "C:\Users\X2Z\Desktop\Survey Monitor Close Control 1.30\Log.txt"
$s_SmtpServer = "server mail"
$s_FromName = ""
$s_Password = ""
$s_FromAddress = ""
$s_ToAddress = ""
$s_Subject = ""
Dim $as_Body[2]
$as_Body[0] = "Alert"
$as_Body[1] = "Defaut"
; First we read the text file
$Log = FileRead($TextFileName)
; Put the contents into an array
$pageArray = StringSplit($Log, @CRLF)
; Now go through the array and look for the word failure if its found send and email
For $i = 1 To $pageArray[0]
    If StringInStr($pageArray[$i], "failure") Then 
        $Response = _INetSmtpMail($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body, @ComputerName, -1)
        if @Error Then MsgBox(0, "Error", "Error " & @error & " returned by _INetSMTPMail")
    EndIf
Nex

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

ramyous,

Here is something to get you started...I cloned this from something else I had so it's kind of bare boned...

It only searches for the word "failure".  You may want to expand it to read a file of words / phrases to search for. 

You probably want to add some sort of logging.  I'm just writing error / info messages to the console.

The ESC key is not a good way to exit.  Using the tray would be better.

HotKeySet('`', '_start_monitor')                        ;    "`" to initiate manual scan
HotKeySet('{ESC}', '_exit')                             ;    ESC to stop script

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

Local $file_monitored   = @ScriptDir & '\log.log'       ;   file to monitor
Local $monitor_interval = 1                             ;   minute(s) between file check
Local $bMonitor         = False                         ;   switch to start monitor
local $oMyRet[2]                                        ;   array for error message from mail routine
local $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc") ;   error routine

; routine to start scan
AdlibRegister('_start_monitor', $monitor_interval * 60 * 1000)

; main loop, will only initiate scan when the adlib routine sets the switch
While 1
    If $bMonitor = True Then
        _scan_file()
        $bMonitor = False
    EndIf
    Sleep(500)
WEnd

; scan routine and mail formatter
Func _scan_file()

    Local $sTMP = ''
    local static $FilePos = 0

    ConsoleWrite(_Now() & ' >>>> Start scan' & @CRLF)

    ;read log file entries added since the last scan
    local $fl = fileopen($file_monitored)
    if $fl = -1 then exit msgbox(0,'','File open failed')
    if not filesetpos($fl,$FilePos,0) then exit msgbox(0,'ERROR','FileSetPos failed')
    local $mon_file = fileread($fl)
    $FilePos = filegetpos($fl)
    fileclose($fl)

    ; detect lines with the word "failure" and return the entire line
    ; format output for email
    If StringRegExp($mon_file, 'failure') Then
        $aTMP = StringRegExp($mon_file, '(.*?failure.*)\R', 3)
        $sTMP &= 'The following failures were found:' & @crlf
        for $2 = 0 to ubound($aTMP) - 1
            if $aTMP[$2] = '' then continueloop
            $sTMP &= '     ' & $aTMP[$2] & @crlf
        next
    EndIf

    ; if failures were found then send the email
    if $sTMP then
        ConsoleWrite($sTMP & @CRLF)
        ConsoleWrite('+ Sending mail...')
        _mailer($sTMP)
        ConsoleWrite(@error ? @crlf & '! Error sending mail = ' & $oMyRet[1] & @crlf : 'Send complete' & @CRLF)
    Else
        ConsoleWrite('No failures found' & @CRLF)
    endif

    ConsoleWrite(_Now() & ' >>>> Scan Complete' & @CRLF)

EndFunc   ;==>_scan_file

; adlib to set switch that initiates scan
Func _start_monitor()
    $bMonitor = True
EndFunc   ;==>_start_monitor

Func _exit()
    Exit
EndFunc   ;==>_exit

; wrapper to set variables used in _INetSmtpMailCom
Func _mailer($str)

    Local $SmtpServer       = 'the.gmail.smtp.server'       ; name of the yahoo smtp server
    Local $FromName         = 'Me'                          ; what you want to appear in you inbox "From" column
    Local $FromAddress      = 'name.of.your.gmail.account'  ; name of your yahoo account
    Local $ToAddress        = 'who.to.send.it.to'           ; who you are sending the mail to
    Local $Subject          = "Log File Exception Warning"  ; title
    Local $Body             = $str                          ; the body of the email
    Local $AttachFiles      = ""                            ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed
    Local $CcAddress        = ""                            ; address for cc - leave blank if not needed
    Local $BccAddress       = ""                            ; address for bcc - leave blank if not needed
    Local $Importance       = "Normal"                      ; Send message priority: "High", "Normal", "Low"
    Local $Username         = 'same.as.$fromaddress'        ; account username as known to the smtp server
    Local $Password         = 'password'                    ; password for the above account
    Local $IPPort           = 465                           ; GMAIL / YAHOO port used for sending the mail
    Local $ssl              = 1                             ; GMAIL / YAHOO enables/disables secure socket layer sending - put to 1 if using httpS

    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    If @error Then return seterror(1)
EndFunc   ;==>_mailer

Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance = "Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
;~          ConsoleWrite('@@ Debug : $S_Files2Attach[$x] = ' & $S_Files2Attach[$x] & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
            If FileExists($S_Files2Attach[$x]) Then
                ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 Then $IPPort = 25
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "High"
        Case "Normal"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Normal"
        Case "Low"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
        Return $oMyRet[1]
    EndIf
    $objEmail = ""
EndFunc   ;==>_INetSmtpMailCom

Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description, 3)
    ;ConsoleWrite("### COM Error !  Number: " & $HexNumber & "   ScriptLine: " & $oMyError.scriptline & "   Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
EndFunc   ;==>MyErrFunc

There are cursory comments in the code.  Any questions, just ask.

kylomas

edit: clarification

Edited by kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Link to comment
Share on other sites

ramyous,

Here is something to get you started...I cloned this from something else I had so it's kind of bare boned...

It only searches for the word "failure".  You may want to expand it to read a file of words / phrases to search for. 

You probably want to add some sort of logging.  I'm just writing error / info messages to the console.

The ESC key is not a good way to exit.  Using the tray would be better.

HotKeySet('`', '_start_monitor')                        ;    "`" to initiate manual scan
HotKeySet('{ESC}', '_exit')                             ;    ESC to stop script

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

Local $file_monitored   = @ScriptDir & '\log.log'       ;   file to monitor
Local $monitor_interval = 1                             ;   minute(s) between file check
Local $bMonitor         = False                         ;   switch to start monitor
local $oMyRet[2]                                        ;   array for error message from mail routine
local $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc") ;   error routine

; routine to start scan
AdlibRegister('_start_monitor', $monitor_interval * 60 * 1000)

; main loop, will only initiate scan when the adlib routine sets the switch
While 1
    If $bMonitor = True Then
        _scan_file()
        $bMonitor = False
    EndIf
    Sleep(500)
WEnd

; scan routine and mail formatter
Func _scan_file()

    Local $sTMP = ''
    local static $FilePos = 0

    ConsoleWrite(_Now() & ' >>>> Start scan' & @CRLF)

    ;read log file entries added since the last scan
    local $fl = fileopen($file_monitored)
    if $fl = -1 then exit msgbox(0,'','File open failed')
    if not filesetpos($fl,$FilePos,0) then exit msgbox(0,'ERROR','FileSetPos failed')
    local $mon_file = fileread($fl)
    $FilePos = filegetpos($fl)
    fileclose($fl)

    ; detect lines with the word "failure" and return the entire line
    ; format output for email
    If StringRegExp($mon_file, 'failure') Then
        $aTMP = StringRegExp($mon_file, '(.*?failure.*)\R', 3)
        $sTMP &= 'The following failures were found:' & @crlf
        for $2 = 0 to ubound($aTMP) - 1
            if $aTMP[$2] = '' then continueloop
            $sTMP &= '     ' & $aTMP[$2] & @crlf
        next
    EndIf

    ; if failures were found then send the email
    if $sTMP then
        ConsoleWrite($sTMP & @CRLF)
        ConsoleWrite('+ Sending mail...')
        _mailer($sTMP)
        ConsoleWrite(@error ? @crlf & '! Error sending mail = ' & $oMyRet[1] & @crlf : 'Send complete' & @CRLF)
    Else
        ConsoleWrite('No failures found' & @CRLF)
    endif

    ConsoleWrite(_Now() & ' >>>> Scan Complete' & @CRLF)

EndFunc   ;==>_scan_file

; adlib to set switch that initiates scan
Func _start_monitor()
    $bMonitor = True
EndFunc   ;==>_start_monitor

Func _exit()
    Exit
EndFunc   ;==>_exit

; wrapper to set variables used in _INetSmtpMailCom
Func _mailer($str)

    Local $SmtpServer       = 'the.gmail.smtp.server'       ; name of the yahoo smtp server
    Local $FromName         = 'Me'                          ; what you want to appear in you inbox "From" column
    Local $FromAddress      = 'name.of.your.gmail.account'  ; name of your yahoo account
    Local $ToAddress        = 'who.to.send.it.to'           ; who you are sending the mail to
    Local $Subject          = "Log File Exception Warning"  ; title
    Local $Body             = $str                          ; the body of the email
    Local $AttachFiles      = ""                            ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed
    Local $CcAddress        = ""                            ; address for cc - leave blank if not needed
    Local $BccAddress       = ""                            ; address for bcc - leave blank if not needed
    Local $Importance       = "Normal"                      ; Send message priority: "High", "Normal", "Low"
    Local $Username         = 'same.as.$fromaddress'        ; account username as known to the smtp server
    Local $Password         = 'password'                    ; password for the above account
    Local $IPPort           = 465                           ; GMAIL / YAHOO port used for sending the mail
    Local $ssl              = 1                             ; GMAIL / YAHOO enables/disables secure socket layer sending - put to 1 if using httpS

    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    If @error Then return seterror(1)
EndFunc   ;==>_mailer

Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance = "Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
;~          ConsoleWrite('@@ Debug : $S_Files2Attach[$x] = ' & $S_Files2Attach[$x] & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
            If FileExists($S_Files2Attach[$x]) Then
                ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 Then $IPPort = 25
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "High"
        Case "Normal"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Normal"
        Case "Low"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
        Return $oMyRet[1]
    EndIf
    $objEmail = ""
EndFunc   ;==>_INetSmtpMailCom

Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description, 3)
    ;ConsoleWrite("### COM Error !  Number: " & $HexNumber & "   ScriptLine: " & $oMyError.scriptline & "   Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
EndFunc   ;==>MyErrFunc

There are cursory comments in the code.  Any questions, just ask.

kylomas

edit: clarification

 

 

Dear Kylomas,.

 

         So many thanks to you, i understand you, and i'll try that and inform you.

     ( The rule here is that we have always wise men they never hide an information )

 

thank you dear Kylomas

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...