Modify

Opened 10 years ago

Closed 9 years ago

#1262 closed Feature Request (Rejected)

Add SMTP AUTH to _INetSmtpMail() in inet.au3

Reported by: univeda Owned by: Jpm
Milestone: Component: Standard UDFs
Version: Severity: None
Keywords: SMTP AUTH Cc:

Description

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.

Attachments (0)

Change History (4)

comment:1 Changed 10 years ago by TicketCleanup

  • Version 3.3.0.0 deleted

Automatic ticket cleanup.

comment:2 Changed 10 years ago by Jpm

I don't know which version of _InetSmtpMail was used to add the capability but as I cannot test anymore, I will be glad to have an update base on current Release 3.3.2.0
Thanks

comment:3 Changed 10 years ago by Jpm

  • Owner changed from Gary to Jpm
  • Status changed from new to assigned

comment:4 Changed 9 years ago by Jpm

  • Resolution set to Rejected
  • Status changed from assigned to closed

Closed with lack of information

Guidelines for posting comments:

  • You cannot re-open a ticket but you may still leave a comment if you have additional information to add.
  • In-depth discussions should take place on the forum.

For more information see the full version of the ticket guidelines here.

Add Comment

Modify Ticket

Action
as closed The owner will remain Jpm.
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.