可能需要给 smtp.163.net 或 smtp.163.com 在请求smtp验证密码时,由VB将此密码送出,如何实现?
解决方案 »
- 请高手帮忙,怎样修改access中的图片
- 如何提取“自动筛选”后所形成的各字段的下拉列表?
- 关于滚动条的三个问题!好像有点难度
- 实用代码:【源码下载】CVBWindowCreationHooker第2版(做了小修改)并附修改窗口类名、把普通窗口变为MDI子窗口的例子
- 在MDI窗体中添加TreeView控件的文题,帮忙解决!
- 请教关于install shield制作安装程序问题,送分了!急啊!
- 高手请进:如何实现像Foxmail附件那样的功能
- 大学教师工作量核算系统设计 哪位哥有 借鉴一下 谢谢了
- 本人初学者做了个电子贺卡出了问题,求助
- 请教如何使动态生成的recordset数据在CrystalReport9中显示?
- 100分送上!!我都快被ADO逼疯了!!!真他妈的服了,各位给我指点一下吧,急用呀!!!
- 如何在vb下实现usb口数据的传送与读取??
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
http://nowcan.yeah.net
C++ Builder 网络部分。
我看了你给的网址,关于smtp的资料很详细,但我没有发现关于smtp验证的内容。
请赐教!!
http://www.csdn.net/expert/topic/526/526461.xml?temp=.7526056
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
Case MAIL_LOGIN
Winsock1.SendData sBase64Enc("我用户名") & vbCrLf
m_State = MAIL_USER
Case MAIL_USER
Winsock1.SendData sBase64Enc("我的密码") & vbCrLf
m_State = MAIL_PASS
Case MAIL_LOGIN
Winsock1.SendData sBase64Enc("我用户名") & vbCrLf
m_State = MAIL_USER
Case MAIL_USER
Winsock1.SendData sBase64Enc("我的密码") & vbCrLf
m_State = MAIL_PASS
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
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