kylomas Posted October 8, 2014 Share Posted October 8, 2014 ramoyous, There are several issues with what you are trying to do: The fields in the code that you posted are not populated. If your server requires authentication, the function that you are using will not work. You do not have an error routine to catch COM errors. 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 ramoyous 1 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 More sharing options...
ramoyous Posted October 10, 2014 Author Share Posted October 10, 2014 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 More sharing options...
ramoyous Posted October 10, 2014 Author Share Posted October 10, 2014 ramoyous, There are several issues with what you are trying to do: The fields in the code that you posted are not populated. If your server requires authentication, the function that you are using will not work. You do not have an error routine to catch COM errors. 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 More sharing options...
ramoyous Posted October 10, 2014 Author Share Posted October 10, 2014 ramoyous, There are several issues with what you are trying to do: The fields in the code that you posted are not populated. If your server requires authentication, the function that you are using will not work. You do not have an error routine to catch COM errors. 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 More sharing options...
water Posted October 10, 2014 Share Posted October 10, 2014 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 2024-07-28 - Version 1.6.3.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 (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 More sharing options...
kylomas Posted October 10, 2014 Share Posted October 10, 2014 (edited) 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. expandcollapse popupHotKeySet('`', '_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 October 10, 2014 by kylomas ramoyous 1 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 More sharing options...
ramoyous Posted October 11, 2014 Author Share Posted October 11, 2014 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. expandcollapse popupHotKeySet('`', '_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 More sharing options...
ramoyous Posted October 11, 2014 Author Share Posted October 11, 2014 MANY THANK YOU ALL MY FRIENDS (I'm always working on my problem) Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now