ESMTP总题?为什么我发EHLO,服务器总返回502错误?

zhaoyao73 2001-08-21 05:03:14
1.connect
220 smtp.263.net esmtp
2.ehlo mycomputer\r\n
502
why?
...全文
400 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaachii 2001-08-25
  • 打赏
  • 举报
回复
没有响应?不会吧?我直接使用微软的telnet客户连接的,过程如下

telnet smtp.263.net 25

220 smtp.263.net ESMTP
HELO mylocalhost
250 smtp.263.net
auth login
334 VXNlcm5hbWU6
//我的用户名
334 UGFzc3dvcmQ6
//我的密码
235 Authentication successful
.
.
.
aaachii 2001-08-25
  • 打赏
  • 举报
回复
大致说一下吧,当auth login发送过去之后,使用receive,如果没有SOCKET_ERROR就判断接收到的字串,将字串中的前三位状态码分离出来,和已知的正确的返回码比较,如果不是334,就是不需要验证,直接发送MAIL FROM就可以了,否则将用户名编码后发送,服务器回应后发送编码后的密码,再次检查返回码,如果不是235就是用户名/密码错误,否则就是验证通过。

下面是我使用的代码,Auth()是验证用的,get_response()是负责接收并判别返回码的,最后给出的是几个返回码。希望对你有用

BOOL CSmtp::Auth()
{
CString sAuth;
if(!m_bConnected) return FALSE;
try {
response_buf = new TCHAR[RESPONSE_BUFFER_SIZE];
if(response_buf == NULL) {
m_sError = _T("Not enough memory");
return FALSE;
}
} catch(CException* e) {
response_buf = NULL;
m_sError = _T("Not enough memory");
delete e;
return FALSE;
}

sAuth.Format(_T( "auth login\r\n" )); //construct auth quest
m_wsSMTPServer.Send((LPCTSTR)sAuth, sAuth.GetLength());
if(!get_response(AUTHQUE_SUCCESS)) {
m_sError="SMTP server with no auth";
m_bAuthed=TRUE;
return TRUE;
}

sAuth.Empty();

sAuth.Format(_T( "%s\r\n" ), m_sSMTPUser); //m_sSMTPUser is an string encoded with CBASE64
m_wsSMTPServer.Send((LPCTSTR)sAuth, sAuth.GetLength());
if(!get_response(AUTHQUE_SUCCESS)) {
m_sError="Unknown Error";
m_wsSMTPServer.Close();
delete response_buf;
response_buf = NULL;
return FALSE;
}

sAuth.Empty();

sAuth.Format(_T( "%s\r\n" ), m_sSMTPPass); //m_sSMTPPass is an string encoded with CBASE64
m_wsSMTPServer.Send((LPCTSTR)sAuth, sAuth.GetLength());
if(!get_response(AUTH_SUCCESS)) {
m_wsSMTPServer.Close();
delete response_buf;
response_buf = NULL;
return FALSE;
}

m_bAuthed = TRUE;
return TRUE;

}

BOOL CSmtp::get_response(UINT response_expected)
{
ASSERT(response_expected >= GENERIC_SUCCESS);
ASSERT(response_expected < LAST_RESPONSE);

CString sResponse;
UINT response;
response_code* pResp;

if(m_wsSMTPServer.Receive(response_buf, RESPONSE_BUFFER_SIZE) == SOCKET_ERROR) {
m_sError = _T("Socket Error");
return FALSE;
}
sResponse = response_buf;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
pResp = &response_table[response_expected];
if(response != pResp -> nResponse) {
m_sError.Format( _T("%d:%s"), response, (LPCTSTR)pResp -> sMessage);
return FALSE;
}
return TRUE;
}

CSmtp::response_code CSmtp::response_table[] = {
// GENERIC_SUCCESS
{250, _T("SMTP server error")},
// CONNECT_SUCCESS
{220, _T("SMTP server not available")},
// AUTHQUE_SUCCESS
{334, _T("SMTP server authentication error")},
// AUTH_SUCCESS
{235, _T("Error username or password")},
// DATA_SUCCESS
{354, _T("SMTP server not ready for data")},
// QUIT_SUCCESS
{221, _T("SMTP server didn't terminate session")}
};
zhaoyao73 2001-08-23
  • 打赏
  • 举报
回复
char *CMailSocket::m_szESmtpCom[]={ "HELO ", "auth login", "username", "password","MAIL FROM: <", "RCPT TO: <", "DATA ",/* "DATE: ",
"FROM: ", "SUBJECT: ", "TO: ", */ "QUIT "};

void CMailSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
static BOOL bFirst=TRUE;
static int nRepeat=0;
char szRetCode[4];

