可能需要给 smtp.163.net 或 smtp.163.com 在请求smtp验证密码时,由VB将此密码送出,如何实现?

解决方案 »

  1.   

    请大家看看应该如何修改?  才能实现smtp验证?
    Private Enum SMTP_State
        MAIL_CONNECT
        MAIL_HELO
        MAIL_FROM
        MAIL_RCPTTO
        MAIL_DATA
        MAIL_DOT
        MAIL_QUIT
    End Enum If strResponseCode = "250" Or _
           strResponseCode = "220" Or _
           strResponseCode = "354" Then
           
            Select Case m_State
                Case MAIL_CONNECT
                    'Change current state of the session
                    m_State = MAIL_HELO
                    '
                    'Remove blank spaces
                    strDataToSend = Trim$(txtSender)
                    '
                    'Retrieve mailbox name from e-mail address
                    strDataToSend = Left$(strDataToSend, _
                                    InStr(1, strDataToSend, "@") - 1)
                    'Send HELO command to the server
                    Winsock1.SendData "HELO " & strDataToSend & vbCrLf
                    '
                    Debug.Print "HELO " & strDataToSend
                    '
                Case MAIL_HELO
                    '
                    'Change current state of the session
                    m_State = MAIL_FROM
                    '
                    'Send MAIL FROM command to the server
                    Winsock1.SendData "MAIL FROM:" & Trim$(txtSender) & vbCrLf
                    '
                    Debug.Print "MAIL FROM:" & Trim$(txtSender)
                    '
                Case MAIL_FROM
                    '
                    'Change current state of the session
                    m_State = MAIL_RCPTTO
                    '
                    'Send RCPT TO command to the server
                    Winsock1.SendData "RCPT TO:" & Trim$(txtRecipient) & vbCrLf
                    '
                    Debug.Print "RCPT TO:" & Trim$(txtRecipient)
                    '
                Case MAIL_RCPTTO
                    '
                    'Change current state of the session
                    m_State = MAIL_DATA
                    '
                    'Send DATA command to the server
                    Winsock1.SendData "DATA" & vbCrLf
                    '
                    Debug.Print "DATA"
                    '
                Case MAIL_DATA
                    '
                    'Change current state of the session
                    m_State = MAIL_DOT
                    '
                    'So now we are sending a message body
                    'Each line of text must be completed with
                    'linefeed symbol (Chr$(10) or vbLf) not with vbCrLf
                    '
                    'Send Subject line
                    Winsock1.SendData "Subject:" & txtSubject & vbLf & vbCrLf
                    '
                    Debug.Print "Subject:" & txtSubject
                    '
                    Dim varLines    As Variant
                    Dim varLine     As Variant
                    Dim strMessage  As String
                    '
                    'Add atacchments
                    strMessage = txtMessage & vbCrLf & vbCrLf & m_strEncodedFiles
                    'clear memory
                    m_strEncodedFiles = ""
                    'Parse message to get lines (for VB6 only)
                    varLines = Split(strMessage, vbCrLf)
                    'clear memory
                    strMessage = ""
                    '
                    'Send each line of the message
                    For Each varLine In varLines
                        Winsock1.SendData CStr(varLine) & vbLf
                        '
                        Debug.Print CStr(varLine)
                    Next
                    '
                    'Send a dot symbol to inform server
                    'that sending of message comleted
                    Winsock1.SendData "." & vbCrLf
                    '
                    Debug.Print "."
                    '
                Case MAIL_DOT
                    'Change current state of the session
                    m_State = MAIL_QUIT
                    '
                    'Send QUIT command to the server
                    Winsock1.SendData "QUIT" & vbCrLf
                    '
                    Debug.Print "QUIT"
                Case MAIL_QUIT
                    '
                    'Close connection
                    Winsock1.Close
                    '
            End Select
           
        Else
            '
            'If we are here server replied with
            'unacceptable respose code therefore we need
            'close connection and inform user about problem
            '
            Winsock1.Close
            '
            If Not m_State = MAIL_QUIT Then
                MsgBox "SMTP Error: " & strServerResponse, _
                        vbInformation, "SMTP Error"
            Else
                MsgBox "Message sent successfuly.", vbInformation
            End If
            '
        End If
      

  2.   

    要将用户名和密码进行BASE64编码,再发送。
      

  3.   

    不过我只有C程序,有兴趣可以看看
    http://nowcan.yeah.net
    C++ Builder 网络部分。
      

  4.   

    http://www.longen.com/S-Z/details~z/Smtp.htm
      

  5.   

    TO:jamex(1 + 1 = 爱) 
    我看了你给的网址,关于smtp的资料很详细,但我没有发现关于smtp验证的内容。
    请赐教!!
      

  6.   

    我的回答:
    http://www.csdn.net/expert/topic/526/526461.xml?temp=.7526056
      

  7.   

    以下是源代码,请大家帮我看一下问题出在哪里?Private Enum SMTP_State
        MAIL_CONNECT
        MAIL_HELO
        MAIL_LOGIN
        MAIL_USER
        MAIL_PASS
        MAIL_RCPTTO
        MAIL_DATA
        MAIL_DOT
        MAIL_QUIT
    End Enum
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)    Dim strServerResponse   As String
        Dim strResponseCode     As String
        Dim strDataToSend       As String
        '
        'Retrive data from winsock buffer
        '
        Winsock1.GetData strServerResponse
        
        '
        Debug.Print "my:" & strServerResponse
        '
        'Get server response code (first three symbols)
        '
        strResponseCode = Left(strServerResponse, 3)
       
        '
        'Only these three codes tell us that previous
        'command accepted successfully and we can go on
        '
        If strResponseCode = "250" Or _
           strResponseCode = "220" Or _
           strResponseCode = "334" Or _
           strResponseCode = "354" Then
           
            Select Case m_State
                Case MAIL_CONNECT
                    'Change current state of the session
                    m_State = MAIL_HELO
                    '
                    'Remove blank spaces
                    strDataToSend = Trim$(txtSender)
                    '
                    'Retrieve mailbox name from e-mail address
                    strDataToSend = Left$(strDataToSend, _
                                    InStr(1, strDataToSend, "@") - 1)
                    'Send HELO command to the server
                    'Winsock1.SendData "HELO " & strDataToSend & vbCrLf
                    Winsock1.SendData "EHLO " & Trim(txtHost.Text) & vbCrLf
                    
                Case MAIL_HELO
                    Winsock1.SendData "AUTH LOGIN" & vbCrLf
                    m_State = MAIL_LOGIN
                    
                Case MAIL_LOGIN
                     
                    Winsock1.SendData sBase64Enc("此??我的用?名") & vbCrLf
                    m_State = MAIL_USER
                Case MAIL_USER
                    Winsock1.SendData sBase64Enc("我的密?") & vbCrLf
                    m_State = MAIL_PASS
                Case MAIL_PASS
                   'Change current state of the session
                    m_State = MAIL_RCPTTO
                    '
                    'Send RCPT TO command to the server
                    Winsock1.SendData "RCPT TO:" & Trim$(txtRecipient) & vbCrLf
                    '
                    Debug.Print "RCPT TO:" & Trim$(txtRecipient)
                    '
                Case MAIL_RCPTTO
                    '
                    'Change current state of the session
                    m_State = MAIL_DATA
                    '
                    'Send DATA command to the server
                    Winsock1.SendData "DATA" & vbCrLf
                    '
                    Debug.Print "DATA"
                    '
                Case MAIL_DATA
                    '
                    'Change current state of the session
                    m_State = MAIL_DOT
                    '
                    'So now we are sending a message body
                    'Each line of text must be completed with
                    'linefeed symbol (Chr$(10) or vbLf) not with vbCrLf
                    '
                    'Send Subject line
                    Winsock1.SendData "Subject:" & txtSubject & vbLf & vbCrLf
                    '
                    Debug.Print "Subject:" & txtSubject
                    '
                    Dim varLines    As Variant
                    Dim varLine     As Variant
                    Dim strMessage  As String
                    '
                    'Add atacchments
                    strMessage = txtMessage & vbCrLf & vbCrLf & m_strEncodedFiles
                    'clear memory
                    m_strEncodedFiles = ""
                    'Parse message to get lines (for VB6 only)
                    varLines = Split(strMessage, vbCrLf)
                    'clear memory
                    strMessage = ""
                    '
                    'Send each line of the message
                    For Each varLine In varLines
                        Winsock1.SendData CStr(varLine) & vbLf
                        '
                        Debug.Print CStr(varLine)
                    Next
                    '
                    'Send a dot symbol to inform server
                    'that sending of message comleted
                    Winsock1.SendData "." & vbCrLf
                    '
                    Debug.Print "."
                    '
                Case MAIL_DOT
                    'Change current state of the session
                    m_State = MAIL_QUIT
                    '
                    'Send QUIT command to the server
                    Winsock1.SendData "QUIT" & vbCrLf
                    '
                    Debug.Print "QUIT"
                Case MAIL_QUIT
                    '
                    'Close connection
                    Winsock1.Close
                    '
            End Select
           
        Else
            '
            'If we are here server replied with
            'unacceptable respose code therefore we need
            'close connection and inform user about problem
            '
            Winsock1.Close
            '
            If Not m_State = MAIL_QUIT Then
                MsgBox "SMTP Error: " & strServerResponse, _
                        vbInformation, "SMTP Error"
            Else
                MsgBox "Message sent successfuly.", vbInformation
            End If
            '
        End If
        
    End Sub
      

  8.   


                Case MAIL_LOGIN
                     
                    Winsock1.SendData sBase64Enc("我用户名") & vbCrLf
                    m_State = MAIL_USER
                Case MAIL_USER
                    Winsock1.SendData sBase64Enc("我的密码") & vbCrLf
                    m_State = MAIL_PASS
      

  9.   


                Case MAIL_LOGIN
                     
                    Winsock1.SendData sBase64Enc("我用户名") & vbCrLf
                    m_State = MAIL_USER
                Case MAIL_USER
                    Winsock1.SendData sBase64Enc("我的密码") & vbCrLf
                    m_State = MAIL_PASS
      

  10.   

    Private Sub cmdSend_Click()
        dsSock.Close
        
        dsSock.RemoteHost = txtSMTPServer
        dsSock.RemotePort = txtSMTPPort
        txtServerinf.Text = ""
        Call SendMail(dsSock, txtFrom.Text, txtTo.Text, txtSubject.Text, txtContent.Text)
    End SubPrivate Sub dsSock_DataArrival(ByVal bytesTotal As Long)
        Dim ComeData As String
        
        dsSock.GetData ComeData
        txtServerinf.Text = txtServerinf.Text + ComeData
        Answerf = True
    End SubPrivate Sub dsSock_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
        MsgBox "Number=" & Number & "***" & "Description=" & Description
    End SubSub SendMail(dsSock As Control, strFrom As String, strTo As String, strSubject As String, strMsg As String)
    On Error GoTo e
        dsSock.Connect
        Waiting
        dsSock.SendData "EHLO " & strFrom & vbCrLf
        Waiting
        
        If chkSMTP.Value = Checked Then
            dsSock.SendData "AUTH LOGIN" & vbCrLf
            Waiting
            dsSock.SendData Base64Encode(txtUser) & vbCrLf
            Waiting
            dsSock.SendData Base64Encode(txtPwd) & vbCrLf
            Waiting
        End If
        
        dsSock.SendData "Mail From:<" & strFrom & ">" & vbCrLf
        Waiting
        dsSock.SendData "RCPT TO:<" & strTo & ">" & vbCrLf
        Waiting
        dsSock.SendData "DATA " & vbCrLf
        Waiting
        dsSock.SendData "DATE:" & Format$(Now, "dd mmm yy ttttt") & vbCrLf
        dsSock.SendData "From:" & strFrom & vbCrLf
        dsSock.SendData "TO:" & strTo & vbCrLf
        dsSock.SendData "SUBJECT: " & strSubject & vbCrLf & vbCrLf
        
        dsSock.SendData strMsg & vbCrLf & "." & vbCrLf
        Waiting
        dsSock.Close
        
        MsgBox "Finish"
    Exit Sube:
        MsgBox Err.Description
    End SubPrivate Sub txtFrom_LostFocus()
        If chkSMTP.Value = Checked Then
           Exit Sub
        End If
    End Sub
      

  11.   

    关于ESMTP(SMTP服务认证扩展)AUTH的认证方式有LOGIN,CRAM-MD5,PLAIN等几种。不过目前国内的仅仅支持LOGIN一种,这也是简单的一种。SMTP 认证功能介绍  SMTP的认证功能主要是增加了AUTH命令。AUTH命令有多种用法,而且有多种认证机制。AUTH支持的认证机制主要有LOGIN,CRAM-MD5等。LOGIN应该是大多数免费邮件服务器都支持的,263与新浪都支持。而新浪还支持CRAM-MD5机制。认证机制一般只在真正发送邮件之前进行,而且只需要执行一次。当认证成功后,即可按原来正常的处理发送邮件。原理是口令-应答(Challenge-Response),即由服务器发送命令要求客户端回答,客户端根据服务器发送信息进行回答,如果应答通过了,则认证成功,即可继续处理。下面对这两种制作一个简单介绍。S:表示服务器返回,C:表示客户端发送。LOGIN它应该比较简单。口令-应答过程如下:1   C: AUTH LOGIN
    2   S: 334 dXNlcm5hbWU6
    3   C: dXNlcm5hbWU6
    4   S: 334 cGFzc3dvcmQ6
    5   C: cGFzc3dvcmQ6
    6   S: 235 Authentication successful.1 为客户端向服务器发送认证指令。
    2 服务端返回base64编码串,成功码为334。编码字符串解码后为“username:”,说明要求客户端发送用户名。
    3 客户端发送用base64编码的用户名,此处为“username:”。
    4 服务端返回base64编码串,成功码为334。编码字符串解码后为“password:”,说明要求客户端发送用户口令。
    5 客户端发送用base64编码的口令,此处为“password:”。
    6 成功后,服务端返回码为235,表示认证成功可以发送邮件了。
    对于LOGIN方式认证,其实就是将用户名与口令用base64进行编码,根据服务器的要求,分别发出即可。(就我看来,由于base64是一种公共的编码标准,也起不到太大的保护作用。) 
    CRAM-MD5机制
    关于CRAM-MD5的机制可以参考[RFC 2195]规范,这里不详细说明了。主要就是通过口令-回答机制,由服务端发出一个信息串,这个由随机数,时间戳,服务器地址构成,并且用base64编码。客户端收到后,发送一个由用户名,加一个空格,再加一个摘要构成的串,并用base64编码。摘要是通过MD5算法求出。这种机制要求服务端与客户端有相同的加密串。当客户端发送摘要后,服务器对其合法性进行验证,成功后,返回235。http://www.longen.com/S-Z/details~z/SMTPExtendStandard.htm