INetSendMail

    • Offizieller Beitrag

    Hi!

    Laut meiner 3.2.2.0-Hilfe gibt es:

    #include <INet.au3>

    $Address = InputBox('Address', 'Enter the E-Mail address to send message to')
    $Subject = InputBox('Subject', 'Enter a subject for the E-Mail')
    $Body = InputBox('Body', 'Enter the body (message) of the E-Mail')
    MsgBox(0,'E-Mail has been opened','The E-Mail has been opened and process identifier for the E-Mail client is ' & _INetMail($address, $subject, $body))

    oder


    #include <INet.au3>

    $s_SmtpServer = "mysmtpserver.com.au"
    $s_FromName = "My Name"
    $s_FromAddress = "From eMail Address"
    $s_ToAddress = "To eMail Address"
    $s_Subject = "My Test UDF"
    Dim $as_Body[2]
    $as_Body[0] = "Testing the new email udf"
    $as_Body[1] = "Second Line"
    $Response = _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body)
    $err = @error
    If $Response = 1 Then
    MsgBox(0, "Success!", "Mail sent")
    Else
    MsgBox(0, "Error!", "Mail failed with error code " & $err)
    EndIf


    Mag sein, dass es INetSendMail mal gab, aktuell scheint es aber nicht so zu sein.
    Achte darauf die Includes zu verwenden, wenn du den Code übernimmst.
    Sollte es immer noch nicht klappen, dann poste bitte deinen ganzen Code (ohne Login-Daten).

    peethebee

  • Sorry mein Fehler,

    ...ist das 2. Script - also INetSmtpMail

    [autoit]


    #include <INet.au3>

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

    $s_SmtpServer = "mx.freenet.de"
    $s_FromName = @Username
    $s_FromAddress = "johndoe@freenet.de"
    $s_ToAddress = "janedoe@freenet.de"
    $s_Subject = "My Test UDF"
    Dim $as_Body[2]
    $as_Body[0] = "Testing the new email udf"
    $as_Body[1] = "Second Line"
    $Response = _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body)
    $err = @error
    If $Response = 1 Then
    MsgBox(0, "Success!", "Mail sent")
    Else
    MsgBox(0, "Error!", "Mail failed with error code " & $err)
    EndIf

    [/autoit]

    Das ist quasi bis auf "John" und "Jane Doe" der original verwendete Code...

    Greetz!
    TB

  • Meine AutoIt Version ist 3.2.2.0 und dürfte aktuell sein.

    Inzwischen konnte ich die Fehlermeldung nicht abschalten, aber immerhin auf eine halbwegs dokumentierte reduzieren:

    Zitat


    @ERROR = 5x - Cannot open SMTP session. x indicates the index number of last command issued to the SMTP server.

    Der Wert von $err ist 50 ! Anscheinend kann ich mich nicht am SMTP Server authentifizieren ?

    Funktioniert das über den Parameter $s_ehlo und wenn ja, wie ?

    Greetz!
    TB

    • Offizieller Beitrag

    Hi!

    Keine Ahnung, ob es daran liegt, aber früher (?) verlangten manche E-Mail-Anbieter ein Abrufen des Kontos vor dem Versenden. Nur Versenden könnte dann den Authetifizierungserror auslösen. Ich errinnere mich, dass diese Funktion bei mir über smtp.gmx.de bestens funktioniert hat, etwa zu Zeiten von Version 3.1.1.100. Könnte also am Anbieter liegen...

    peethebee

    • Offizieller Beitrag

    Hallo!

    Hier die Lösung des Problems:

    Spoiler anzeigen
    [autoit]

    #include <INet.au3>

    $s_SmtpServer = "mx.freenet.de"
    $s_FromName = "Bernd670"
    $s_FromAddress = "bernd670@freenet.de"
    $s_ToAddress = "bernd670@gmx.de"
    $s_Subject = "My Test UDF"
    $s_UName = "bernd670@freenet.de"
    $s_PWD = "passwort"
    Dim $as_Body[2]
    $as_Body[0] = "Testing the new email udf"
    $as_Body[1] = "Second Line"
    $Response = _INetSmtpMailAuth ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_UName, $s_PWD, $s_Subject, $as_Body, "EHLO ")
    ;~ $Response = _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body)
    $err = @error
    If $Response = 1 Then
    MsgBox(0, "Success!", "Mail sent")
    Else
    MsgBox(0, "Error!", "Mail failed with error code " & $err)
    EndIf

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

    ;===============================================================================
    ;
    ; Function Name: _INetSmtpMailAuth()
    ; Description: Sends an email using SMTP over TCP IP.
    ; Parameter(s): $s_SmtpServer - SMTP server to be used for sending email
    ; $s_FromName - Name of sender
    ; $s_FromAddress - eMail address of sender
    ; $s_ToAddress - Address that email is to be sent to
    ; $s_Username - Username for Authentication (bernd670)
    ; $s_Passwd - Password for Authentication (bernd670)
    ; $s_Subject - Subject of eMail
    ; $as_Body - Single dimension array containing the body of eMail as strings
    ; $s_helo - Helo identifier (default @COMPUTERNAME) sometime needed by smtp server
    ; $s_first - send before Helo identifier (default @CRLF) sometime needed by smtp server
    ; $b_trace - trace on a splash window (default 0 = no trace)
    ; Requirement(s): None
    ; Return Value(s): On Success - Returns 1
    ; On Failure - 0 and sets
    ; @ERROR = 1 - Invalid Parameters
    ; @ERROR = 2 - Unable to start TCP
    ; @ERROR = 3 - Unable to resolve IP
    ; @ERROR = 4 - Unable to create socket
    ; @ERROR = 5x - Cannot open SMTP session
    ; @ERROR = 50x - Cannot send body
    ; @ERROR = 5000 - Cannot close SMTP session
    ; Authors: Original function to send email via TCP - Asimzameer
    ; Conversion to UDF - Walkabout
    ; Correction Helo, timeout, trace - Jpm
    ; Correction send before Helo - Jpm
    ; Include Authentication - bernd670
    ;
    ;===============================================================================
    Func _INetSmtpMailAuth($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Username, $s_Passwd, $s_Subject = "", $as_Body = "", $s_helo = "", $s_first="-1", $b_trace = 0)

    Local $v_Socket
    Local $s_IPAddress
    Local $i_Count
    Local $s_Send[9]
    Local $s_ReplyCode[9];Return code from SMTP server indicating success

    If $s_SmtpServer = "" Or $s_FromAddress = "" Or $s_ToAddress = "" Or $s_Username = "" Or $s_Passwd = "" Or $s_FromName = "" Or StringLen($s_FromName) > 256 Then
    SetError(1)
    Return 0
    EndIf
    If $s_helo = "" Then $s_helo = @ComputerName
    If TCPStartup() = 0 Then
    SetError(2)
    Return 0
    EndIf
    StringRegExp($s_SmtpServer, "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")
    If @extended Then
    $s_IPAddress = $s_SmtpServer
    Else
    $s_IPAddress = TCPNameToIP($s_SmtpServer)
    EndIf
    If $s_IPAddress = "" Then
    TCPShutdown()
    SetError(3)
    Return 0
    EndIf
    $v_Socket = TCPConnect($s_IPAddress, 25)
    If $v_Socket = -1 Then
    TCPShutdown()
    SetError(4)
    Return (0)
    EndIf

    $s_Send[0] = "HELO " & $s_helo & @CRLF
    If StringLeft($s_helo,5) = "EHLO " Then $s_Send[0] = "EHLO " & $s_helo & @CRLF
    $s_ReplyCode[0] = "250"

    $s_Send[1] = "AUTH LOGIN" & @CRLF
    $s_ReplyCode[1] = "334"
    $s_Send[2] = _Base64Encoding($s_Username) & @CRLF
    $s_ReplyCode[2] = "334"
    $s_Send[3] = _Base64Encoding($s_Passwd) & @CRLF
    $s_ReplyCode[3] = "235"
    $s_Send[4] = "MAIL FROM: <" & $s_FromAddress & ">" & @CRLF
    $s_ReplyCode[4] = "250"
    $s_Send[5] = "RCPT TO: <" & $s_ToAddress & ">" & @CRLF
    $s_ReplyCode[5] = "250"
    $s_Send[6] = "DATA" & @CRLF
    $s_ReplyCode[6] = "354"

    $s_Send[7] = "From: " & $s_FromName & " <" & $s_FromAddress & ">" & @CRLF & _
    "To: " & "<" & $s_ToAddress & ">" & @CRLF & _
    "Subject: " & $s_Subject & @CRLF & _
    "Mime-Version: 1.0" & @CRLF & _
    "Content-Type: text/plain; charset=US-ASCII" & @CRLF & _
    @CRLF
    $s_ReplyCode[7] = ""

    $s_Send[8] = @CRLF & "." & @CRLF
    $s_ReplyCode[8] = "250"

    ; open stmp session
    If _SmtpSend($v_Socket, $s_Send[0], $s_ReplyCode[0], $b_trace, "220", $s_first) Then
    SetError(50)
    Return 0
    EndIf

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

    ; send header
    For $i_Count = 0 To UBound($s_Send) - 2
    If _SmtpSend($v_Socket, $s_Send[$i_Count], $s_ReplyCode[$i_Count], $b_trace) Then
    SetError(50 + $i_Count)
    Return 0
    EndIf
    Next

    ; send body records (a record can be multiline : take care of a subline beginning with a dot should be ..)
    For $i_Count = 0 To UBound($as_Body) - 1
    ; correct line beginning with a dot
    If StringLeft($as_Body[$i_Count], 1) = "." Then $as_Body[$i_Count] = "." & $as_Body[$i_Count]

    If _SmtpSend($v_Socket, $as_Body[$i_Count] & @CRLF, "", $b_trace) Then
    SetError(500 + $i_Count)
    Return 0
    EndIf
    Next

    ; close the smtp session
    $i_Count = UBound($s_Send) - 1
    If _SmtpSend($v_Socket, $s_Send[$i_Count], $s_ReplyCode[$i_Count], $b_trace) Then
    SetError(5000)
    Return 0
    EndIf

    TCPCloseSocket($v_Socket)
    TCPShutdown()
    Return 1
    EndFunc ;==>_INetSmtpMailAuth

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

    ;===============================================================================
    ;
    ; Function Name: _Base64Encoding()
    ; Description: Kodiert eine Zeichenfolge mit dem Base64-Verfahren
    ; (http://de.wikipedia.org/wiki/Base64)
    ; Parameter(s): $String - Zeichenfolge die kodiert werden soll
    ; Requirement(s): None
    ; Return Value(s): Kodierte Zeichenfolge
    ; Authors: bernd670
    ;
    ;===============================================================================
    Func _Base64Encoding ($String)

    $strUmsetzung = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    $strRetValue = ""

    For $i = 1 To StringLen($String) Step 3
    $strTok = StringMid($String,$i,3)
    Switch StringLen($strTok)
    Case 3
    $iTokVal = (Asc(StringMid($strTok,1,1)) * 256 + _
    Asc(StringMid($strTok,2,1))) * 256 + _
    Asc(StringMid($strTok,3,1))
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1)
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $strRetValue &= $strTokCryt

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

    Case 2
    $iTokVal = (Asc(StringMid($strTok,1,1)) * 256 + _
    Asc(StringMid($strTok,2,1))) * 256
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1)
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $strRetValue &= $strTokCryt & "="

    Case 1
    $iTokVal = Asc(StringMid($strTok,1,1)) * 65536
    $iTokVal = BitShift($iTokVal,12)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1)
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $strRetValue &= $strTokCryt & "=="

    EndSwitch
    Next

    Return $strRetValue
    EndFunc

    [/autoit]

    Die Funktion _INetSmtpMail bietet keine Möglichkeit sich am SMTP-Server zu authentifizieren, heutzutage ist aber so das die meisten SMTP-Server eine Authentifizierung verlangen.

    Die Funktion _INetSmtpMailAuth habe ich um diese funktionalität ergänzt.

    Ausserdem hänge ich noch die korrigierte Datei INet.au3 an, in der Orignaldatei wurde der Standardwert für $s_first verkehrt angegeben.

    Edit bernd670 (18.04.07): Dank skyteddy habe ich noch einen Fehler in der Funktion _INetSmtpMailAuth gefunden und behoben. Der Fehler ist beim smtp.1und1.de aufgetreten. Die korrigierte Version Funktioniert mit 1und1, gmx und web. Bei Freenet muss der Parameter $s_helo auf "EHLO " (leerzeichen nach O beachten) gesetzt werden, dann funktioniert auch mit Freenet.

  • bernd670

    Tolle Erweiterung, doch leider bekomme ich error code 51. Eigentlich würde ich meinen, hätte ich alle Variablen mit den richtigen Werten befüllt. Hast Du ne Idee, was da falsch gelaufen sein kann?

    Besten Dank schon mal und viele Grüße!
    skyteddy

  • Hallo.

    Coole Sache. Eigentlich das richtige für ein USB-Stick, das man ins I-Net-Cafe gehen kann, seine Mails schnell lesen kann und empfangenen gleich auf USB-Stick mit nehmen kann ;)

    Okay, war nur so ein Gedankensprung. Ich halt.

    LG Lina

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    • Offizieller Beitrag

    Hallo!

    skyteddy, Fehlercode 51 weisst daraufhin das der Befehl "AUTH LOGIN" nicht erkannt wird. Vllt hast du auch den SMTP-Server nicht korrekt angegeben. Mit welchem EMail-Anbieder hast du es den probiert? Evtl. mal den Code einstellen (ohne Passwort) dann kann ich mal drüberschauen.

  • Hallo Bernd,

    Zitat

    Original von bernd670
    skyteddy, Fehlercode 51 weisst daraufhin das der Befehl "AUTH LOGIN" nicht erkannt wird. Vllt hast du auch den SMTP-Server nicht korrekt angegeben. Mit welchem EMail-Anbieder hast du es den probiert? Evtl. mal den Code einstellen (ohne Passwort) dann kann ich mal drüberschauen.

    ich benutze exakt Dein Beispiel von oben, lediglich mit dem smtp-Server von 1und1, meinen Namen, Email-Adresse und Passwort. Zugangsdaten stimmen. Ich habe sie gerade in einem neuen SeaMonkey-Profile ausprobiert.

    smtp: smtp.1und1.de

    Ich kann Dir gerne meine Postfachkennung per PM schicken. Von mir aus auch meinen modifizierten Code.

    Besten Dank schon mal!
    skyteddy

    Einmal editiert, zuletzt von skyteddy (17. April 2007 um 23:09)

    • Offizieller Beitrag

    Hallo!

    Nein, der smtp.1und1.de kennt das kommando AUTH LOGIN, daran kann es also nicht liegen, du kannst ja mal noch einen Text für die Variable $s_helo angeben. Das kann ein xbelibiger Text sein er darf nur keine Leer- und Sonderzeichen enthalten, ansonsten schicke mir mal deinen Code!

    Edit bernd670: Fehler behoben! -> Edit vom 18.04.07 beachten!

  • Hallo zusammen,

    schönes Scirpt nur leider ist Port 25 bei uns deaktiviert in der Firma. Gibt es eine andere möglichkeit? Port 80 HTTP ist natürlich frei :)

  • ich möchte mich ja nicht unnötig dazwischenklemmen, aber die fälschlicherweise angesproche funktion "INetSendMail" hört sich für mich ganz nice an, aber kann man damit auch anhänge verschicken?
    also direkt im code.

    ansonsten heisst es ja "Öffnet das Standard-Mailprogramm mit der angegeben Adresse, Betreff, und Inhalt."

    d.h. falls das nicht geht, kann ich per tastenkombi "anhang" wählen und dann mein file automatisch auswählen lassen.

    • Offizieller Beitrag

    Hallo!

    @Flitzer: Kannst Du den auf anderem Wege EMails aus der Firma ins Internet senden?

    sc4ry: Momentan kann man nur reinen Text mit senden (Content-Type: text/plain; charset=US-ASCII), um Anhänge mitsenden zu können muss man den Content-Type ändern und die Funktion entsprechend anpassen (viel Arbeit) ;-).

  • ja leider nur über Exchange.
    SMTP sowie POP sind aus Sicherheitsgründen deaktiviert.
    Hoffe es gibt ne Lösung dazu. 1000 Dank