电子邮件客户端程序的SMTP认证如何写?

netrobo 2002-02-21 09:45:12
我现在试用winsock写一个电子邮件客户端程序,但大多SMTP服务器都需要要认证,我不知道该如何写,望高手指教!
...全文
532 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sonicdater 2002-02-21
  • 打赏
  • 举报
回复
用 Winsock 控件
======================================================

验证要用 esmtp 命令
把 smtp 中的 helo 命令换为 ehlo 命令.
再用 auth 命令发送 经过base64 编码的 username 和 pwd
======================================================
用 Winsock 控件

dsSock.SendData "EHLO " & strFrom & vbCrLf
dsSock.SendData "AUTH LOGIN " & vbCrLf
dsSock.SendData Base64Encode(txtUser) & vbCrLf
dsSock.SendData Base64Encode(txtPwd) & vbCrLf
===================================================
Base64Encode 是一个 进行 base64 编码的函数, 需自己写。
txtUser 是 需验证的用户名,txtPwd 是 密码。
其它的 和一般的 smtp 命令一样。 你可参考 一下 那些 随处可见 的 例程。


再 给你 base64 的编码 和解码 部分的 函数::

http://www.csdn.net/Expert/topic/422/422011.xml
==================================================
C: EHLO
S: 250-smtp.example.com
S: 250 AUTH CRAM-MD5 DIGEST-MD5
C: AUTH login
S: 334 VXNlcm5hbWU6 //Username:
C: VGVzdA== //Test
S: 334 UGFzc3dvcmQ6 //Password:
C: MTIzNDU= //12345
S: 2.7.0 Authentication successful.
=========================================================
dbcontrols 2002-02-21
  • 打赏
  • 举报
回复
SMTP协议简介 (Simple Mail Transfer Protocol)



SMTP被用来在因特网上传递电子邮件。文件RFC821规定了该协议的所有细节。但是你只须记住下面的内容--该协议的基本命令和方法就行了。

协议的原理很简单。无非是一个客户端计算机向服务器发送命令,然后服务器向客户端计算机返回一些信息。客房端发送的命令以及服务器的回应都是字符串,你并不需要特别的软件就能读出它们。如果你仔细看过Winsock Terminal示例程序的源代码,你就会发现这一点。现在让我们用这个示例程序来向自己发一封电子邮件吧。

运行示例程序,单击"Connect"按钮,在"Connect to..."对话框中输入你的电子邮件服务器的地址,选择SMTP选项。最后按"Connect"按钮。如果连接成功,Winsock控件会产生Connected事件,在状态栏中也可看到连接成功的信息。在主文本窗口中你将看到从服务器返回的文本。该文本包含一个三位数的代码及描述,例如:

220-ns.cinfo.ru Sendmail 8.6.12/8.6.9 ready at Wed, 22 Apr 1998 22:54:41 +0300
220 ESMTP spoken here

不必太过留意这些描述。因为这些描述可能会因服务器而异。你只须要知道代码所代表的意思就行了。代码220表示成功建立连接,服务器等待你的第一个命令。

向服务器传递的第一个命令是HELO. 该命令包含一个参数,即你的邮箱名。

HELO oleg

注意: 在RFC821中,HELO是一个可选择性命令,如果服务器不要求该命令的话,你可以把它忽略掉。

如果命令成功,服务器会返回一个代码为250的回应。下一步用MAIL FROM命令告诉服务器你想发一封邮件。该命令以发信人的邮件地址为参数。

MAIL FROM: oleg@vbip.com

发完命令后,如果服务器返回一个代码为250回应,你就可以向服务器发送RCPT TO命令了。该命令以收信人地址为参数,一看便知是告诉服务器你想将邮件发到收信人地址处。

RCPT TO: somebody@domain.com

如果你想将邮件发给多个收件人的话。你需要多次使用RCPT TO命令,对每个命令,服务器都会返回代码为250的回应。

现在你可以向服务器发送邮件正文了。用DATA命令告诉服务器以下的内容为邮件正文。在你从服务器收到代码为354的回应后,你就可以发送邮件正文了。邮件按行发送,每行邮件以一个无回车的换行符结束(在VB中就是vbLf)示例程序知道何时使用换行符,何时使用回车加换行符。所以你只须按回车键就行了。下面是一个例子:

