[R] Envoyer email avec image

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
scorp84
Niveau 7
Niveau 7
Messages : 400
Enregistré le : mar. 04 nov. 2008 21:51
Localisation : Avignon, France
Status : Hors ligne

[R] Envoyer email avec image

#1

Message par scorp84 »

Bonjour à tous,

Je reviens vers vous avec une problématique : j'aimerai envoyer des mails avec des images à l'intérieur et non pas en PJ (des QR codes).

Le sujet suivant traite du sujet mais je n'ai pas compris comment faire :
viewtopic.php?t=13182

Apparemment, la fonction "_INetSmtpMailCom" ne supporte pas l'embed.

Quelqu'un aurait-il une solution simple ?

Merci d'avance.

Amicalement.

BM
Modifié en dernier par scorp84 le mer. 27 nov. 2019 08:47, modifié 1 fois.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Envoyer email avec image

#2

Message par walkson »

Bonjour,
Le code fonctionne avec Thunderbird, La poste et Free (Zimbra)
Ne fonctionne pas avec Orange et Gmail. Pour le reste, Outlook ou autres, je ne sais pas.
Choisir des images légères car elles sont écrites en binaire dans le corps du mail et ça peut peser lourd.
Je vous ai mis deux possibilités, soit une image sur disque dur, soit sur HTTP (InetRead())

Code : Tout sélectionner

#AutoIt3Wrapper_Run_AU3Check=n ;syntaxcheck désactivé plus de probleme avec "$objEmail.To"

           $file = FileOpenDialog("Fichier à convertir", @DesktopDir, "All images (*.png;*.jpg)")
        If @error Then Exit


        $f = FileOpen($file, 16)
        $t = FileRead($f)
        FileClose($f)
        $t = _Base64Encode($t)
		$w = _Base64Encode(InetRead("https://www.autoitscript.fr/forum/download/file.php?avatar=4001_1422642041.gif",1))
Global $as_Body = '<HTML>' & @CRLF
        $as_Body &= '<body>' & @CRLF
        $as_Body &= '<img style="width: 200px; height: 200px;" alt="Embedded Image" src="data:image/png;base64,' & $t & '">' & @CRLF
        $as_Body &= '<br><font color="red">' & @CRLF
        $as_Body &= 'Hello World' & @CRLF
        $as_Body &= '</font>' & @CRLF
		$as_Body &= '<br><br><img style="width: 50px; height: 100px;" alt="Embedded Image" src="data:image/gif;base64,' & $w & '">' & @CRLF
        $as_Body &= '</body></HTML>'

Func _Base64Encode($input)

            $input = Binary($input)

            Local $struct = DllStructCreate("byte[" & BinaryLen($input) & "]")

            DllStructSetData($struct, 1, $input)

            Local $strc = DllStructCreate("int")

            Local $a_Call = DllCall("Crypt32.dll", "int", "CryptBinaryToString", _
                    "ptr", DllStructGetPtr($struct), _
                    "int", DllStructGetSize($struct), _
                    "int", 1, _
                    "ptr", 0, _
                    "ptr", DllStructGetPtr($strc))

            If @error Or Not $a_Call[0] Then
                Return SetError(1, 0, "") ; error calculating the length of the buffer needed
            EndIf

            Local $a = DllStructCreate("char[" & DllStructGetData($strc, 1) & "]")

            $a_Call = DllCall("Crypt32.dll", "int", "CryptBinaryToString", _
                    "ptr", DllStructGetPtr($struct), _
                    "int", DllStructGetSize($struct), _
                    "int", 1, _
                    "ptr", DllStructGetPtr($a), _
                    "ptr", DllStructGetPtr($strc))

            If @error Or Not $a_Call[0] Then
                Return SetError(2, 0, ""); error encoding
            EndIf

            Return DllStructGetData($a, 1)

EndFunc   ;==>_Base64Encode

;====================================================== Envoi Mail Confirm =======================================================


$SmtpServer = "smtp.laposte.net"              ; address for the smtp-server to use - REQUIRED
$FromName = "   "                      ; name from who the email was sent
$FromAddress = "xx@laposte.net" ; address from where the mail should come
$ToAddress = "xx@free.fr"   ; destination address of the email - REQUIRED
$Subject = "Userinfo TEST 1"                   ; subject from the email - can be anything you want it to be
$Body = $as_Body                             ; the messagebody from the mail - can be left blank but then you get a blank mail
$AttachFiles = ""                       ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed
$CcAddress = "xx@laposte.net"       ; 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 = "xx@laposte.net"                    ; username for the account used from where the mail gets sent - REQUIRED
$Password = "xxxx"                  ; password for the account used from where the mail gets sent - REQUIRED
$IPPort = 465                           ; port used for sending the mail
$ssl = 1                                ; enables/disables secure socket layer sending - put to 1 if using httpS
;~ $IPPort=465                          ; GMAIL port used for sending the mail
;~ $ssl=1                               ; GMAILenables/disables secure socket layer sending - put to 1 if using httpS

;##################################
; Script
;##################################
Global $oMyRet[2]
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
$rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
If @error Then
    MsgBox(0, "Error sending message", "Error code:" & @error & "  Description:" & $rc)
EndIf
;
; The UDF
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
;
;
; Com Error Handler
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
Plus simplement, on peut récupérer une image sur un serveur en mettant par exemple dans le body
$as_Body &= '<br><br><img class="fit-picture" src="https://interactive-examples.mdn.mozilla.net/media/examples/grapefruit-slice-332-332.jpg" alt="Grapefruit ">' & @CRLF
et le code devrait être accepté partout (thunderbird demande l'autorisation de télécharger)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
scorp84
Niveau 7
Niveau 7
Messages : 400
Enregistré le : mar. 04 nov. 2008 21:51
Localisation : Avignon, France
Status : Hors ligne

Re: [..] Envoyer email avec image

#3

Message par scorp84 »

Bonjour Walson,

Une fois de plus une réponse ultra rapide et toujours aussi efficace :-)

Merci beaucoup.

Amicalement.

BM
Répondre