Page 1 sur 1
[..] Surveillance de répertoire + envoi par mail
Posté : mer. 10 juil. 2013 09:20
par totov
Bonjour,
débutant, je cherche un script qui pourrait accomplir les choses suivantes.
Scan d'un répertoire, interprétation du nom de fichier pour envoi par mail à différents utilisateurs. La liste des destinataires doit être dans un fichier .ini afin de pouvoir la mettre à jour. Les fichiers une fois envoyés par mail devront être renommés.
Actuellement, ces opérations sont faites par plusieurs procédures utilisant des logiciels ne fonctionnant plus sous W7.
Merci de votre aide
Totov
Re: [..]
Posté : mer. 10 juil. 2013 11:17
par Tlem
Merci d'éditer votre titre de sujet afin de le rendre significatif.
Re: [..] Surveillance de répertoire + envoi par mail
Posté : lun. 15 juil. 2013 16:15
par DimVar
Bonjour,
Je pense pouvoir vous faire ca.
Avez vous une ébauche ?
Quel est le path à scanner ?
Y aura t'il des sous dossiers au sein du dossier ?
Combien de fichiers ? Quelle taille ?
D'autres questions suivront...
Cdlt.
Re: [..] Surveillance de répertoire + envoi par mail
Posté : mar. 16 juil. 2013 19:20
par Utilisateur 3309 supprimé
voici ma proposition.
pour l'envoi des email j'utilise le programme
sendmail.exe téléchargeable ici:
http://www.petri.co.il/sendmail.htm
mettre le script
autoit, le fichier
ini et
sendmail.exe dans le dossier
c:\scandir\
lorsque le script est ecécuté il teste la présence des fichiers définis dans le .ini, pour chaque fichier trouvé un mail est envoyé à la personne indiquée, puis le fichier en question est renommé.
Fichier
scandir.au3
► Afficher le texte
Code : Tout sélectionner
dim $fichier[10], $email[10], $newname[10]
global $scandir
$fichierini = "c:\scandir\scandir.ini"
iniinfo($fichierini)
;test du fichier 1
If FileExists($scandir & $fichier[1]) Then
runwait("C:\scandir\sendmail.exe /smtpserver 192.168.70.22 /to "& $email[1] &" /from moi@societe.com /subject mon sujet /body envoi du fichier /attachment " & $scandir & $fichier[1])
MsgBox(0, "Résultat", $fichier[1] &" envoyé à " & $email[1])
filemove($scandir & $fichier[1], $scandir & $newname[1]) ; on renomme le fichier
EndIf
;test du fichier 2
if FileExists($scandir & $fichier[2]) Then
runwait("C:\scandir\sendmail.exe /smtpserver 192.168.70.22 /to "& $email[2] &" /from moi@societe.com /subject mon sujet /body envoi du fichier /attachment " & $scandir & $fichier[2])
MsgBox(0, "Résultat", $fichier[2] &" envoyé à " & $email[2])
filemove($scandir & $fichier[2], $scandir & $newname[2]) ; on renomme le fichier
EndIf
; Lecture du fichier ini et chargement des variables
FUNC INIINFO($files)
$scandir = IniRead($files, "dir", "scandir", "")
$fichier[1] = IniRead($files, "files", "file1", "")
$newname[1] = IniRead($files, "files", "newname1", "")
$email[1] = IniRead($files, "emails", "email1", "")
$fichier[2] = IniRead($files, "files", "file2", "")
$newname[2] = IniRead($files, "files", "newname2", "")
$email[2] = IniRead($files, "emails", "email2", "")
EndFunc
Fichier
scandir.ini:
Dans le fichier ini on indique :
- le dossier à scanner, dans l'exemple "c:\scandir\dir\"
- quel est le fichier a chercher dans les variables file1 et file2
- quel sera le nouveau nom du fichier dans les variables newname1 et newname2
- qui est le destinataire1 du file1 et le destinataire2 du file2
il suffira d'ajouter autant de test de présence de fichier qu'il est nécéssaire afin d'adapter le script à vos besoins.
penser à adapter la syntaxe de sendmail.exe avec les parametres de votre société, remplacer
moi@societe.com par l'adresse mail de l'expéditeur.
une fois les parametrages et les tests de fonctionnement effectués, il faudra créer sur le PC une tache planifiée qui va exécuter le programme autoit toutes les X minutes.
Re: [..] Surveillance de répertoire + envoi par mail
Posté : mer. 17 juil. 2013 21:53
par totov
Pour Cetipabo, merci, je vais tester !
Pour Dimvar, je fournis les éléments en MP.
Merci à tous !
Re: [..] Surveillance de répertoire + envoi par mail
Posté : ven. 19 juil. 2013 10:11
par DimVar
Bonjour,
Merci de consulter vos MP.
Cdlt.
Re: [..] Surveillance de répertoire + envoi par mail
Posté : ven. 19 juil. 2013 11:50
par pierrotm777
En pur autoit vous pouvez aussi utiliser ce script que l'on trouve plusieurs fois sur le forum !
► Afficher le texte
Code : Tout sélectionner
#include <File.au3>
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
;##################################
; Variables
;##################################
$SmtpServer = "smtp.gmail.com" ; address for the smtp-server to use - REQUIRED
$FromName = "moi" ; name from who the email was sent
$FromAddress = "xxxxxxxx@gmail.com" ; address from where the mail should come
$ToAddress = "yyyyyyyyy@gmail.com" ; destination address of the email - REQUIRED
$Subject = "Ceci est un test" ; subject from the email - can be anything you want it to be
$as_Body = "Corps du message" ; the messagebody from the mail - can be left blank but then you get a blank mail
$AttachFiles = "" ; the file you want to attach- leave blank if not needed
$CcAddress = "" ; address for cc - leave blank if not needed
$BccAddress = "" ; address for bcc - leave blank if not needed
$Importance = "Normal" ; Send message priority: "High", "Normal", "Low"
$Username = "xxxxxxxx@gmail.com" ; username for the account used from where the mail gets sent - Optional (Needed for eg GMail)
$Password = "mot de pass" ; password for the account used from where the mail gets sent - Optional (Needed for eg GMail)
$SmtpPort = 25 ; port used for sending the mail
$IPPort=465 ; GMAIL port used for reading the mail (110=standard, 465=Gmail)
$ssl=1 ;0= non cryté 1 = crypté (obligé pour gmail)enables/disables secure socket layer sending - put to 1 if using httpS
Global $oMyRet[2]
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
$rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $as_Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $SmtpPort, $ssl)
If $AttachFiles <> "" Then
;MsgBox(0, "Error sending message", "Attached file !")
Else
MsgBox(0, "Error sending message", "No file attached !")
EndIf
If @error Then
MsgBox(0, "Error sending message", "Error code:" & @error & " Rc:" & $rc)
EndIf
exit
;**********************************************Emailer********************************************************
;*************************************************************************************************************
; GMAILenables/disables secure socket layer sending - put to 1 if using httpS
Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $s_as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "",$s_IPPort=25, $s_ssl=0)
$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 = $s_as_Body
Else
$objEmail.Textbody = $s_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])
If FileExists($S_Files2Attach[$x]) Then
$objEmail.AddAttachment ($S_Files2Attach[$x])
Else
$i_Error_desciption = $i_Error_desciption & @lf & 'File not found to attach: ' & $S_Files2Attach[$x]
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
$objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $s_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 $s_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
; Sent the Message
$objEmail.Send
if @error then
SetError(2)
return $oMyRet[1]
EndIf
EndFunc ;==>_INetSmtpMailCom
Par contre, je ne sais pas si $CcAddress prend en charge plusieurs adresses .
Re: [..] Surveillance de répertoire + envoi par mail
Posté : ven. 19 juil. 2013 16:56
par DimVar
Ni si $AttachFiles prends plusieurs fichiers....
Re: [..] Surveillance de répertoire + envoi par mail
Posté : ven. 19 juil. 2013 17:13
par pierrotm777
Ceci dit, une boucle sur $CcAddress et $AttachFiles devrait faire l'affaire.
Re: [..] Surveillance de répertoire + envoi par mail
Posté : ven. 19 juil. 2013 18:20
par PandiPanda
Pour permettre plusieurs fichier sur "atachfiles", il suffit de séparer les path de chaque fichier par un ';'.
Disons 2 fichiers, "fich1.txt" & "fich2.txt".
=> $AttachFiles = "fich1.txt"&";"&"fich2.txt"
Re: [..] Surveillance de répertoire + envoi par mail
Posté : ven. 19 juil. 2013 22:08
par DimVar
Merci pour l'info

