﻿id	summary	reporter	owner	description	type	status	milestone	component	version	severity	resolution	keywords	cc
1262	Add SMTP AUTH to _INetSmtpMail() in inet.au3	univeda	Jpm	"The SMTP authentication is missing in _InetSmtpMail(). But todays Mailservers requires in allmost 100% an authentication. There is one good example which should be integrated into the standard-udf inet.au3. It comes from user bernd370 in the german forum:


{{{
;===============================================================================
;
; 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

    ; 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


;===============================================================================
;
; Function Name:    _Base64Encoding()
; Description:      Kodiert eine Zeichenfolge mit dem Base64-Verfahren 
;                   ([URL]http://de.wikipedia.org/wiki/Base64[/URL])
; 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

            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
}}}

Whould be very useful if this could be integrated into the standard-udf."	Feature Request	closed		Standard UDFs		None	Rejected	SMTP AUTH	
