EMail mit Bild als HTML?

  • Hallo, suche seit Tagen (nicht nur hier im Forum) nach einer Lösung, komme aber nicht weiter, daher bitte ich um eure Hilfe!

    Ich möchte mit Autoit eine EMail verschicken und zwar eine sogenannte HTML-EMail mit "inline(?)"-Bild. Bislang bin ich den Umweg gegangen und habe mein EMail-Programm auf dem PC per Script gestartet und dort (alles per mouseclick-commandos etc) eine EMail erstellt, ein Bild einkopiert und versendet. Das Bild ist also nicht als Anhang drin, sondern befindet sich quasi im "body" der email eingebettet.
    Ich habe versucht eine solche EMail mit diesem Script hier:
    http://www.autoitscript.com/forum/topic/23…InetSmtpMailCom
    nachzubauen, scheitere aber an der BODY-Einbindung meines Bildes.

    Also, ich möchte das EMail-Script so ändern, dass es einfach nur eine einzelne Textzeile sendet, "IP xx.yy.zz.www 12:32 Uhr" (IP-Nr hab ich) und darunter soll sich gleich das Bild befinden. Es handelt sich hierbei um ein Bild was natürlich auf meiner Festplatte ist, sagen wir einfach es ist auf "c:\test.jpg", Grösse ist 320x240, JPEG-Format.

    Wie stelle ich es an??? Habe schon das Script geändert (Attachfiles raus etc., nur als html-email), habe mir von ner php-seite den inhalt des bodys ins script kopiert (auf dieser seite ganz unten stehts: http://www.infos24.de/phpe/handbuch/23_php_mail.htm#8), aber es funktioniert nicht. statt diesen "body" auszuführen bekomme ich als email einfach nur den text des body zum lesen - und natürlich kein bild weit und breit hilfe!!!

  • juhu! habs hinbekommen. hat zwar gedauert, aber geht!

    hier mein script (falls es jemand braucht), am anfang wird noch geprüft ob das bild zu gross ist. wenns zu gross ist (für eine stringvariable) wird es verkleinert mit hilfe des programmes irfanview (freeware). das programm liegt hier auf c:\iviewer. ansonsten kann man den teil auch weglassen mit dem verkleinern und einfach nur prüfen obs zu gross ist (dann kommt ne textmeldung dass das bild zu gross ist in der email)

    [autoit]


    #include <INet.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _sendmail("emailtext","c:\test2.jpg")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $err = @error
    If @error = 0 Then
    MsgBox(0, "Success!", "Mail sent")
    Else
    MsgBox(0, "Error!", "Mail failed with error code " & $err)
    EndIf
    Exit

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _SendMail($s_text,$s_bild, $s_Subject="betreff", $s_FromName="absender", $s_SmtpServer="mail.gmx.net", $s_FromAddress="emailadresse@gmx.net", $s_ToAddress="emailadresse@wohin.de", $s_AttachFiles="", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $img,$file

    [/autoit][autoit][/autoit][autoit]

    $as_Body=$s_text&"<br>"&@CR ;text in email

    ;check ob ild zu gross...
    if FileGetSize($s_bild)>32000 Then
    ;resize-try
    $img=StringLeft($s_bild,stringlen($s_bild)-4)&"_org"&StringRight($s_bild,4)
    FileCopy($s_bild,$img,1)
    ShellExecuteWait("c:\bats\iviewer\i_view32.exe",$img&" /jpgq=60 /convert="&$s_bild)
    EndIf
    ;check ende

    [/autoit][autoit][/autoit][autoit]

    if FileGetSize($s_bild)>32000 Then
    $as_Body=$as_Body&"<br>Bild (zu gross)"
    Else
    $file=FileOpen($s_bild,16)
    $img=FileRead($file)
    FileClose($file)
    ;bild in email
    $as_body=$as_body&"<img src='data:image/"&StringRight($s_bild,3)&";base64,"&_base64($img)&"' alt='pic'>"
    EndIf

    [/autoit][autoit][/autoit][autoit]

    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 $objEmail.AddAttachment ($s_AttachFiles)

    $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

    [/autoit][autoit][/autoit][autoit]

    Func _Base64($Data, $LineBreak = 76)
    Local $Opcode = "0x5589E5FF7514535657E8410000004142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2F005A8B5D088B7D108B4D0CE98F0000000FB633C1EE0201D68A06880731C083F901760C0FB6430125F0000000C1E8040FB63383E603C1E60409C601D68A0688470183F90176210FB6430225C0000000C1E8060FB6730183E60FC1E60209C601D68A06884702EB04C647023D83F90276100FB6730283E63F01D68A06884703EB04C647033D8D5B038D7F0483E903836DFC04750C8B45148945FC66B80D0A66AB85C90F8F69FFFFFFC607005F5E5BC9C21000"

    [/autoit][autoit][/autoit][autoit]

    Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
    DllStructSetData($CodeBuffer, 1, $Opcode)

    [/autoit][autoit][/autoit][autoit]

    $Data = Binary($Data)
    Local $Input = DllStructCreate("byte[" & BinaryLen($Data) & "]")
    DllStructSetData($Input, 1, $Data)

    [/autoit][autoit][/autoit][autoit]

    $LineBreak = Floor($LineBreak / 4) * 4
    Local $OputputSize = Ceiling(BinaryLen($Data) * 4 / 3)
    $OputputSize = $OputputSize + Ceiling($OputputSize / $LineBreak) * 2 + 4

    [/autoit][autoit][/autoit][autoit]

    Local $Ouput = DllStructCreate("char[" & $OputputSize & "]")
    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
    "ptr", DllStructGetPtr($Input), _
    "int", BinaryLen($Data), _
    "ptr", DllStructGetPtr($Ouput), _
    "uint", $LineBreak)
    Return DllStructGetData($Ouput, 1)
    EndFunc

    [/autoit]

    3 Mal editiert, zuletzt von an9el (13. April 2012 um 01:06)

  • Aber die Lösung ist auf eine bestimmte Bildgröße beschränkt.
    Bekomme folgende Meldungin der Email: Bild (zu gross)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hi, wieso Irfanview, wenn GDI auch Bilder verkleinern kann?

  • Zunächst einmal die aktuelle Version, da bei einem Fehler ein Programmabbruch stattfand. Nun habe ich noch eine error-Routine hinzugefügt, so dass man einen möglichen fehler auslesen kann. Ist mir nämlich passiert, da bei einem versand über gmx noch der "username" und "password" erforderlich ist!!!

    [autoit]

    #include <INet.au3>
    ;für mailfunc?

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Global $oMyRet[2]
    Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $h=_SendMail("Emailtext..blabla","c:\test.jpg","diezieladresse@gmx.net","betreff","von")
    if $h<>"" Then
    MsgBox(0,"EMAIL-ERROR",$h)
    Else
    MsgBox(0,"EMAIL","Erfolgreich versandt")
    EndIf

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _SendMail($s_text,$s_bild, $s_ToAddress, $s_Subject, $s_FromName, $s_SmtpServer="mail.gmx.net", $s_FromAddress="mailadresse@gmx.net", $s_AttachFiles="", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "username", $s_Password = "password", $IPPort = 25, $ssl = 0)
    Local $img,$file,$as_body

    $as_Body=$s_text&"<br>"&@CR ;text in email

    [/autoit][autoit][/autoit][autoit]

    if $s_bild<>"" Then
    ;check ob ild zu gross...
    if FileGetSize($s_bild)>32000 Then
    ;resize-try
    $img=StringLeft($s_bild,stringlen($s_bild)-4)&"_org"&StringRight($s_bild,4)
    FileCopy($s_bild,$img,1)
    ShellExecuteWait("c:\bats\iviewer\i_view32.exe",$img&" /jpgq=60 /convert="&$s_bild)
    EndIf
    ;check ende
    if FileGetSize($s_bild)>32000 Then
    $as_Body=$as_Body&"<br>Bild (zu gross)" ;wurde bereits mit jpgq=60 gespeichert...
    Else
    $file=FileOpen($s_bild,16)
    $img=FileRead($file)
    FileClose($file)
    ;bild in email
    $as_body=$as_body&"<img src='data:image/"&StringRight($s_bild,3)&";base64,"&_base64($img)&"' alt='pic'>"
    EndIf
    EndIf

    [/autoit][autoit][/autoit][autoit]

    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 $objEmail.AddAttachment ($s_AttachFiles)

    $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

    [/autoit][autoit][/autoit][autoit]

    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

    [/autoit][autoit][/autoit][autoit]

    Func _Base64($Data, $LineBreak = 76)
    Local $Opcode = "0x5589E5FF7514535657E8410000004142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2F005A8B5D088B7D108B4D0CE98F0000000FB633C1EE0201D68A06880731C083F901760C0FB6430125F0000000C1E8040FB63383E603C1E60409C601D68A0688470183F90176210FB6430225C0000000C1E8060FB6730183E60FC1E60209C601D68A06884702EB04C647023D83F90276100FB6730283E63F01D68A06884703EB04C647033D8D5B038D7F0483E903836DFC04750C8B45148945FC66B80D0A66AB85C90F8F69FFFFFFC607005F5E5BC9C21000"

    [/autoit][autoit][/autoit][autoit]

    Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
    DllStructSetData($CodeBuffer, 1, $Opcode)

    [/autoit][autoit][/autoit][autoit]

    $Data = Binary($Data)
    Local $Input = DllStructCreate("byte[" & BinaryLen($Data) & "]")
    DllStructSetData($Input, 1, $Data)

    [/autoit][autoit][/autoit][autoit]

    $LineBreak = Floor($LineBreak / 4) * 4
    Local $OputputSize = Ceiling(BinaryLen($Data) * 4 / 3)
    $OputputSize = $OputputSize + Ceiling($OputputSize / $LineBreak) * 2 + 4

    [/autoit][autoit][/autoit][autoit]

    Local $Ouput = DllStructCreate("char[" & $OputputSize & "]")
    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
    "ptr", DllStructGetPtr($Input), _
    "int", BinaryLen($Data), _
    "ptr", DllStructGetPtr($Ouput), _
    "uint", $LineBreak)
    Return DllStructGetData($Ouput, 1)
    EndFunc

    [/autoit]

    Alina: Ich selbst habe mir dieses Script auch aus diversen Links und Beispielen im www zusammengebastelt. Da in der eigentlichen EMail-Function die Stringvariable $objEmail.HTMLBody(=$as_Body) genutzt wird ist die maximale datenanzahl auf 32768 bytes beschränkt. da gehen noch ein paar weg für den restlichen html-code, daher habe ich bilder über 32kb vorab versucht zu verkleinern.
    wenn hier jemand weiss wie man das umgehen kann: her mit tips!

    @andy:daher auch gleich zu deiner frage: was soll gdi ein? habe keine function bei autoit gefunden die so heisst. und zu irfanview: 1.wandelt mir irfanview jedes bild in ein jpeg-bild um und gleichzeitig 2.kann ich die grösse des bildes (also bytes) stufenlos nach unten schrauben, indem ich die qualität des jpg-bildes angebe. bei einer qualität von 60 (jpgq=60) wird das originalbild nur unwesentlich schlechter, aber die dateigrösse schrumpft beträchtlich. und da ich ja das problem mit den 32kbytes habe..nunja...2 fliegen mit 1 klappe.

    @progandy: sorry, wie gesagt, habe mir dieses scipt selbst hier und da gesucht und zusammengebastelt, weiss also selbst nicht genau wie die eigentliche mail-function arbeitet (brauche ich da das include inet.au3 überhaupt???). jedenfalls weiss ich also 1.nicht wie ich das in autoit schreiben sollte und 2.welchen vorteil habe ich den damit?


    edit: zeile 9 geändert, "von" hat gefehlt.

    4 Mal editiert, zuletzt von an9el (15. April 2012 um 22:51)

  • @progandy: sorry, wie gesagt, habe mir dieses scipt selbst hier und da gesucht und zusammengebastelt, weiss also selbst nicht genau wie die eigentliche mail-function arbeitet (brauche ich da das include inet.au3 überhaupt???). jedenfalls weiss ich also 1.nicht wie ich das in autoit schreiben sollte und 2.welchen vorteil habe ich den damit?


    Die inet.au3 brauchst du vermutlich nicht mehr.
    So weit ich weiß unterstützt Outlook keine data-URLs. Da ich es aber schon ewig nicht mehr verwende bin ich mir nicht mehr ganz sicher. Wenn deine Mailempfänger also Outlook (Express) als Mailclient nutzen, ist eine data-URL schlecht und du solltest das Bild über AddRelatedBodypart anhängen.