Page 1 sur 1

[R] Envoi de mail au travers de outlook avec lecture xml

Posté : jeu. 11 mars 2010 15:22
par peuchere83
Bonjour à tous,

J'ai réalisé une interface (très simplifiée) qui permet d'envoyer des mails au travers d'outlook.
Ceci afin que mes opérateurs ne se trompent pas de destinataire (en effet le destinataire est inscrit dans un fichier xml sur le réseau).

J'utilise _outlook.au3

Code : Tout sélectionner

$oOutlook = _OutlookOpen()
_OutlookSendMail($oOutlook, "detourage@arpp.fr", $AdresseComplete, "", $Subject, $Message, "", $olFormatHTML, "", @ScriptDir & "\OutlookWarning1.exe")
 
Mon problème est le suivant :
L'envoi se fait bien mais j'ai systématiquement un message d'erreur d'autoit me signalant qu'il ne peut pas ouvrir un handle déjà ouvert (et cela que outlook soit ouvert ou fermé).
Et je n'arrive pas à utiliser OutlookWarning1.exe.

Si quelqu'un a une idée je sui preneur.

Par avance merci.

Re: [..] Envoi de mail au travers de outlook

Posté : jeu. 11 mars 2010 15:28
par GhostLine
J'ai essayé de mon coté de suivre le tuto pour faire disparaitre ce message d'avertissement, mais sans succès. Partage si tu trouves ^^

Re: [..] Envoi de mail au travers de outlook

Posté : jeu. 11 mars 2010 16:20
par peuchere83
J'ai trouvé la solution mais je n'ai pas l'explication et cela m'énerve !!!!

Déja je vais poster mon code pour que l'aide soit plus simple :

Code : Tout sélectionner

; Ce script à pour but :
; 1) De sélectionner automatiquement le destinataire du message en fonction du nom du client saisi dans le sujet et le corps du message
; 2) Afin d'éviter toute erreur d'envoi (mauvais destinataire.
; 3) Il ne fonctionne que sous outlook 2000 et 2003
; 4) Il envoi les mails au travers de outlook et ainsi les mails envoyés sont stockés dans la partie "messages envoyés"



#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#include <outlook.au3>
#include <Array.au3>
#include "_XMLDomWrapper.au3"   ; xml