Subject: My first e-mail message.

First line of a message.
Second line.
.

注意上面最后一行的最后一个字符是一个小数点。这是正文结束的标志。用VB代码表示就是vbLf & "." & vbCrLf. 服务器收到这个标志后,就会立即向你返回一个代码为250的回应以及该邮件的唯一ID号。

250 WAA10568 Message accepted for delivery

任务完成了,你可以继续发送下封邮件,也可以断开同服务器的连接。如果要断开同服务器的连接就用QUIT命令。在这种情况下,服务器会返回一个代码为221的回应并断开连接。

QUIT
221 ns.cinfo.ru closing connection
eaglezhao 2002-02-21
  • 打赏
  • 举报
回复
首先发送“Auth Login”,收到“334”之后发送经过base64编码后的用户名称,等待受到“334”之后发送用户密码的base64编码串,就可以认证过去了。base64编码函数如下:

'功能说明:将StrIn进行base64编码,返回值为结果
Public Function Base64EncodeStr(ByVal StrIn As String) As String
Dim mAllByteIn() As Byte, mAllByteOut() As Byte
Dim mInByte(2) As Byte, mOutByte(3) As Byte
Dim myByte As Byte
Dim i As Integer, LineLen As Integer, j As Integer, m As Integer, n As Integer
n = 3: m = 0
mAllByteIn() = StrConv(StrIn, vbFromUnicode)
For i = 0 To UBound(mAllByteIn()) Step 3
j = 0
Do While j < 3
mInByte(j) = mAllByteIn(i + j)
j = j + 1
If i + j > UBound(mAllByteIn()) Then Exit Do
Loop
Base64EncodeByte mInByte, mOutByte, j
ReDim Preserve mAllByteOut(n)
For j = 0 To 3
mAllByteOut(n - 3 + j) = mOutByte(j)
Next j
n = n + 4
m = m + 4
If m > 70 Then
m = 0
n = n + 2
ReDim Preserve mAllByteOut(n)
mAllByteOut(n - 2) = &HD
mAllByteOut(n - 1) = &HA
End If
Next i
Base64EncodeStr = StrConv(mAllByteOut(), vbUnicode)
End Function

Private Sub Base64EncodeByte(mInByte() As Byte, mOutByte() As Byte, Num As Integer)
Dim tByte As Byte
Dim i As Integer
If Num = 1 Then
mInByte(1) = 0
mInByte(2) = 0
ElseIf Num = 2 Then
mInByte(2) = 0
End If
tByte = mInByte(0) And &HFC
mOutByte(0) = tByte / 4
tByte = ((mInByte(0) And &H3) * 16) + (mInByte(1) And &HF0) / 16
mOutByte(1) = tByte
tByte = ((mInByte(1) And &HF) * 4) + ((mInByte(2) And &HC0) / 64)
mOutByte(2) = tByte
tByte = (mInByte(2) And &H3F)
mOutByte(3) = tByte
For i = 0 To 3
If mOutByte(i) >= 0 And mOutByte(i) <= 25 Then
mOutByte(i) = mOutByte(i) + Asc("A")
ElseIf mOutByte(i) >= 26 And mOutByte(i) <= 51 Then
mOutByte(i) = mOutByte(i) - 26 + Asc("a")
ElseIf mOutByte(i) >= 52 And mOutByte(i) <= 61 Then
mOutByte(i) = mOutByte(i) - 52 + Asc("0")
ElseIf mOutByte(i) = 62 Then
mOutByte(i) = Asc("+")
Else
mOutByte(i) = Asc("/")
End If
Next i
If Num = 1 Then
mOutByte(2) = Asc("=")
mOutByte(3) = Asc("=")
ElseIf Num = 2 Then
mOutByte(3) = Asc("=")
End If
End Sub
网络咖啡 2002-02-21
  • 打赏
  • 举报
回复
学习
shuwork 2002-02-21
  • 打赏
  • 举报
回复
用 base64 编码,把 username password 发出去
http://www.csdn.net/expert/topic/390/390067.xml

743

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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