Opened 15 years ago
Closed 15 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 15 years ago by TicketCleanup
- Version 3.3.0.0 deleted
comment:2 Changed 15 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 15 years ago by Jpm
- Owner changed from Gary to Jpm
- Status changed from new to assigned
comment:4 Changed 15 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.
Automatic ticket cleanup.