Sign in to follow this  
Followers 0
JamesHoho

the function _INetSmtpMail() in Inet.au3 doesn't work in Windows 98

2 posts in this topic

the function _INetSmtpMail() in Inet.au3 doesn't work in Windows 98

I need to inlude Inet.au3 in order to use _INetSmtpMail() ,but it is doesn't work in windows98 (i use the autoit3.2.12.1,it support windows 98) ,i am crazy

somebody help me to modify Inet.au3 then i can use _INetSmtpMail() in windows 98??

thanks a lot

i am looking forward for your reply

#include-once

#include "Date.au3"

; #INDEX# =======================================================================================================================
; Title .........: Edit Constants
; AutoIt Version : 3.0
; Language ......: English
; Description ...: Functions that assist with Internet.
; Author(s) .....: Larry, Ezzetabi, Jarvis Stubblefield, Wes Wolfe-Wolvereness, Wouter, Walkabout, Florian Fida
; Dll ...........: wininet.dll, ws2_32.dll, msvcrt.dll
; ===============================================================================================================================

; #FUNCTION# ====================================================================================================================
; Name...........: _GetIP
; Description ...: Get public IP address of a network/computer.
; Parameters ....: None
; Return values .: On Success - Returns the public IP Address
;                  On Failure - -1  and sets @ERROR = 1
; Author ........: Larry/Ezzetabi & Jarvis Stubblefield
; Remarks .......: Internet access.
; ===============================================================================================================================
Func _GetIP()
    Local $ip, $t_ip
    If InetGet("http://checkip.dyndns.org/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
        $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
        FileDelete(@TempDir & "\~ip.tmp")
        $ip = StringTrimLeft($ip, StringInStr($ip, ":") + 1)
        $ip = StringTrimRight($ip, StringLen($ip) - StringInStr($ip, "/") + 2)
        $t_ip = StringSplit($ip, '.')
        If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
            Return $ip
        EndIf
    EndIf
    If InetGet("http://www.whatismyip.com/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
        $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
        FileDelete(@TempDir & "\~ip.tmp")
        $ip = StringTrimLeft($ip, StringInStr($ip, "Your ip is") + 10)
        $ip = StringLeft($ip, StringInStr($ip, " ") - 1)
        $ip = StringStripWS($ip, 8)
        $t_ip = StringSplit($ip, '.')
        If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
            Return $ip
        EndIf
    EndIf
    Return SetError(1, 0, -1)
EndFunc   ;==>_GetIP

; #FUNCTION# ====================================================================================================================
; Name...........: _INetExplorerCapable
; Description ...: Convert a string to IE capable line
; Parameters ....: $s_IEString - String to convert to a capable IExplorer line
; Return values .: On Success - Returns the converted string
;                  On Failure - Blank String and @error = 1
; Author ........: Wes Wolfe-Wolvereness <Weswolf at aol dot com>
; ===============================================================================================================================
Func _INetExplorerCapable($s_IEString)
    If StringLen($s_IEString) <= 0 Then Return SetError(1, 0, '')
    Local $s_IEReturn
    Local $n_IEChar
    For $i_IECount = 1 To StringLen($s_IEString)
        $n_IEChar = '0x' & Hex(Asc(StringMid($s_IEString, $i_IECount, 1)), 2)
        If $n_IEChar < 0x21 Or $n_IEChar = 0x25 Or $n_IEChar = 0x2f Or $n_IEChar > 0x7f Then
            $s_IEReturn = $s_IEReturn & '%' & StringRight($n_IEChar, 2)
        Else
            $s_IEReturn = $s_IEReturn & Chr($n_IEChar)
        EndIf
    Next
    Return $s_IEReturn
EndFunc   ;==>_INetExplorerCapable

; #FUNCTION# ====================================================================================================================
; Name...........: _INetGetSource
; Description ...: Gets the source from an URL without writing a temp file.
; Parameters ....: $s_URL - The URL of the site.
;                  $bString - If True the data is returned in string format, otherwise binary format.
; Return values .: Success - The read string and sets @extended to the number of bytes returned.
;                  Failure - An empty string and and sets @error to non-zero.
; Author ........: Wouter van Kesteren.
; ===============================================================================================================================
Func _INetGetSource($s_URL, $bString = True)
    Local $sString = InetRead($s_URL, 1)
    Local $nError = @error, $nExtended = @extended
    If $bString Then $sString = BinaryToString($sString)
    Return SetError($nError, $nExtended, $sString)
EndFunc   ;==>_INetGetSource

; #FUNCTION# ====================================================================================================================
; Name...........: _INetMail
; Description ...: Open default mail client with given Address/Subject/Body
; Parameters ....: $s_MailTo    - Address for E-Mail
;                  $s_Subject   - Subject <Weswolf at aol dot com>of E-Mail
;                  $s_MailBody  - Body of E-Mail
; Return values .: On Success - Process ID of e-mail client
;                  On Failure - Returns 0 and sets @error to non-zero.
; Author ........: Wes Wolfe-Wolvereness <Weswolf at aol dot com>
; ===============================================================================================================================
Func _INetMail($s_MailTo, $s_MailSubject, $s_MailBody)
    Local $prev = Opt("ExpandEnvStrings", 1)
    Local $var = RegRead('HKCR\mailto\shell\open\command', "")
    Local $ret = Run(StringReplace($var, '%1', _INetExplorerCapable('mailto:' & $s_MailTo & '?subject=' & $s_MailSubject & '&body=' & $s_MailBody)))
    Local $nError = @error, $nExtended = @extended
    Opt("ExpandEnvStrings", $prev)
    Return SetError($nError, $nExtended, $ret)
EndFunc   ;==>_INetMail

; #FUNCTION# ====================================================================================================================
; Name...........: _INetSmtpMail
; Description ...: Sends an email using SMTP over TCP IP.
; Parameters ....: $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_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)
; Return values .: 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
; Author ........: Asimzameer, Walkabout
; Modified.......: Jpm
; ===============================================================================================================================
Func _INetSmtpMail($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_helo = "", $s_first=" ", $b_trace = 0)
    If $s_SmtpServer = "" Or $s_FromAddress = "" Or $s_ToAddress = "" Or $s_FromName = "" Or StringLen($s_FromName) > 256 Then Return SetError(1, 0 ,0)
    If $s_helo = "" Then $s_helo = @ComputerName

    If TCPStartup() = 0 Then Return SetError(2, 0 ,0)

    Local $s_IPAddress, $i_Count
    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()
        Return SetError(3, 0 ,0)
    EndIf
    Local $v_Socket = TCPConnect($s_IPAddress, 25)
    If $v_Socket = -1 Then
        TCPShutdown()
        Return SetError(4, 0 ,0)
    EndIf

    Local $s_Send[6], $s_ReplyCode[6]   ; Return code from SMTP server indicating success
    $s_Send[0] = "HELO " & $s_helo & @CRLF
    If StringLeft($s_helo,5) = "EHLO " Then $s_Send[0] = $s_helo & @CRLF
    $s_ReplyCode[0] = "250"

    $s_Send[1] = "MAIL FROM: <" & $s_FromAddress & ">" & @CRLF
    $s_ReplyCode[1] = "250"
    $s_Send[2] = "RCPT TO: <" & $s_ToAddress & ">" & @CRLF
    $s_ReplyCode[2] = "250"
    $s_Send[3] = "DATA" & @CRLF
    $s_ReplyCode[3] = "354"

    Local $aResult = _Date_Time_GetTimeZoneInformation()
    Local $bias = -$aResult[1]/60
    Local $biasH = Int($bias)
    Local $biasM = 0
    If $biasH <> $bias Then $biasM =  Abs($bias - $biasH) * 60
    $bias =  StringFormat(" (%+.2d%.2d)", $biasH, $biasM)

    $s_Send[4] =    "From:" & $s_FromName & "<" & $s_FromAddress & ">" & @CRLF & _
            "To:" & "<" & $s_ToAddress & ">" & @CRLF & _
            "Subject:" & $s_Subject & @CRLF & _
            "Mime-Version: 1.0" & @CRLF & _
            "Date: " & _DateDayOfWeek(@WDAY, 1) & ", " & @MDAY & " " & _DateToMonth(@MON, 1) & " " & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & $bias & @CRLF & _
            "Content-Type: text/plain; charset=US-ASCII" & @CRLF & _
            @CRLF
    $s_ReplyCode[4] = ""

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

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

    ; send header
    For $i_Count = 1 To UBound($s_Send) - 2
        If __SmtpSend($v_Socket, $s_Send[$i_Count], $s_ReplyCode[$i_Count], $b_trace) Then Return SetError(50 + $i_Count, 0 ,0)
    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 Return SetError(500 + $i_Count, 0, 0)
    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 Return SetError(5000, 0, 0)

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

; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name...........: __SmtpTrace
; Description ...: Used internally within this file, not for general use
; Syntax.........: __SmtpTrace($str[, $timeout = 0])
; Author ........: Asimzameer, Walkabout
; Modified.......: Jpm
; ===============================================================================================================================
Func __SmtpTrace($str, $timeout = 0)
    Local $W_TITLE = "SMTP trace"
    Local $s_SmtpTrace = ControlGetText($W_TITLE, "", "Static1")
    $str = StringLeft(StringReplace($str, @CRLF, ""), 70)
    $s_SmtpTrace &= @HOUR & ":" & @MIN & ":" & @SEC & " " & $str & @LF
    If WinExists($W_TITLE) Then
        ControlSetText($W_TITLE, "", "Static1", $s_SmtpTrace)
    Else
        SplashTextOn($W_TITLE, $s_SmtpTrace, 400, 500, 500, 100, 4 + 16, "", 8)
    EndIf
    If $timeout Then Sleep($timeout * 1000)
EndFunc   ;==>__SmtpTrace

; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name...........: __SmtpSend
; Description ...: Used internally within this file, not for general use
; Syntax.........: __SmtpSend($v_Socket, $s_Send, $s_ReplyCode, $b_trace[, $s_IntReply=""[, $s_first=""]])
; Author ........: Asimzameer, Walkabout
; Modified.......: Jpm
; ===============================================================================================================================
Func __SmtpSend($v_Socket, $s_Send, $s_ReplyCode, $b_trace, $s_IntReply="", $s_first="")
    Local $s_Receive, $i, $timer
    If $b_trace Then __SmtpTrace($s_Send)

    If $s_IntReply <> ""  Then

        ; Send special first char to awake smtp server
        If $s_first <> -1 Then
            If TCPSend($v_Socket, $s_first) = 0 Then
                TCPCloseSocket($v_Socket)
                TCPShutdown()
                Return 1; cannot send
            EndIf
        EndIf

        ; Check intermediate reply before HELO acceptation
        $s_Receive = ""
        $timer = TimerInit()
        While StringLeft($s_Receive,StringLen($s_IntReply)) <> $s_IntReply And TimerDiff($timer) < 45000
            $s_Receive = TCPRecv($v_Socket, 1000)
            If $b_trace And $s_Receive <> "" Then __SmtpTrace("intermediate->" & $s_Receive)
        WEnd
    EndIf

    ; Send string.
    If TCPSend($v_Socket, $s_Send) = 0 Then
        TCPCloseSocket($v_Socket)
        TCPShutdown()
        Return 1; cannot send
    EndIf

    $timer = TimerInit()

    $s_Receive = ""
    While $s_Receive = "" And TimerDiff($timer) < 45000
        $i += 1
        $s_Receive = TCPRecv($v_Socket, 1000)
        If $s_ReplyCode = "" Then ExitLoop
    WEnd

    If $s_ReplyCode <> "" Then
        ; Check replycode
        If $b_trace Then __SmtpTrace($i & " <- " & $s_Receive)

        If StringLeft($s_Receive, StringLen($s_ReplyCode)) <> $s_ReplyCode Then
            TCPCloseSocket($v_Socket)
            TCPShutdown()
            If $b_trace Then __SmtpTrace("<-> " & $s_ReplyCode, 5)
            Return 2; bad receive code
        EndIf
    EndIf

    Return 0
EndFunc   ;==>__SmtpSend

; #FUNCTION# ====================================================================================================================
; Name...........: _TCPIpToName
; Description ...: Resolves IP adress to Hostname
; Syntax ........:  _TCPIpToName($sIp, [[$iOption = 0], $hDll_Ws2_32 = "ws2_32.dll"]])
; Parameters ....: $sIp - Ip Adress in dotted (v4) Format
;                  $iOption - Optional, Default = 0
;                       0 = Return String Hostname
;                       1 = Return Array (see Notes)
;                  $hDll_Ws2_32 - Optional, Handle to ws2_32.dll
; Return values .: On Success - Hostname or Array (see Notes)
;                  On Failure - ""  and Set
;                                   @ERROR to:  1 - inet_addr DllCall Failed
;                                               2 - inet_addr Failed
;                                               3 - gethostbyaddr DllCall Failed
;                                               4 - gethostbyaddr Failed, WSAGetLastError = @Extended
;                                               5 - gethostbyaddr Failed, WSAGetLastError Failed
;                                               6 - strlen/sZStringRead Failed
;                                               7 - Error reading Aliases Array
; Author ........: Florian Fida
; Remarks .......: A successfull WSAStartup (Done by TCPStartup) is required.
;                   if $iOption = 1 then the returned Array looks Like this:
;                       $aResult[0] = Number of elemets
;                       $aResult[1] = "Hostname"
;                       $aResult[2] = "Alias 1"
;                       $aResult[3] = "Alias 2"
;                       ...
; ===============================================================================================================================
Func _TCPIpToName($sIp, $iOption = Default, $hDll_Ws2_32 = Default)
    Local $INADDR_NONE = 0xffffffff, $AF_INET = 2, $sSeparator = @CR
    If $iOption = Default Then $iOption = 0
    If $hDll_Ws2_32 = Default Then $hDll_Ws2_32 = "ws2_32.dll"
    Local $vaDllCall = DllCall($hDll_Ws2_32, "ulong", "inet_addr", "STR", $sIp)
    If @error Then Return SetError(1, 0, "") ; inet_addr DllCall Failed
    Local $vbinIP = $vaDllCall[0]
    If $vbinIP = $INADDR_NONE Then Return SetError(2, 0, "") ; inet_addr Failed
    $vaDllCall = DllCall($hDll_Ws2_32, "ptr", "gethostbyaddr", "ptr*", $vbinIP, "int", 4, "int", $AF_INET)
    If @error  Then Return SetError(3, 0, "") ; gethostbyaddr DllCall Failed
    Local $vptrHostent = $vaDllCall[0]
    If $vptrHostent = 0 Then
        $vaDllCall = DllCall($hDll_Ws2_32, "int", "WSAGetLastError")
        If @error Then Return SetError(5, 0, "") ; gethostbyaddr Failed, WSAGetLastError Failed
        Return SetError(4, $vaDllCall[0], "") ; gethostbyaddr Failed, WSAGetLastError = @Extended
    EndIf
    Local $vHostent = DllStructCreate("ptr;ptr;short;short;ptr", $vptrHostent)
    Local $sHostnames = __TCPIpToName_szStringRead(DllStructGetData($vHostent, 1))
    If @error Then Return SetError(6, 0, $sHostnames) ; strlen/sZStringRead Failed
    If $iOption = 1 Then
        Local $vh_aliases
        $sHostnames &= $sSeparator
        For $i = 0 To 63 ; up to 64 Aliases
            $vh_aliases = DllStructCreate("ptr", DllStructGetData($vHostent, 2) + ($i * 4))
            If DllStructGetData($vh_aliases, 1) = 0 Then ExitLoop ; Null Pointer
            $sHostnames &= __TCPIpToName_szStringRead(DllStructGetData($vh_aliases, 1))
            If @error Then
                SetError(7) ; Error reading array
                ExitLoop
            EndIf
        Next
        Return StringSplit(StringStripWS($sHostnames, 2), @CR)
    Else
        Return $sHostnames
    EndIf
