Page 1 sur 1

[R] Envoyer email avec image

Posté : mar. 26 nov. 2019 17:07
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

Re: [..] Envoyer email avec image

Posté : mar. 26 nov. 2019 22:15
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)

Re: [..] Envoyer email avec image

Posté : mer. 27 nov. 2019 08:47
par scorp84
Bonjour Walson,

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

Merci beaucoup.

Amicalement.

BM