小弟写了一个发送邮件的程序,其中SMTP认证模块如下
.... .... ....
'打开对话(在此之前服务器地址,端口都已经正确初始化)
wsock.SendData "EHLO " + wsock.RemoteHost + vbCrLf
wsock.SendData "AUTH LOGIN " + vbCrLf
wsock.SendData Base64EncodeStr(Trim(txtUser.Text)) + vbCrLf
wsock.SendData Base64EncodeStr(Trim(txtPass.Text)) + vbCrLf
.... .... ....
当程序连接一个LOTUS DOMINO服务器时一切正常,该模块的返回信息依次是:
334 VXNlcm5hbWU6
334 UGFzc3dvcmQ6
235 Authentication successful可问题怪就怪在,当程序连接一个EXCHANGE(2003)服务器时却死活通不过验证(这里保证输入的用户名和密码都是正确的),返回信息如下:
334 VXNlcm5hbWU6
500 5.3.3 Unrecognized command
500 5.3.3 Unrecognized command多次试验未果,心急如焚,望各位大侠能不吝赐教!谢谢!
.... .... ....
'打开对话(在此之前服务器地址,端口都已经正确初始化)
wsock.SendData "EHLO " + wsock.RemoteHost + vbCrLf
wsock.SendData "AUTH LOGIN " + vbCrLf
wsock.SendData Base64EncodeStr(Trim(txtUser.Text)) + vbCrLf
wsock.SendData Base64EncodeStr(Trim(txtPass.Text)) + vbCrLf
.... .... ....
当程序连接一个LOTUS DOMINO服务器时一切正常,该模块的返回信息依次是:
334 VXNlcm5hbWU6
334 UGFzc3dvcmQ6
235 Authentication successful可问题怪就怪在,当程序连接一个EXCHANGE(2003)服务器时却死活通不过验证(这里保证输入的用户名和密码都是正确的),返回信息如下:
334 VXNlcm5hbWU6
500 5.3.3 Unrecognized command
500 5.3.3 Unrecognized command多次试验未果,心急如焚,望各位大侠能不吝赐教!谢谢!
454 5.7.3 Client was not authenticated.
实在是着急,各位大侠发表高见啊,分绝对不是问题!
wsock.SendData "AUTH LOGIN " + vbCrLf
wsock.SendData vbCrLf
wsock.SendData vbCrLf
wsock.SendData "AUTH LOGIN " + vbCrLf 建议在DOS模式下用telnet命令连接到服务器,然后执行help 命令查看一下对方支持什么命令
有可能是 "AUTO" 或 "LONIN" 任意一个单词就可以了
而且在DOS模式下这些命令都认识的,
输入 AUTH LOGIN 返回 334 VXNlcm5hbWU6(等待输入用户名)
输入用户名 返回 334 UGFzc3dvcmQ6(等待输入密码)
输入密码 返回 认证结果这到底是怎么回事啊,555... ...
其实在很多时候确实可以使用OE来测试的,也就是用程序在本机监听端口,然后把OE的服务器地址设为本机的,然后让OE连自己的程序,同时程序记录相关传入的命令,然后程序再连接远程服务器,做个转发,然后再把传回的内容做记录,最后转发给OE。
之后需要等待一条确认指令,然后再传输入用户名一密码。
能说的具体点吗?我具体怎么拦截OE的发送命令(格式)啊?还有啊,我现在却是是在“AUTH LOGIN”命令返回之后才发的用户名和密码啊,为什么还是通不过验证呢? 我有一点不明白的是:他(EXCHANGE)为什么会把我在AUTH LOGIN 后输入的用户名和密码当成是SMTP命令来解析呢?请多指教,谢谢!!!
wsock.SendData "EHLO " + wsock.RemoteHost + vbCrLf
doevents
wsock.SendData "AUTH LOGIN " + vbCrLf
doevents
wsock.SendData Base64EncodeStr(Trim(txtUser.Text)) + vbCrLf
doevents
wsock.SendData Base64EncodeStr(Trim(txtPass.Text)) + vbCrLf
doevents
wsock.SendData "EHLO " + wsock.RemoteHost + vbCrLf => 334 VXNlcm5hbWU6
wsock.SendData "AUTH LOGIN " + vbCrLf => 500 5.3.3 Unrecognized command
wsock.SendData Base64EncodeStr(Trim(txtUser.Text)) + vbCrLf => 500 5.3.3 Unrecognized command
wsock.SendData Base64EncodeStr(Trim(txtPass.Text)) + vbCrLf
wsock.SendData Base64EncodeStr(Trim(txtUser.Text)) + vbCrLf
wsock.SendData Base64EncodeStr(Trim(txtPass.Text)) + vbCrLf
.... .... ....
当程序连接一个LOTUS DOMINO服务器时一切正常,该模块的返回信息依次是:
334 VXNlcm5hbWU6
334 UGFzc3dvcmQ6
235 Authentication successful可问题怪就怪在,当程序连接一个EXCHANGE(2003)服务器时却死活通不过验证(这里保证输入的用户名和密码都是正确的),返回信息如下:
334 VXNlcm5hbWU6
500 5.3.3 Unrecognized command
500 5.3.3 Unrecognized command
wsock.SendData "AUTH LOGIN " + vbCrLf
wsock.SendData Base64EncodeStr(Trim(txtUser.Text)) + vbCrLf
wsock.SendData Base64EncodeStr(Trim(txtPass.Text)) + vbCrLf一下子把所有命令全发送给了SMTP Server, 对于有些SMTP Server来说, 它也许能缓存你所有的命令, 然后逐条执行, 执行后返回执行结果, 再继续逐条执行。而对于有些SMTP Server来说, 可能会丢弃某次接收到的数据中的多余部分, 这时就会出现问题。正如楼主所说:而且在DOS模式下这些命令都认识的,
输入 AUTH LOGIN 返回 334 VXNlcm5hbWU6(等待输入用户名)
输入用户名 返回 334 UGFzc3dvcmQ6(等待输入密码)
输入密码 返回 认证结果这是因为在DOS模式下,你总是每次只发一条命令,等服务器返回执行结果后,再发下一条命令的。这和你现在代码所实现的是不同的。
这条回复说中了要点:回复人: unsigned(僵哥(当程序语言成为普及滴第三语言之后……)) ( ) 信誉:100 2005-06-08 14:07:00 得分: 0
Auth Login
之后需要等待一条确认指令,然后再传输入用户名一密码。
如果这是楼主在程序中的代码的话那的确会有问题,上面已经提到过了,必须等待回应后才能下一条命令
wsock.SendData "EHLO " + wsock.RemoteHost + vbCrLf
wsock.SendData "AUTH LOGIN " + vbCrLf
wsock.SendData Base64EncodeStr(Trim(txtUser.Text)) + vbCrLf
wsock.SendData Base64EncodeStr(Trim(txtPass.Text)) + vbCrLf应该在每句之间加一个等待的语句
do while ...
doevents
loop
wsock.Connect
outputdelay 50
If GetReturnInfo(10, "220") = False Then
txtmsg.Text = "邮件服务器连接不上..."
Exit Sub
Else
txtmsg.Text = txtmsg.Text + strReturn + vbCrLf
End If'2.打开通讯会话
wsock.SendData "EHLO " + wsock.RemoteHost + vbCrLf
outputdelay 50
If GetReturnInfo(10, "250") = False Then
txtmsg.Text = txtmsg.Text + vbCrLf + "无法打开通讯会话..."
Exit Sub
Else
txtmsg.Text = txtmsg.Text + strReturn + vbCrLf
End If'3.发送登录认证命令
wsock.SendData "AUTH LOGIN " + vbCrLf
outputdelay 50
If GetReturnInfo(10, "334") = False Then
txtmsg.Text = txtmsg.Text + vbCrLf + "没有返回输入用户名提示..."
Exit Sub
Else
txtmsg.Text = txtmsg.Text + strReturn + vbCrLf
End If
'4.输入用户名
wsock.SendData Base64EncodeStr(Trim(txtUser.Text)) + vbCrLf
outputdelay 50
If GetReturnInfo(10, "334") = False Then
txtmsg.Text = txtmsg.Text + vbCrLf + "没有返回输入密码提示..."
Exit Sub
Else
txtmsg.Text = txtmsg.Text + strReturn + vbCrLf
End If
'5.输入密码
wsock.SendData Base64EncodeStr(Trim(txtPass.Text)) + vbCrLf
outputdelay 50
If GetReturnInfo(10, "235") = False Then
txtmsg.Text = txtmsg.Text + vbCrLf + strReturn + vbCrLf + "用户名/密码输入有误,
无法通过验证..."
Exit Sub
Else
txtmsg.Text = txtmsg.Text + strReturn + vbCrLf
End If
'6.'发送发送方地址
wsock.SendData "MAIL FROM:" + Trim(txtFrom.Text) + vbCrLf
outputdelay 50
If GetReturnInfo(10, "250") = False Then
txtmsg.Text = txtmsg.Text + vbCrLf + strReturn + vbCrLf + "发送方地址发送有误..."
Exit Sub
Else
txtmsg.Text = txtmsg.Text + strReturn + vbCrLf
End If'7.发送接收方地址
Form1 - 2
wsock.SendData "RCPT TO:" + Trim(txtTo.Text) + vbCrLf
outputdelay 50
If GetReturnInfo(10, "250") = False Then
txtmsg.Text = txtmsg.Text + vbCrLf + strReturn + vbCrLf + "接收方地址发送有误..."
Exit Sub
Else
txtmsg.Text = txtmsg.Text + strReturn + vbCrLf
End If'8.发送消息体
wsock.SendData "DATA" + vbCrLf
outputdelay 50
If GetReturnInfo(10, "354") = False Then
txtmsg.Text = txtmsg.Text + vbCrLf + strReturn + vbCrLf + "发送数据命令有误..."
Exit Sub
Else
txtmsg.Text = txtmsg.Text + strReturn + vbCrLf
End If
'9.发送邮件数据
wsock.SendData mData + vbCrLf
wsock.SendData strContent + vbCrLf
wsock.SendData "." + vbCrLf
If GetReturnInfo(10, "250") = False Then
txtmsg.Text = txtmsg.Text + vbCrLf + strReturn + vbCrLf + "邮件数据发送有误..."
Exit Sub
Else
txtmsg.Text = txtmsg.Text + strReturn + vbCrLf
End Iftxtmsg.Text = txtmsg.Text + vbCrLf + "恭喜,邮件发送成功^_^"
wsock.Close
End Sub