Re: [..] Surveillance de répertoire + envoi par mail
Posté : mar. 06 août 2013 09:26
par DimVar
Bonjour,
J'avais précisé par MP que j'avais besoin de réactivité de votre part, pour avancer rapidement sur ce script.
N'ayant pas eu les réponses attendues de votre part, je stoppe donc le développement.
Voici le code sans les fonctions attendues.
Bonne continuation.
Re: [..] Surveillance de répertoire + envoi par mail
Posté : mar. 06 août 2013 16:12
par sylvanie
Bonjour à tous.
Quand j'ai vu le "Surveillance de répertoire", ça m'a fait penser à cet exemple que j'ai traduit depuis le site :
http://techsupt.winbatch.com/TS/T000001048F39.html :
► Afficher le texte
Code : Tout sélectionner
$WatchDir = @WorkingDir
$Kernel32 = DllOpen("C:\Windows\System32\kernel32.dll")
if $Kernel32 = -1 Then Exit 1
$WatchHandle = DllCall($Kernel32,"long","FindFirstChangeNotificationA","str",$WatchDir,"long",1,"long",1)
$WatchHandle=$WatchHandle[0]
ConsoleWrite(@error&@CRLF)
$Status = DllCall($Kernel32,"long","WaitForSingleObject","long",$WatchHandle,"long",-1)
ConsoleWrite(@error&@CRLF)
DllCall($Kernel32,"long","FindCloseChangeNotification","long",$WatchHandle)
ConsoleWrite(@error&@CRLF)
DllClose($Kernel32)
MsgBox(0,"Info",$WatchDir&" changé !")
Exit 0
Bon, pour le cas présent, il semblerait qu'un polling toutes les n minutes est amplement suffisant, mais si le besoins évolu vers le la surveillance en temps réel, alors ceci est plus adapté, pusqu'on suspend l'exécution en attendant que l'OS nous notifie que quelque chose à changer dans le répertoire. Après on reprends la main et on lance la recherche à ce moment là.
Bonne journée