#Region ### START Koda GUI section ### Form=f:\developpement\reseau\detourage\envoi_mail_securise\form1.kxf
$Form1_1 = GUICreate("Envoi de mail avec validation", 756, 352, 203, 115, BitOR($WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_BORDER,$WS_CLIPSIBLINGS))
$Ipt_Contact = GUICtrlCreateInput("", 120, 32, 569, 21)
GUICtrlSetState(-1, $GUI_DISABLE)
$Ipt_Sujet = GUICtrlCreateInput("", 120, 64, 569, 21)
$Edit_Message = GUICtrlCreateEdit("", 120, 96, 569, 169)
GUICtrlSetData(-1, "")
$Ipt_PJ = GUICtrlCreateInput("", 120, 272, 569, 21)
GUICtrlSetState(-1, $GUI_DISABLE)
$Label1 = GUICtrlCreateLabel("Contact (s)", 24, 32, 87, 23)
GUICtrlSetFont(-1, 12, 800, 0, "Arial")
GUICtrlSetColor(-1, 0x0000FF)
$Label2 = GUICtrlCreateLabel("Sujet", 24, 61, 43, 23)
GUICtrlSetFont(-1, 12, 800, 0, "Arial")
GUICtrlSetColor(-1, 0x0000FF)
$Label3 = GUICtrlCreateLabel("Message", 24, 95, 72, 23)
GUICtrlSetFont(-1, 12, 800, 0, "Arial")
GUICtrlSetColor(-1, 0x0000FF)
$Label4 = GUICtrlCreateLabel("P.J", 25, 270, 28, 23)
GUICtrlSetFont(-1, 12, 800, 0, "Arial")
GUICtrlSetColor(-1, 0x0000FF)
$Icon_Erreur = GUICtrlCreateIcon("F:\DEVELOPPEMENT\RESEAU\Envoi_mail_securise\attention.ico", 0, 704, 82, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP))
GUICtrlSetState($Icon_Erreur, $GUI_HIDE)
$Icon_PJ = GUICtrlCreateIcon("F:\DEVELOPPEMENT\RESEAU\Envoi_mail_securise\dossiers.ico", 0, 703, 268, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP))
$Btn_Envoyer = GUICtrlCreateButton("Envoyer", 176, 312, 91, 25, 0)
$Btn_Quitter = GUICtrlCreateButton("Quitter", 552, 312, 91, 25, 0)
$Btn_ListeClients = GUICtrlCreateButton("Liste clients", 368, 312, 91, 25, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


Global $AdresseComplete, $Adresse

$Subject = "Envoi du XX/XX/XXXX pour le client : "
$Message = "Bonjour," & @CRLF & @CRLF & Chr(9) & "Vous pouvez récupérer les XX images sur le serveur FTP client " & @CRLF & Chr(9) & "dans le répertoire : '/Retour_Images/Images_du_XX/XX/XXXX'" & @CRLF & @CRLF & @CRLF & "Merci et bonne récupération."
$PJ = ""

GUICtrlSetData($Ipt_Sujet, $Subject)
GUICtrlSetData($Edit_Message, $Message)
GUICtrlSetData($Ipt_PJ, $PJ)

$sFileXML = "\\frejus03\Projets\Xml\ConfClient.xml"
Local $TableauClients[1]


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Btn_Envoyer
            ; Réinitialisation de l'affichage en cas d'erreur
            GUICtrlSetState($Icon_Erreur, $GUI_HIDE)

;~          dim $Array_Client[1]=["Liste des clients"]
            $ValidationMail = False
            $Subject = GUICtrlRead($Ipt_Sujet)
            $Message = GUICtrlRead($Edit_Message)


            $ret = _XMLFileOpen ($sFileXML)
            For $i= 1 to _XMLGetNodeCount("//client") Step 1
                $NomClient = _XMLGetAttrib("/configuration/clients/client[" & $i & "]", "nom")      ; Liste de tous les clients du détourage

                ; Recherche du nom du client dans le sujet et dans le corps du message
                $ComparaisonSubject = StringInStr($Subject, $NomClient)
                $ComparaisonMessage = StringInStr($Message, $NomClient)
                If $ComparaisonSubject <> 0 And $ComparaisonMessage <> 0 Then   ; Test si le nom du client a été saisi dans les 2 champs
                    $ValidationMail = True
                    $AdresseComplete = ""
                    $Adresse = ""
                    $CHILDTEST=_XMLGetChildText("/configuration/clients/client[" & $i & "]")
                    $nbnode_mail=_XMLGetNodeCount("/configuration/clients/client[" & $i & "]/mail")
                    for $j=_XMLGetNodeCount("/configuration/clients/client[" & $i & "]/mail") to 1 Step -1      ; Récupère les mails du clients en partant du dernier
                        $Adresse=_XMLGetAttrib("/configuration/clients/client[" & $i & "]/mail[" & $j & "]","adresse")      ; Liste le mail du client
                        ; Affichage de toutes les adresses de contact
                        If $nbnode_mail > 1 Then
                            $AdresseComplete = $AdresseComplete & ";" & $Adresse
                        Else
                            $AdresseComplete = $Adresse
                        EndIf
                    Next
                    If StringLeft($AdresseComplete, 1) = ";" Then $AdresseComplete = StringTrimLeft($AdresseComplete,1)
                    GUICtrlSetData($Ipt_Contact, $AdresseComplete)
                    ExitLoop
                EndIf
            Next

                ;$Adresse = _XMLGetAttrib("/configuration/clients/client[" & $i & "]/mail", "adresse")   ; Récupération uniquement de la derniere @mail


            ; Test si le nombre d'images ou la date ont été saisies
            $ComparaisonSubject = StringInStr($Subject, "XX")
            $ComparaisonMessage = StringInStr($Message, "XX")
            If $ComparaisonSubject <> 0 Or $ComparaisonMessage <> 0 Then $ValidationMail = "Erreur"

            If $ValidationMail == True Then
                ; Envoi du mail
                If $AdresseComplete <> "" Then
                    $oOutlook = _OutlookOpen()
                    _OutlookSendMail($oOutlook, $AdresseComplete, "", "", $Subject, $Message, "", $olFormatHTML, "", @ScriptDir & "\OutlookWarning1.exe")

                    ; Prévenir l'utilisateur
                    MsgBox(64,"Information", "Votre mail a été correctement envoyé.",4)

                    ; Réinitialisation
                    GUICtrlSetData($Ipt_Contact, "")
                    $Subject = "Envoi du XX/XX/XXXX pour le client : "
                    $Message = "Bonjour," & @CRLF & @CRLF & Chr(9) & "Vous pouvez récupérer les XX images sur le serveur FTP client " & @CRLF & Chr(9) & "dans le répertoire : '/Retour_Images/Images_du_XX/XX/XXXX'" & @CRLF & @CRLF & @CRLF & "Merci et bonne récupération."
                    $PJ = ""

                    GUICtrlSetData($Ipt_Sujet, $Subject)
                    GUICtrlSetData($Edit_Message, $Message)
                    GUICtrlSetData($Ipt_PJ, $PJ)
                EndIf

            ElseIf $ValidationMail == "Erreur" Then
                ; Gestion d'erreur
                GUICtrlSetState($Icon_Erreur, $GUI_SHOW)
                Chr(7)
                GUICtrlSetData($Ipt_Contact, "")
                MsgBox(16, "Erreur", "La date ou le nombre d'images n'ont pas été saisies dans le sujet et/ou le corps du message." & @CRLF & "Veuillez corriger votre saisie.")

            Else
                ; Gestion d'erreur
                GUICtrlSetState($Icon_Erreur, $GUI_SHOW)
                Chr(7)
                GUICtrlSetData($Ipt_Contact, "")
                MsgBox(16, "Erreur", "Le nom du client n'a pas été saisi ou mal orthographié dans le sujet et/ou le corps du message." & @CRLF & "Veuillez corriger votre saisie.")
            EndIf

        Case $Btn_Quitter
            Exit

        Case $Btn_listeClients
            dim $Array_Client[1]=["Liste des clients"]
            $ret = _XMLFileOpen ($sFileXML)
            For $i= 1 to _XMLGetNodeCount("//client") Step 1
                $NomClient = _XMLGetAttrib("/configuration/clients/client[" & $i & "]", "nom")
                _ArrayAdd($Array_Client, $NomClient)
            Next
            _ArraySort($Array_Client,0,1)
            _ArrayDisplay($Array_Client, "Liste des clients du détourage")
    EndSwitch
WEnd
 
Si je sors le code d'envoi du mail de ma boucle while, cela fonctionne. Sinon le mail part mais il m'annonce que le handle est déjà ouvert et la je ne vois pas ou !!!!!

Au secours !!!!

Re: [..] Envoi de mail au travers de outlook

Posté : jeu. 11 mars 2010 16:37
par peuchere83
Pour ghostline,
il faut modifier le code car déjà (en tout cas celui que j'ai récupéré est en anglais) il faut le passer en français.

Ainsi que l'action sur les boutons le la longueur de la boucle (au cas ou que cela soit plus long à réagir)

Voici le code:

Code : Tout sélectionner

Opt("TrayIconHide", 1)          ;0=show, 1=hide tray icon
Opt("WinSearchChildren", 1)     ;0=no, 1=search children also

_OutlookWarning()
Func _OutlookWarning()
    For $iNum = 1 to 10
        If WinExists("Microsoft Office Outlook","Un programme tente d'envoyer automatiquement") Then
            While 1
                WinActivate("Microsoft Office Outlook")
                Sleep(500)
                If ControlCommand ("Microsoft Office Outlook","Un programme tente d'envoyer automatiquement","Button4","IsEnabled") Then
                    Sleep (500)
                    Send("{TAB 2}")
                    Send("{SPACE}")
                    ExitLoop 2
                EndIf
                Sleep (250)
            Wend
        EndIf
        Sleep(1000)
    Next
EndFunc
Tu as juste à compiler ce code est le tour est joué.

Bonne chance

Re: [..] Envoi de mail au travers de outlook

Posté : ven. 12 mars 2010 09:26
par peuchere83
Bon je continue sur mon problème pour l'instant tout seul :P

Le problème ne vient pas de la partie en voi de mail car je l'ai sortie dans une fonction et si je l'appelle avant le lancement de mon application principale je n'ai aucun message d'erreur.

Je suspecte donc que l'erreur vient de la lecture xml mais la cela me dépasse.

Voici l'erreur que j'obtiens :
erreur handle.JPG
Est il possible de forcer la fermeture d'un error handle ?
Quelqu'un saurait m'en dire un peu plus la dessus car la je sèche vraiment.

Par avance merci

PS : qu'elle balise dois je utiliser pour pouvoir masquer mon code et l'afficher lors du clic sur le bouton (dans le forum) ?

Re: [..] Envoi de mail au travers de outlook

Posté : ven. 12 mars 2010 10:04
par peuchere83
Bon après recherche sur le net le pb vient du fait que dans mon script 2 error event handle.
Or il ne peut y en avoir qu'un seul par script.

Donc 2 solutions :
soit j'arrive à supprimer le 1er handle (à le fermer) (mais je ne sais pas faire)
soit j'envoie le mail par un autre exécutable (autre script) appelé par le premier

Quelqu'un a t'il une suggestion ?

Re: [..] Envoi de mail au travers de outlook

Posté : ven. 12 mars 2010 11:08
par peuchere83
J'ai réussi à terminer mon script : il est maintenant pleinement fonctionnel.

Pour cela j'ai utilisé la 2ème solution : l'envoi du mail se fait dans un autre script qui est appelé par le premier et qui lui passe les paramètres pour son exécution.


Je ne mais pas encore le sujet en résolu car j'aimerai avoir plus d'infos sur la gestion du error handle ou bien faut il que je créé un nouveau sujet ?

Merci à tous