m_nMsgLength=Receive(m_szMsgBuf,sizeof(m_szMsgBuf),0);
AddEditContent(m_szMsgBuf);
strncpy(szRetCode,m_szMsgBuf,3);
szRetCode[3]=NULL;
if (!bRead) return;
if (bFirst)
{
if (strcmp(szRetCode,"220"))
{
AddEditContent("出现错误,正常退出,第一次返回状态码不是220,重新连接10次!");
if (nRepeat++<10)
{
CString Server;
((CSendMail*)pDlg)->m_SMTPSERVER.GetWindowText(Server);
Connect(Server,25);
}
else
{
ShutDown();
Close();
return;
}
}
else
{
bWrite=TRUE;
bRead=FALSE;
bFirst=!bFirst;
AsyncSelect(FD_WRITE);
return;
}
}
nRepeat=0;
switch (nStep)
{
case 0:
if (strcmp(szRetCode,"250"))
{
AddEditContent("出现错误,正常退出,返回状态码不是250");
Send("QUIT\r\n",sizeof("QUIT\r\n"));
ShutDown();
Close();
bFirst=TRUE;
return;
}
break;
case 1:
if (strcmp(szRetCode,"334"))
{
AddEditContent("出现错误,正常退出,返回状态码不是250");
Send("QUIT\r\n",sizeof("QUIT\r\n"));
ShutDown();
Close();
bFirst=TRUE;
return;
}
break;
case 2:
if (szRetCode[0]>'9' ||szRetCode[0]<'0')
{
nStep--;
break;
}
if (strcmp(szRetCode,"250"))
{
AddEditContent("出现错误,正常退出,返回状态码不是250");
Send("QUIT\r\n",sizeof("QUIT\r\n"));
ShutDown();
Close();
return;
}
break;
}
nStep++;
memset(m_szMsgBuf,0,sizeof(m_szMsgBuf));
bWrite=TRUE;
bRead=FALSE;
AsyncSelect(FD_WRITE);


CAsyncSocket::OnReceive(nErrorCode);
}
void CMailSocket::OnSend(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CString sTemp;
char MachineName[255];

if (!bWrite) return ;

if(!ESMTP)//不用ESMTP,不用验证
{
strcpy(m_szMsgBuf,m_szSmtpCom[nStep]);
switch(nStep)
{
case 0://HELO MACHINENAME
::gethostname(MachineName,255);
strcat(m_szMsgBuf,MachineName);
break;
/* case 1://AUTH LOGIN
::gethostname(MachineName,255);
strcat(m_szMsgBuf,MachineName);
break;
*/ case 1://mail from:<username@domain.com.cn>
pDlg->GetDlgItemText(IDC_SENDERADD,MachineName,255);
strcat(m_szMsgBuf,MachineName);
strcat(m_szMsgBuf,">");
break;
case 2://rcpt to:<userzhao@domain.com.cn>
pDlg->GetDlgItemText(IDC_RECEIVER,MachineName,255);
strcat(m_szMsgBuf,MachineName);
break;
case 3://
break;
}
}
else
{
strcpy(m_szMsgBuf,m_szESmtpCom[nStep]);
switch(nStep)
{
case 0://EHLO MACHINENAME
::gethostname(MachineName,255);
strcat(m_szMsgBuf,MachineName);
break;
case 1://AUTH LOGIN
//::gethostname(MachineName,255);
break;
case 2://BASE64编码的用户名
sTemp=((CSendMail*)pDlg)->ESMTPUSER;
Base64Encode(sTemp);
strcpy(m_szMsgBuf,sTemp.GetBuffer(1024));
break;
case 3://BASE64编码的密码
sTemp=((CSendMail*)pDlg)->ESMTPPASSWORD;
Base64Encode(sTemp);
strcpy(m_szMsgBuf,sTemp.GetBuffer(1024));
break;
case 4://mail from:<username@domain.com.cn>
pDlg->GetDlgItemText(IDC_SENDERADD,MachineName,255);
strcat(m_szMsgBuf,MachineName);
strcat(m_szMsgBuf,">");
break;
case 5://rcpt to:<userzhao@domain.com.cn>
pDlg->GetDlgItemText(IDC_RECEIVER,MachineName,255);
strcat(m_szMsgBuf,MachineName);
strcat(m_szMsgBuf,">");
break;
case 6://
break;
}
}
strcat(m_szMsgBuf,"\r\n");
m_nMsgLength=strlen(m_szMsgBuf);
AddEditContent(m_szMsgBuf);
Send(m_szMsgBuf,m_nMsgLength);
memset(m_szMsgBuf,0,sizeof(m_szMsgBuf));
bRead=TRUE;
bWrite=!bRead;
AsyncSelect(FD_READ);

CAsyncSocket::OnSend(nErrorCode);
}
看看,什么错误?
zhaoyao73 2001-08-23
  • 打赏
  • 举报
回复
我:
connect(smtp263.net,25)
s:220 smtp.263.net esmtp
c:helo
s:250 ok
c:auth login
发过auth login后服务器没有响应,就傻等在那
zhaoyao73 2001-08-23
  • 打赏
  • 举报
回复
再推一下?高手们
aaachii 2001-08-22
  • 打赏
  • 举报
回复
helo之后,发送"auth login"命令,检查返回值,如果返回334xxxxx就是需要验证,否则直接发mail from就行了

具体的过程:send(s) received(r)
s:auth login
r:334VXNlcm5hbWU6(username:)
s:(把你的用户名转换成base64码后输入)
r:334UGFzc3dvcmQ6(password:)
s:(把你的密码转换成base64码后输入)
zhaoyao73 2001-08-22
  • 打赏
  • 举报
回复
发HELO,怎样进行esmtp验证?请指教
aaachii 2001-08-21
  • 打赏
  • 举报
回复
502. Command not implemented

我连结263发HELO是成功的,没试过发ehlo
111222 2001-08-21
  • 打赏
  • 举报
回复
ehlo?应该是HELO吧
zhaoyao73 2001-08-21
  • 打赏
  • 举报
回复
UP
zhaoyao73 2001-08-21
  • 打赏
  • 举报
回复
我推一下

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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