winsock编写电子邮件发送程序.可是老发不出去.总是在 Winsock1.SendData "DATA" & vbCrLf 这里出错 下面是我的代码.
代码:
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Enum SMTP_State
MAIL_CONNECT
MAIL_HELO
MAIL_from
MAIL_RCPTTO
MAIL_DATA
MAIL_DOT
MAIL_QUIT
MAIL_USER
MAIL_PASS
mail_login
End EnumPrivate m_State As SMTP_State
Private m_strEncodedFiles As StringPrivate Function Base64_Encode(strSource) As String 'base6加密算法
Const BASE64_TABLE As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim strTempLine As String
Dim j As Integer
For j = 1 To (Len(strSource) - Len(strSource) Mod 3) Step 3
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) \ 4) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, ((Asc(Mid(strSource, j, 1)) Mod 4) * 16 _
+ Asc(Mid(strSource, j + 1, 1)) \ 16) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, ((Asc(Mid(strSource, j + 1, 1)) Mod 16) * 4 _
+ Asc(Mid(strSource, j + 2, 1)) \ 64) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j + 2, 1)) Mod 64) + 1, 1)
Next j
If Not (Len(strSource) Mod 3) = 0 Then
If (Len(strSource) Mod 3) = 2 Then
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) \ 4) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) Mod 4) * 16 _
+ Asc(Mid(strSource, j + 1, 1)) \ 16 + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j + 1, 1)) Mod 16) * 4 + 1, 1)
strTempLine = strTempLine & "="
ElseIf (Len(strSource) Mod 3) = 1 Then
strTempLine = strTempLine + Mid(BASE64_TABLE, Asc(Mid(strSource, j, 1)) \ 4 + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) Mod 4) * 16 + 1, 1)
strTempLine = strTempLine & "=="
End If
End If
Base64_Encode = strTempLine
End FunctionPrivate Sub cmdExit_Click()
Unload Me
End SubPrivate Sub CmdSend_Click()
Winsock1.Close
Winsock1.LocalPort = 0
Winsock1.Connect txtserver.Text, 25
m_State = MAIL_CONNECT
StatusTxt = "试图与服务器连接"
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'=================================
Dim strServerResponse As String
Dim strResponseCode As String
Dim strDataToSend As StringWinsock1.GetData strServerResponse
strResponseCode = Left(strServerResponse, 3)
If strResponseCode = "250" Or _
strResponseCode = "220" Or _
strResponseCode = "354" Or _
strResponseCode = "334" Or _
strResponseCode = "235" Then
Select Case m_State
Case MAIL_CONNECT
m_State = MAIL_HELO
Winsock1.SendData "HELO " & txtserver.Text & vbCrLf
StatusTxt = "正在登录服务器"
Case MAIL_HELO
m_State = MAIL_USER
Winsock1.SendData "AUTH LOGIN" & vbCrLf
StatusTxt = "完成登录"
Case MAIL_USER
m_State = MAIL_PASS
Winsock1.SendData (Base64_Encode(Trim(user.Text))) & vbCrLf
StatusTxt = "正在验证用户名"
Case MAIL_PASS
m_State = mail_login
Winsock1.SendData (Base64_Encode(txtpwa.Text)) & vbCrLf
StatusTxt = "正在验证用户密码"
Case mail_login
m_State = MAIL_from
Winsock1.SendData "MAIL FROM:" & "<" & txtfrom.Text & ">" & vbCrLf
StatusTxt = "正在验证发件人"
Case MAIL_from
m_State = MAIL_RCPTTO
Winsock1.SendData "RCPT TO: " & "<" & getaddress.Text & ">" & vbCrLf '收件人
StatusTxt = "正在验证接收人"
Case MAIL_RCPTTO
m_State = MAIL_DATA
Winsock1.SendData "DATA" & vbCrLf
StatusTxt = "准备发送"
Case MAIL_DATA
m_State = MAIL_DOT
' Winsock1.SendData ("Date:" + Chr(32) + Format(Date, "Ddd") & "," & Format(Date, "dd Mmm YYYY") & "" & Format(Time, "hh:mm:ss") & "" & "-0600" + vbCrLf)
Winsock1.SendData "From:" & Trim(txtfrom.Text) & vbCrLf
Sleep 2000
Winsock1.SendData "To:" & Trim(getaddress.Text) & vbCrLf
Sleep 2000
Winsock1.SendData "Subject:" & Trim(subject.Text) & vbCrLf
Sleep 2000
Winsock1.SendData ("ni hao ma" + vbCrLf)
Sleep 2000
Winsock1.SendData "." & vbCrLf
Sleep 2000
StatusTxt = "正在获取邮件内容"
Case MAIL_DOT
m_State = MAIL_QUIT
Winsock1.SendData "QUIT" & vbCrLf
StatusTxt = "邮件成功发送"
Case MAIL_QUIT
Winsock1.Close
StatusTxt = "待命之中..."
End Select
Else
Text1.Text = Text1.Text + strServerResponse
Winsock1.Close
End IfEnd Sub帮忙看看是那里出错. 谢谢
代码:
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Enum SMTP_State
MAIL_CONNECT
MAIL_HELO
MAIL_from
MAIL_RCPTTO
MAIL_DATA
MAIL_DOT
MAIL_QUIT
MAIL_USER
MAIL_PASS
mail_login
End EnumPrivate m_State As SMTP_State
Private m_strEncodedFiles As StringPrivate Function Base64_Encode(strSource) As String 'base6加密算法
Const BASE64_TABLE As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim strTempLine As String
Dim j As Integer
For j = 1 To (Len(strSource) - Len(strSource) Mod 3) Step 3
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) \ 4) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, ((Asc(Mid(strSource, j, 1)) Mod 4) * 16 _
+ Asc(Mid(strSource, j + 1, 1)) \ 16) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, ((Asc(Mid(strSource, j + 1, 1)) Mod 16) * 4 _
+ Asc(Mid(strSource, j + 2, 1)) \ 64) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j + 2, 1)) Mod 64) + 1, 1)
Next j
If Not (Len(strSource) Mod 3) = 0 Then
If (Len(strSource) Mod 3) = 2 Then
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) \ 4) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) Mod 4) * 16 _
+ Asc(Mid(strSource, j + 1, 1)) \ 16 + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j + 1, 1)) Mod 16) * 4 + 1, 1)
strTempLine = strTempLine & "="
ElseIf (Len(strSource) Mod 3) = 1 Then
strTempLine = strTempLine + Mid(BASE64_TABLE, Asc(Mid(strSource, j, 1)) \ 4 + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) Mod 4) * 16 + 1, 1)
strTempLine = strTempLine & "=="
End If
End If
Base64_Encode = strTempLine
End FunctionPrivate Sub cmdExit_Click()
Unload Me
End SubPrivate Sub CmdSend_Click()
Winsock1.Close
Winsock1.LocalPort = 0
Winsock1.Connect txtserver.Text, 25
m_State = MAIL_CONNECT
StatusTxt = "试图与服务器连接"
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'=================================
Dim strServerResponse As String
Dim strResponseCode As String
Dim strDataToSend As StringWinsock1.GetData strServerResponse
strResponseCode = Left(strServerResponse, 3)
If strResponseCode = "250" Or _
strResponseCode = "220" Or _
strResponseCode = "354" Or _
strResponseCode = "334" Or _
strResponseCode = "235" Then
Select Case m_State
Case MAIL_CONNECT
m_State = MAIL_HELO
Winsock1.SendData "HELO " & txtserver.Text & vbCrLf
StatusTxt = "正在登录服务器"
Case MAIL_HELO
m_State = MAIL_USER
Winsock1.SendData "AUTH LOGIN" & vbCrLf
StatusTxt = "完成登录"
Case MAIL_USER
m_State = MAIL_PASS
Winsock1.SendData (Base64_Encode(Trim(user.Text))) & vbCrLf
StatusTxt = "正在验证用户名"
Case MAIL_PASS
m_State = mail_login
Winsock1.SendData (Base64_Encode(txtpwa.Text)) & vbCrLf
StatusTxt = "正在验证用户密码"
Case mail_login
m_State = MAIL_from
Winsock1.SendData "MAIL FROM:" & "<" & txtfrom.Text & ">" & vbCrLf
StatusTxt = "正在验证发件人"
Case MAIL_from
m_State = MAIL_RCPTTO
Winsock1.SendData "RCPT TO: " & "<" & getaddress.Text & ">" & vbCrLf '收件人
StatusTxt = "正在验证接收人"
Case MAIL_RCPTTO
m_State = MAIL_DATA
Winsock1.SendData "DATA" & vbCrLf
StatusTxt = "准备发送"
Case MAIL_DATA
m_State = MAIL_DOT
' Winsock1.SendData ("Date:" + Chr(32) + Format(Date, "Ddd") & "," & Format(Date, "dd Mmm YYYY") & "" & Format(Time, "hh:mm:ss") & "" & "-0600" + vbCrLf)
Winsock1.SendData "From:" & Trim(txtfrom.Text) & vbCrLf
Sleep 2000
Winsock1.SendData "To:" & Trim(getaddress.Text) & vbCrLf
Sleep 2000
Winsock1.SendData "Subject:" & Trim(subject.Text) & vbCrLf
Sleep 2000
Winsock1.SendData ("ni hao ma" + vbCrLf)
Sleep 2000
Winsock1.SendData "." & vbCrLf
Sleep 2000
StatusTxt = "正在获取邮件内容"
Case MAIL_DOT
m_State = MAIL_QUIT
Winsock1.SendData "QUIT" & vbCrLf
StatusTxt = "邮件成功发送"
Case MAIL_QUIT
Winsock1.Close
StatusTxt = "待命之中..."
End Select
Else
Text1.Text = Text1.Text + strServerResponse
Winsock1.Close
End IfEnd Sub帮忙看看是那里出错. 谢谢
错误提示是什么?
收到354答复码了吗?