请问需要登录认证的smtp服务器是如何与客户机交互的?

qaymuic 2001-07-28 08:52:05
请问需要登录认证的smtp服务器是如何与客户机交互的,例如,想从smtp.sina.com.cn发送一封邮件,应该怎样与它交流?直接发送helo是不行的,会返回502错误。
...全文
853 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dapha 2002-07-09
  • 打赏
  • 举报
回复
Public Function Base64_Encode(strSource) As String 'base64的源码。是发邮件用的。
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 Function

Private Enum SMTP_State
MAIL_CONNECT
MAIL_HELO
MAIL_USER
MAIL_PASS
MAIL_LOGIN
MAIL_FROM
MAIL_RCPTTO
MAIL_DATA
MAIL_DOT
MAIL_QUIT
End Enum

Private m_State As SMTP_State

Private Sub Form_Load()
Winsock1.Connect "smtp.163.com", 25
m_State = MAIL_CONNECT
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim strServerResponse As String
Dim strResponseCode As String
Dim strDataToSend As String
Dim strMessage As String


Winsock1.GetData strServerResponse

Debug.Print 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


strDataToSend = "abc@163.com"

strDataToSend = Left$(strDataToSend, _
InStr(1, strDataToSend, "@") - 1)

Winsock1.SendData "HELO " & strDataToSend & vbCrLf
'
Debug.Print "HELO " & strDataToSend
'
Case MAIL_HELO
m_State = MAIL_USER
Winsock1.SendData "AUTH LOGIN" & vbCrLf
Debug.Print "正在校验用户"
Case MAIL_USER
m_State = MAIL_PASS
Winsock1.SendData (Base64_Encode("用户名")) & vbCrLf
Debug.Print "正在校验密码"
Case MAIL_PASS
m_State = MAIL_LOGIN
Winsock1.SendData (Base64_Encode("密码")) & vbCrLf
Debug.Print "成功登陆服务器"

Case MAIL_LOGIN

m_State = MAIL_FROM

Winsock1.SendData "MAIL FROM:" & "ghost@163.com" & vbCrLf

Debug.Print "MAIL FROM:" & "ghost@163.com"


Case MAIL_FROM


m_State = MAIL_RCPTTO

Winsock1.SendData "RCPT TO:" & "abc@163.com" & vbCrLf

Debug.Print "RCPT TO:" & "abc@163.com"

Case MAIL_RCPTTO

m_State = MAIL_DATA

Winsock1.SendData "DATA" & vbCrLf

Debug.Print "DATA"

Case MAIL_DATA

m_State = MAIL_DOT
Winsock1.SendData "From:" & "ghost" & " <" & "ghost@163.com" & " > " & vbCrLf

Winsock1.SendData "Subject:" & "ghost" & vbCrLf & vbCrLf


strMessage = " ghost"
Winsock1.SendData strMessage & vbCrLf




Winsock1.SendData "." & vbCrLf

Debug.Print "."

Case MAIL_DOT

m_State = MAIL_QUIT

Winsock1.SendData "QUIT" & vbCrLf

Debug.Print "QUIT"
Case MAIL_QUIT


Winsock1.Close

End Select


End If

End Sub

Chice_wxg 2002-07-09
  • 打赏
  • 举报
回复
http://www.china-askpro.com/msg38/qa75.shtml

希望对你有帮助


其实就是多了个AUTH命令,不过需要M64编码

qaymuic 2001-10-19
  • 打赏
  • 举报
回复
如何验证?
xhstudio 2001-09-29
  • 打赏
  • 举报
回复
我看到了
在电脑爱好者上有
好像是前几期
和正常的POP方式差不多只是多的密码验正啊
你找一下吧
qaymuic 2001-07-30
  • 打赏
  • 举报
回复
who know?
xhstudio 2001-07-30
  • 打赏
  • 举报
回复
没有人知道吗,不会吧????????????
chenfeng3000 2001-07-30
  • 打赏
  • 举报
回复
我也想知道
raeck 2001-07-29
  • 打赏
  • 举报
回复
up
qaymuic 2001-07-29
  • 打赏
  • 举报
回复
求救
qaymuic 2001-07-28
  • 打赏
  • 举报
回复
没人回答吗?
qaymuic 2001-07-28
  • 打赏
  • 举报
回复
盼复

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