EndFunc   ;==>_TCPIpToName

; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name...........: __TCPIpToName_szStringRead
; Description ...: Used internally within this file, not for general use
; Syntax.........: __TCPIpToName_szStringRead($iszPtr[, $iLen = -1])
; Author ........: Florian Fida
; ===============================================================================================================================
Func __TCPIpToName_szStringRead($iszPtr, $iLen = -1)
    Local $aStrLen, $vszString
    If $iszPtr < 1 Then Return "" ; Null Pointer
    If $iLen < 0 Then
        $aStrLen = DllCall("msvcrt.dll", "ulong_ptr:cdecl", "strlen", "ptr", $iszPtr)
        If @error Then Return SetError(1, 0, "") ; strlen Failed
        $iLen = $aStrLen[0] + 1
    EndIf
    $vszString = DllStructCreate("char[" & $iLen & "]", $iszPtr)
    If @error Then Return SetError(2, 0, "")
    Return SetExtended($iLen, DllStructGetData($vszString, 1))
EndFunc   ;==>__TCPIpToName_szStringRead

Share this post


Link to post
Share on other sites



It doesn't surprise me in the least. AutoIt no longer has support for Win 9x systems and it's very likely that the dll calls used won't work in 98.


George

Question about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.

Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.***

The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number.

Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else.

"Old age and treachery will always overcome youth and skill!"

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0